天天看点

Android 使用httpclient对self-signed certificate网站进行SSL连线

直接把这段拿去用当然只有一个死字。本来看讨论以为是要制造一个假的空凭证骗过 httpclient,从 Android 档案系统有点微妙开始改来改去,一连串不同的例外或直接crash就不多谈了。解决了档案路径,到底有没有建立等等方面的问题之后才终于发现,假凭证是不行的…

1. 所以首先,开启你PC或Mac上的浏览器连上目标网站,从凭证管理的地方把该网站的凭证汇出。每个浏览器做法都不同,请各位发挥正常工程师的水准做完这件事。以Firefox为例,找到site名后选汇出,多半是会得到一个档名为 your_site_name.crt 的 X509(PEM) 凭证档。为了之后使用方便,先把这档案复制一份并把档名改为 your_site_name.pem。

2. 将这个凭证格式从 PEM 转为 BKS 格式。 这是关键性的一步啊。

这行中的 getDefaultType 到底会get到什么type 呢?答案:在 Android 中是 BKS。有 J2ME 经验的人会想说,我看多半是跟J2ME 一样的 Sun JKS 格式吧,而且,我不要用 getDefaultType 就好了,我可以自己指定为 PEM, JKS格式啊。是的,你可以。只是你会得到错误讯息说 KeyStore JKS implementation not found。测了半天,看起来 Android 的 httpclient 只吃 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 file_path/your_keystore.bks /sdcard

如果有显示类似 ftp 传输速度之类的讯息应该就是成功了。

接着把 android 程式码中档案部分改一改

如果没设密码,可以把 keystore load 的第二个密码参数改成 null,有设的话当然就改成你的密码。

基本上这样应该就大功告成了

[方案二] 再讲讲凭证放在 resources 的方法。

首先把档案复制到专案下的 res/raw/your_keystore.bks 。

Eclipse 没有错误的话就 ok,否则多半是你档名不合规格,稍微改改。接着取用方法是把 android 程式码改成:

其它同SD card。

5. 还有一个地方要注意,就是 SSL port。

Scheme sch = new Scheme("https", socketFactory, 443);

如果你要连的网站不是用 port 443,这边请记得改掉。

6. 另外如果要使用档案放在 resources 的做法,getResources() 应该只能在 Activity class 中执行,如果另外包装连线类别的话请不要直接服用上面的程式码,要自行从 context 抓到资源再传过去。

     本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230809,如需转载请自行联系原作者

继续阅读