概念
JAVA使用keystore文件來存儲所有KEY,keystore文件可以存放多個KEY,訪問它需要密碼。
下面我介紹下如何將用OpenSSL做自簽名的證書一文中介紹的OpenSSL產生的KEY與JAVA的KEY轉換后使用,從而達到JAVA與OpenSSL通信的目的。
用OpenSSL生成CA根證書,即(P1,V1)
此步驟參見用OpenSSL做自簽名的證書一文
在JAVA環境下生成自己的KEY,即(P2,V2)
keytool -genkey -alias clientapp -keystore mycerts
注意:這里會提示輸入訪問keystore的密碼,以及組織、城市、省份,一定要與CA根證書的一致,否則不能被CA簽名。
從keystore中導出public key,即P2
keytool -keystore mycerts -certreq -alias clientapp -file clientapp.crs
用CA根證書為這個public key進行簽名,即用V1給P2加密
openssl ca -out clientapp.pem -config ./openssl.cnf -infiles?clientapp.crs
?
轉換PEM到DER格式
openssl x509 -in clientapp.pem -out clientapp.der -outform DER
導入CA證書,即P1
keytool -keystore mycerts -alias systemca -import -file cacert.pem
導入用戶證書,即被V1加密過的P2
keytool -keystore mycerts -alias clientapp -import -file clientapp.der
注意:這里一定要先導入CA證書再導入用戶證書,否則會報錯。
現在我們就生成了JAVA服務器使用的所有KEY了,在程序中將mycerts這個keystore導入就可以了。
如果客戶端是使用OpenSSL的程序,那么用CA證書cacert.pem就能正常通信了,如果也是JAVA程序,那么我們需要將CA證書也轉換成keystore:
keytool -import -keystore clikeystore -import -trustcacerts -file cacert.pem
生成的clikeystore供JAVA客戶端使用,就能通信。
再附上SVR和CLI的JAVA程序,我已經用上面的KEY都測試通過:
SVR端:





























































































































































CLI端程序:






































































































以上方法主要參考了如下兩個網頁:
http://www.churchillobjects.com/c/11201g.html
http://mark.foster.cc/kb/openssl-keytool.html