1.生成CA私钥
openssl genrsa -out ca-key.pem 2048
2.根据私钥生成证书请求文件(csr)
openssl req -new -out ca-req.csr -key ca-key.pem
3.用CA私钥进行自签名的证书
openssl x509 -req -in ca-req.csr -out ca-cert.pem -signkey ca-key.pem -days 365
上述步骤生成的证书,可用作根证书对其它证书进行签名
1.创建私钥
keytool -genkey -alias myserver -validity 365 -keyalg RSA -keysize 2048 -keypass changeit -storepass changeit -dname "cn=localhost, ou=MyGroup, o=MyCompany, l=Beijing, st=Beijing, c=CN" -keystore server.keystore
2.根据私钥生成证书请求文件(csr)
keytool -certreq -alias myserver -sigalg MD5withRSA -file server.csr -keypass changeit -keystore server.keystore -storepass changeit
3.使用openssl作为ca对java产生的csr进行签名
openssl x509 -req -in server.csr -out server-cert.pem -CA ca-cert.pem -CAkey ca-key.pem -days 365 -CAcreateserial
4.导入信任的openssl的CA根证书到JDK的Root信任库
将CA根证书添加到JDK的信任库后,经过此CA根证书签名的服务器证书server-cert.pem才能找到合法的证书链,否则在签名过的证书导回到keystore时会出现证书链错误。
keytool -import -v -trustcacerts -storepass changeit -alias root -file ca-cert.pem -keystore ${JAVA_HOME}/jre/lib/security/cacerts
注:如果服务器启动文件中不配置-Djavax.net.ssl.trustStore,默认信任库文件会从${JAVA_HOME}/jre/lib/security/cacerts中查找;
5.把CA签名后的服务器证书导回keystore
keytool -import -v -trustcacerts -storepass changeit -alias myserver -file server-cert.pem -keystore server.keystore
到这里,服务器端的证书和签名就完成了!
PS:如果不经过CA的签名,java默认生成的自签名证书也是可以用的,而且也可以到处客户端需要的p12证书。
方式一:使用openssl
1.生成客户端私钥
openssl genrsa -out client-key.pem 2048
2.根据客户端私钥生成客户端证书请求文件(csr)
openssl req -new -out client-req.csr -key client-key.pem
3.使用可信CA的私钥进行签名(该CA无需和服务器CA一致)
openssl x509 -req -in client-req.csr -out client.crt -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 365
4.生成client端的个人证书
openssl pkcs12 -export -clcerts -in client.crt -inkey client-key.pem -out client.p12
方式二:直接从密钥库导出(建议用作测试)
使用keytool工具直接导出p12格式的证书。
"Internet选项"--- "导入"。将ca-cert.pem重命名为ca-cert.cer然后导入。ca-cert.cer是CA根证书,导入后使其成为客户信任的CA。
双击client.p12文件,导入client.p12,client.p12是PKCS12格式的个人证书。IE能够识别证书类型并根据类型确定证书存储位置。
PS:双方双向SSL通信,需要设置互相信任!!!