android 雙向ssl通信(1)證書流程

自己生成的一套可以使用的證書,用於android下面的雙向ssl通信


Socket分爲服務端和客戶端。由於是雙向ssl通信,我們需要在服務端和客戶端建立密鑰庫來保存密鑰和證書。我們先從服務端開始:

服務端我們採用java默認的密鑰庫JKS類型,首先我們利用keytool工具切換到工程所在目錄的子目錄src文件夾下面,然後我們創建一個密鑰對,語句如下:

keytool -genkey -dname "cn=yxt,ou=R&D center,o=sunyard,c=CN"-alias skks -keypass sunyard -keystore skks.jks -storepass sunyard -validity360 -keyalg RSA -keysize 1024 –v

這個語句創建了一個密鑰庫skks.jks,其中包含了一個密鑰對skks(別名)。

創建好密鑰對之後我們將用這個密鑰對產生的證書導出:

keytool –exportcert –alias skks –keytore skks.jks –file skks.crt –storepasssunyard –v

這個語句從skks.jks中導出了一個名爲skks.crt的證書。

這個證書我們將導入到客戶端的受信任證書密鑰庫中去,同樣的服務器端也需要一個受信任證書密鑰庫:

keytool –importcert –alias ckks –keystore stks.jks –file ckks.crt –storepasssunyard –v

這個語句是將客戶端導出來的證書ckks.crt導入到stks.jks中去。這個ckks.crt待會會講到。

3步之後服務器端就可以利用SSLSocket來初始化一個ssl的通信了。

 

客戶端也類似,不過由於客戶端是android只支持BKS類型的密鑰庫,而java本身不支持BKS類型密鑰庫,所以我們需要手動的加上這個庫,使java的keytool能夠使用BKS:

將這個bcprov-jdk16-145.jar包放在%JAVA_HOME%的jre/lib/etx文件夾下,然後在%JAVA_HOME%的jre/lib/security/java.security  文件中的列表中添加一條

security.provider.??=org.bouncycastle.jce.provider.BouncyCastleProvider

??表示序號,就跟在原列表的後面就行。配置好以後,就可以使用keytool來生成BKS類型的密鑰庫了

    開始寫客戶端:類似的我們先創建一個密鑰對

keytool -genkey -dname "cn=yxt,ou=R&Dcenter,o=sunyard,c=CN" -alias ckks -keypass sunyard -keystore ckks.bks-storepass sunyard -validity 360 -keyalg RSA -keysize 1024 –v -storetype BKS-provider org.bouncycastle.jce.provider.BouncyCastleProvider

這裏注意需要加上storetype和provider類型,provider就是上面配置時添加的內容。

這個語句創建了一個名爲ckks.bks 裏面包含了一個ckks的密鑰對,接下來導出這個密鑰對生成的證書:

keytool –exportcert –alias ckks –keytore ckks.jks –file ckks.crt–storepass sunyard –v -storetype BKS -providerorg.bouncycastle.jce.provider.BouncyCastleProvider

這個ckks.crt的證書就是上面服務器中需要用到的證書。接着把skks.crt導入到信任密鑰庫中去:

keytool –importcert –alias skks –keystore ctks.jks –file skks.crt–storepass sunyard –v -storetype BKS -providerorg.bouncycastle.jce.provider.BouncyCastleProvider

之後可以把兩個密鑰庫放在android工程下面,由android工程來調用和判斷了。

發佈了28 篇原創文章 · 獲贊 4 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章