java的keytool工具本来就可以生成交互式认证的证书, 不过其他语言处理交互式认证的流程貌似和java的keytool的认证流程有些差别, 而openssl是比较通用的工具。大部分语言都会支持openssl生成的证书文件。用openssl签发的证书如何才能转化为keytool的jks文件呢, 就需要用到 ImportKey.java 文件的源码来处理了。
- CAserial 指明序列号文件,而 - CAcreateserial 指明文件不存在时自动生成
所有证书的Common Name 也就是CN不能重复----------------------------------START--------------------------------
CA根证书
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=ABC" -days 36500 -out ca.crt
openssl pkcs12 -export -clcerts -in ./ca.crt -inkey ca.key -out ca.p12
服务器端:
openssl genrsa -out Xserver.key 2048
openssl req -new -key Xserver.key -subj "/CN=DEF" -out Xserver.csr
openssl x509 -req -days 36500 -in Xserver.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out Xserver.crt
cp Xserver.key Xserver.key.pem
cp Xserver.crt Xserver.crt.pem
openssl pkcs8 -topk8 -nocrypt -in Xserver.key.pem -inform PEM -out Xserver.key.der -outform DER
openssl x509 -in Xserver.crt.pem -inform PEM -out Xserver.crt.der -outform DER
生成 jks文件给java程序使用
java -jar OpenSSL2JKS.jar Xserver.key.der Xserver.crt.der 123456 ./server.keystore server_jks
创建信任列表
keytool -import -v -alias rootca -keystore ./serverTrust.jks -storepass 123456 -trustcacerts -file ./ca.crt
keytool -import -v -alias server -keystore ./serverTrust.jks -storepass 123456 -trustcacerts -file ./client.services-ca.pem
生成浏览器证书
openssl genrsa -out XBrowser.key 2048
openssl req -new -key XBrowser.key -subj "/CN=XXX" -out XBrowser.csr
openssl x509 -req -days 36500 -in XBrowser.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out XBrowser.crt
把浏览器证书转化为PKCS12格式
openssl pkcs12 -export -clcerts -in ./XBrowser.crt -inkey XBrowser.key -out XBrowser.p12
用openssl自带的工具进行测试
openssl s_client -connect www.tesladevel.com:9999 -cert ./XBrowser.crt -key ./XBrowser.key -tls1 -CAfile ./ca.crt -state -showcerts
------------------------------------------END--------------------------------------------------
上面用到的 OpenSSL2JKS.jar , 其实是 ImportKey.java 文件 ,
下载地址如下:
www.agentbob.info/agentbob/80/version/default/part/AttachmentData/data/ImportKey.java
我把这个文件的源码贴出来: