没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
一、 在做 开发时,要注意的是 端与服务器端的
类型是不一致的:如如下代码:
, 在
中代码默认拿到的是 的 类型所以需要
相应的工具转换:资料如下
Android SDK 在进行 https 联机时,对于自签署的凭证是会拒绝联机的,会
得到 Not trusted server certicate 的例外。如果使用
HttpsURLConnection 来联机,网络上可以找到一些破解方法,在此不多谈。
使用 apache httpclient 其实执行效率比较差一点,但是他最大的好处就是有
内建的机制储存 cookie,并且也可以跟随 server 作自动转址。网络上数据比
较多的是 httpclient 3.x 版,Android 使用 httpclient 4 (而且还有些实作被
拿掉) 唯一找到比较可信的来源是 apache httpclient 官方的 example。节
录重点段落如下:
1. KeyStore&trustStore&&=&KeyStore.getInstance(KeyStore.getDef
aultType());&&
2. FileInputStream&instream&=&new&FileInputStream(new&File("my
.keystore"));&&
3. try&{&&
4. &&&&trustStore.load(instream,&"nopassword".toCharArray());&&
5. }&nally&{&&
6. &&&&instream.close();&&
7. }&&
8. &&
9. SSLSocketFactory&socketFactory&=&new&SSLSocketFactory(trus
tStore);&&
10. Scheme&sch&=&new&Scheme("https",&socketFactory,&443);&&
11. httpclient.getConnectionManager().getSchemeRegistry().regi
ster(sch);&&
1. KeyStore&trustStore&&=&KeyStore.getInstance(KeyStore.getDef
aultType());&&
2. FileInputStream&instream&=&new&FileInputStream(new&File("my
.keystore"));&&
3. try&{&&
4. &&&&trustStore.load(instream,&"nopassword".toCharArray());&&
5. }&nally&{&&
6. &&&&instream.close();&&
7. }&&
8. &&
9. SSLSocketFactory&socketFactory&=&new&SSLSocketFactory(trus
tStore);&&
10. Scheme&sch&=&new&Scheme("https",&socketFactory,&443);&&
11. httpclient.getConnectionManager().getSchemeRegistry().regi
ster(sch);&&
直接把这段拿去用当然只有一个死字。本来看讨论以为是要制造一个假的空凭
证骗过 httpclient,从 Android 文件系统有点微妙开始改来改去,一连串不同
的例外或直接 crash 就不多谈了。解决了档案路径,到底有没有建立等等方面
的问题之后才终于发现,假凭证是不 行的…
1. 所以首先,开启你 PC 或 Mac 上的浏览器连上目标网站,从凭证管理的地方
把该网站的凭证汇出。每个浏览器做法都不同,请各位发挥正常工程师的水平
做完这件 事。以 Firefox 为例,找到 site 名后选汇出,多半是会得到一个档名
为 your_site_name.crt 的 X509(PEM) 凭证档。为了之后使用方便,先把这
档案复制一份并把档名改为 your_site_name.pem。
2. 将这个凭证格式从 PEM 转为 BKS 格式。 这是关键性的一步啊。
1. KeyStore&trustStore&&=&KeyStore.getInstance(KeyStore.getDef
aultType());&&
1. KeyStore&trustStore&&=&KeyStore.getInstance(KeyStore.getDef
aultType());&&
这行中的 getDefaultType 到底会 get 到什么 type 呢?答案:在 Android
中是 BKS。有 J2ME 经验的人会想说,我看多半是跟 J2ME 一样的 Sun JKS
格式吧,而且,我不要用 getDefaultType 就好了,我可以自己指定为 PEM,
JKS 格式啊。是的,你可以。只是你会得到错误讯息说 KeyStore JKS
implementation not found。测了半天,看起来 Android 的 httpclient 只
吃 BKS 就对了,其他都没实作。
3. 那格式要怎么转?根据网络上找到的数据,可以使用 KeyTool IUI 这个
Java 工具。打开后从接口选 create → KeyStore,格式选 BKS,自己命名
一下,要不要设密码都可。接着选 import → Keystore’s entry → Trusted
certicate → Regular certicate。 Source 的部分选 PEM 并选到刚刚浏览
器得到的那个档,Target 当然选 BKS 和刚 create 出来的档。按 OK 之后会
跳出 Entries 窗口,下方提示你 enter new alias,随便取个名字后 ok 连打,
顺利的话你应该就会有一个 your_keystore.bks 之类的档案了。
4. 要把凭证档放在 Android app 能读到的地方,做法有两种,放在 SD card
中,或直接放在 resources 中。
[方案一] 放在 SD card 的情形:首先仿真器要挂上 SD card,这在 Eclipse
用 AVD 工具产生 avd 时就可以顺便指定 SD 了。如果习惯用指令的话,也可
以用如下指令产生 image 并 mount 上:
$ mksdcard 512M my_sdcard.so
$ emulator -sdcard ./my_sdcard.so
再来要把凭证档 copy 到 SD card 中,目前只知道指令的做法:
$ adb push le_path/your_keystore.bks /sdcard
如果有显示类似 ftp 传输速度之类的讯息应该就是成功了。
接着把 android 程序代码中档案部分改一改
view plain copy to clipboard print ?
1. FileInputStream&instream&=&new&FileInputStream(new&File("/
sdcard/your_keystore.bks"));&&
2. ...&&
3. &&&&trustStore.load(instream,&null);&&
view plain copy to clipboard print ?
1. FileInputStream&instream&=&new&FileInputStream(new&File("/
sdcard/your_keystore.bks"));&&
2. ...&&
3. &&&&trustStore.load(instream,&null);&&
如果没设密码,可以把 keystore load 的第二个密码参数改成 null,有设的话
当然就把 “nopassword” 改成你的密码。
基本上这样应该就大功告成了。
[方案二] 再讲讲凭证放在 resources 的方法。首先把档案复制到项目下的
res/raw/your_keystore.bks 。Eclipse 没有错误的话就 ok,否则多半是你
文件名不合规格,稍微改改。接着取用方法是把 android 程序代码改成:
1. InputStream&instream&=&getResources().openRawResource(R.r
aw.your_keystore);&&
1. InputStream&instream&=&getResources().openRawResource(R.r
aw.your_keystore);&&
其它同 SD card。
5. 还有一个地方要注意,就是 SSL port。
view plain copy to clipboard print ?
1. Scheme&sch&=&new&Scheme("https",&socketFactory,&443);&&
view plain copy to clipboard print ?
1. Scheme&sch&=&new&Scheme("https",&socketFactory,&443);&&
如果你要连的网站不是用 port 443,这边请记得改掉。
6. 另外如果要使用档案放在 resources 的做法,getResources() 应该只能
在 Activity class 中执行,如果另外包装联机类别的话请不要直接服用上面的
程序代码,要自行从 context 抓到资源再传过去。
在生成 SSL keystore 时,注意 CN 也就是需要填写资料的第一项 颁发者或授
权者或姓氏这一项,请填写域名或正式 IP
生成一般命令:
1、用 JDK 的 keytool 生成密钥 store
&&& keytool -genkey -alias mykey -keystore srvstore
&&& 输入密码(程序中密码为‘123456’)和相应的证书信息
&&& 2、从 srvstore 中导出证书
剩余21页未读,继续阅读
gudeqiang24
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页