天天看點

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,如需轉載請自行聯系原作者

繼續閱讀