項目要用到,這兩天調查了一下這方面的知識。時間不多,簡單給大家匯總一下,方便生疏的朋友快點上手,縮短到搜尋引擎的大海裡面撈寶的過程。
除了Android開發環境之外,還要準備好tomcat,我用的6.0,其他版本應該也差不多。
整體的步驟就是 1. 用keystore產生伺服器端所用的密鑰,用它設定管理員 2.用戶端匯入其中的公開金鑰,將其添加到信任的認證庫中。下面是具體的參考資料。
1.密碼學基礎(像我這樣非科班出身的需要看一下,知其然還得知其所以然)
http://www.williamlong.info/archives/499.html
2.keytool使用與tomcat配置
英文好的朋友請直接看tomcat文檔,SSL部分;
英文不好的朋友請尋找中文版文檔,或者看這篇文章:
http://www.cn-java.com/www1/?action-viewnews-itemid-3555
注意:這篇文章比較老,具體的配置寫法不能照搬,只是參考其步驟。具體的配置請找你的tomcat文檔,SSL部分。
3.android配置
如果不需要驗證伺服器端認證,直接照這裡做
http://elsila.blog.163.com/blog/static/17319715820101128832427/
如果需要驗證伺服器端認證(這樣能夠防網路釣魚),我是這樣做的,還有些問題問大牛:
a. 匯出公開金鑰。在瀏覽器上用https訪問tomcat,查看其認證,並另存新檔一個檔案(存成了X.509格式:xxxx.cer)
b. 匯入公開金鑰。把xxxx.cer放在Android的assets檔案夾中,以方便在運行時通過代碼讀取此認證,留了兩個問題給大牛:
- AssetManager am = context.getAssets();
- InputStream ins = am.open("robusoft.cer");
- try {
- //讀取認證
- CertificateFactory cerFactory = CertificateFactory.getInstance("X.509"); //問1
- Certificate cer = cerFactory.generateCertificate(ins);
- //建立一個認證庫,並將認證匯入認證庫
- KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC"); //問2
- keyStore.load(null, null);
- keyStore.setCertificateEntry("trust", cer);
- return keyStore;
- } finally {
- ins.close();
- }
- //把咱的認證庫作為信任認證庫
- SSLSocketFactory socketFactory = new SSLSocketFactory(keystore);
- Scheme sch = new Scheme("https", socketFactory, 443);
- //完工
- HttpClient mHttpClient = new DefaultHttpClient();
- mHttpClient.getConnectionManager().getSchemeRegistry().register(sch);
複製代碼
問1:這裡用"PKCS12"不行
問2:這裡用"JKS"不行。
其實我就是不知道這兩處到底該寫那幾個字元,其中貌似涉及了專利什麼的,不太清楚了。我也試過把認證導成其他格式,試了很久,這是第一條通的路。
感謝樓主解決了我一個很麻煩的問題,就是如何在httpclient中匯入信任認證,我也回答一下樓主的兩個問題,
問1:PKCS12和JKS是keystore的type,不是Certificate的type,所以X.509不能用PKCS12代替
問2:android平台上支援的keystore type好像只有PKCS12,不支援JKS,所以不能用JKS代替在PKCS12,不過在windows平台上是可以代替的
希望對大家有協助! |