在上一篇部落格中,說到SSL的第一步就是要建立認證。(或者向第三方購買)
PS:最終上線的產品,認證會是向第三方認證機構購買的,但在開發過程中,是自己建立的。
建立認證的常用工具是keytool,這個是jdk內建的工具,只要電腦上裝了jdk(並且環境變數裡配置好了)就可以使用。
linux系統不能用keytool,要用openssl。
本篇所列的命令為keytool命令。
首先,列出參考文章:
1、建立認證過程參考:
http://wenku.baidu.com/link?url=uWTSct_uZYrcbG0RPpWTZ4Lmhz177Uv4xlMyBw6554YkzCG00GmKDscP36LSFDb3vdhpq2EW4VHUUzkyLjQdmepZbBpp29QxsAYzmRfJe9O
http://www.blogjava.net/icewee/archive/2012/06/04/379947.html
http://czj4451.iteye.com/blog/1487684
2、keytool命令解釋參考:
http://blog.csdn.net/ygc87/article/details/7620942
http://www.cnblogs.com/benio/archive/2010/09/15/1826990.html(非常詳細)
下面,簡單介紹幾個常用命令的說明:
keytool常用命令
-alias 產生別名
-keystore 指定密鑰庫的名稱(就像資料庫一樣的認證庫,可以有很多個認證,cacerts這個檔案是jre內建的,
你也可以使用其它檔案名稱字,如果沒有這個檔案名稱字,它會建立這樣一個)
-storepass 指定密鑰庫的密碼
-keypass 指定別名條目的密碼
-list 顯示密鑰庫中的認證資訊
-v 顯示密鑰庫中的認證詳細資料
-export 將別名指定的認證匯出到檔案
-file 參數指定匯出到檔案的檔案名稱
-delete 刪除密鑰庫中某條目
-import 將已簽名數位憑證匯入密鑰庫
-keypasswd 修改密鑰庫中指定條目口令
-dname 指定認證擁有者資訊
-keyalg 指定密鑰的演算法
-validity 指定建立的認證有效期間多少天
-keysize 指定密鑰長度
接下來,進入本文的重點——keytool命令建立ssl認證:
PS:僅僅用下面的命令建立bks是不能成功的,因為缺少一個bks支援的jar,具體的解決辦法可以百度一下,網上很多。很簡單,就是下載一個jar放到jdk的兩個目錄下,然後修改對於的兩個設定檔就好了。
一、單向驗證成功: 1、生產伺服器端認證:
keytool -validity 365 -genkey -v -alias server -keyalg RSA -keystore D:\ssl\bks\server.jks -dname "CN=10.100.100.24,OU=test,O=test,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456
2、匯出認證
keytool -exportcert -v -alias server -keystore D:\ssl\bks\server.jks -storepass 123456 -rfc -file D:\ssl\bks\server.cert
3、生產Android可用的用戶端認證
keytool -importcert -keystore D:\ssl\bks\client.bks -file D:\ssl\bks\server.cert -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass 123456
PS:ios單項驗證不需要認證
二、同一個server,兩份不同的client認證(一份bks,Android用的,一份是jks,ios用的),雙向認證成功:
1、建立server端認證:
keytool -validity 365 -genkey -v -alias server -keyalg RSA -keystore D:\ssl\server.keystore -dname "CN=10.100.100.24,OU=test,O=test,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456
2、建立Android用戶端認證:(雙向(Android)驗證成功)
最終要給用戶端用的認證是:client-bks-trust.bks、client-bks.bks
keytool -validity 365 -genkeypair -v -alias client-bks -keyalg RSA -storetype BKS -keystore D:\ssl\client-bks.bks -dname "CN=client,OU=test,O=test,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456
keytool -export -v -alias client-bks -keystore D:\ssl\client-bks.bks -storetype BKS -storepass 123456 -rfc -file D:\ssl\client-bks.crt
keytool -export -v -alias server -keystore D:\ssl\server.keystore -storepass 123456 -rfc -file D:\ssl\server.crt
keytool -importcert -keystore D:\ssl\client-bks-trust.bks -file D:\ssl\server.crt -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass 123456
keytool -import -v -alias client-bks -file D:\ssl\client-bks.crt -keystore D:\ssl\server.keystore -storepass 123456
3、建立ios用戶端認證(ios:雙向驗證成功)
最終發給ios用戶端的認證是:client-ios.truststore(該格式也可以為.p12,但此處的檔案與下面第一行產生的client-ios.p12檔案是不同的檔案)
keytool -validity 365 -genkeypair -v -alias client-ios -keyalg RSA -storetype PKCS12 -keystore D:\ssl\client-ios.p12 -dname "CN=client-ios,OU=test,O=test,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456
keytool -export -v -alias client-ios -keystore D:\ssl\client-ios.p12 -storetype PKCS12 -storepass 123456 -rfc -file D:\ssl\client-ios.cer -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass 123456
keytool -export -v -alias server -keystore D:\ssl\server.keystore -storepass 123456 -rfc -file D:\ssl\server-ios.cer
keytool -import -v -alias server -file D:\ssl\server-ios.cer -keystore D:\ssl\client-ios.truststore -storepass 123456
keytool -import -v -alias client-ios -file D:\ssl\client-ios.cer -keystore D:\ssl\server.keystore -storepass 123456
三、(也可以用java代碼測試)
ios-jks:雙向成功
keytool -validity 365 -genkey -v -alias server -keyalg RSA -keystore D:\ssl\ios-jks\server.keystore -dname "CN=10.100.100.24,OU=test,O=test,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456
keytool -validity 365 -genkeypair -v -alias client -keyalg RSA -storetype PKCS12 -keystore D:\ssl\ios-jks\client.p12 -dname "CN=client,OU=test,O=test,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456
keytool -export -v -alias client -keystore D:\ssl\ios-jks\client.p12 -storetype PKCS12 -storepass 123456 -rfc -file D:\ssl\ios-jks\client.cer -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass 123456
keytool -export -v -alias server -keystore D:\ssl\ios-jks\server.keystore -storepass 123456 -rfc -file D:\ssl\ios-jks\server.cer
keytool -import -v -alias server -file D:\ssl\ios-jks\server.cer -keystore D:\ssl\ios-jks\client.truststore -storepass 123456
keytool -import -v -alias client -file D:\ssl\ios-jks\client.cer -keystore D:\ssl\ios-jks\server.keystore -storepass 123456