Android 4.0以上引用apapche httpclient且使用自我認證憑證相關細節

Httpclient方面:
  1. 當在run的時候出現「Source Attachment Does Not Contain DefaultRequestDirector.class Android」的訊息時,是因缺乏HttpComponents的source code,這時就要去下載放在SDK\source\target version\org\apache,這樣就可以避免同樣的錯誤,但其實可以完全忽略,因為如果你只是要用那個class,根本就不需要進到裡頭去看code。
  2. 至於剛剛那個問題的根本原因是在於「android.os.NetworkOnMainThreadException」,簡單說就是4.0以上有動到網路,會要求進到tread或AsyncTask來處理,參考以下
    • http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html
    •  http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception
    • http://www.compiletimeerror.com/2013/01/why-and-how-to-use-asynctask.html#.UjL1wRBCh24
    • http://examples.javacodegeeks.com/android/core/os/asynctask/android-asynctask-example/
    • http://andcooker.blogspot.tw/2012/08/android-asynctask.html
  3.  
SSL部分:
  1.  在建憑證時的common name一項,記得要打網址的域名
  2. android對apache http的實作中,對於SSL部分大部分的人都說是BKS,不過那是很久以前了,不知最近是否有變
  3. 參考以下
    • http://blog.aztaru.com/2009/12/11/%E7%AD%86%E8%A8%98-android-%E4%BD%BF%E7%94%A8httpclient%E5%B0%8Dself-signed-certificate%E7%B6%B2%E7%AB%99%E9%80%B2%E8%A1%8Cssl%E9%80%A3%E7%B7%9A/

網頁伺服器的部分:
個人測試上面的方式在android 4.0(*後來完成的程式到1.6都可以)一樣可以運作,但我在執行過程中,遇到一個怪狀況,就是我是用Nginx建一台反向代理的機器,然後憑證是塞在這台反向代理中,一開始為了測試所以找了一個不對外使用的域名建憑證,之後加解密一切正常。
但後來又加了另一組域名的憑證後,就踢到鐵板,一直得到「SSLPeerUnverifiedException」的錯誤,不管再重做幾次都一樣,也改用jdk的keytool下去重做,也是一樣。
最後在找資料的過程中,發現在測試網站憑證的方式中,有呼叫openssl的工具來測的,我也一樣照做,結果發現它只會看到最早建的那個憑證,看不到後來建的那個新域名的憑證,直到我把第一個刪了,NGINX只留後來那一個時,才看到。
這時再回到android上,就可以正常了,可是明明firefox、chrome和IE都可以同時取用不同域名的憑證都是可以運作的啊!為何android就是不行,或許有哪個功能沒實作到吧!總之被這問題搞三天有....@@||



參考資料:
  1. apache的HttpComponents Downloads:http://hc.apache.org/downloads.cgi

留言

熱門文章