如何从X509证书生成双向SSL的Java Keystore与Truststore
用keytool生成双向SSL所需的Keystore与Truststore
前提说明
你已经通过OpenSSL生成了以下文件:
- 根CA:
cacert.crt(证书)、root_key.pem(私钥) - 客户端:
client_cert.crt(证书)、client_key.pem(私钥) - 服务端:
server_cert.crt(证书)、server_key.pem(私钥)
所有客户端/服务端证书均由根CA签名。
核心概念
- Keystore:存储自身的证书和私钥,用于SSL握手时向对方证明身份。
- Truststore:存储需要信任的证书(或CA证书),用于验证对方的身份。
一、生成服务端的Keystore与Truststore
1. 创建服务端Keystore
keytool无法直接导入PEM格式的私钥,需先通过OpenSSL将服务端私钥+证书转换为PKCS12格式,再导入JKS(或直接使用PKCS12作为Keystore):
步骤1:转换为PKCS12文件
openssl pkcs12 -export -in server_cert.crt -inkey server_key.pem -out server.p12 -name server-alias
执行时需设置PKCS12文件的密码(后续操作会用到)。
步骤2:转换为JKS格式(可选,若直接用PKCS12可跳过)
keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -destkeystore server.jks -deststoretype JKS
输入源PKCS12的密码,再设置JKS文件的密码。
2. 创建服务端Truststore
双向SSL中,服务端需要验证客户端身份,按你的需求导入客户端证书:
keytool -import -alias client-cert -file client_cert.crt -keystore server-truststore.jks
- 设置Truststore的密码
- 提示是否信任该证书时,输入
yes确认
补充优化:更规范的做法是导入根CA证书到Truststore,而非单个客户端证书。这样所有由根CA签名的客户端证书都能被服务端信任,适合多客户端场景:
keytool -import -alias root-ca -file cacert.crt -keystore server-truststore.jks
二、生成客户端的Keystore与Truststore
1. 创建客户端Keystore
同服务端步骤,先转换客户端私钥+证书为PKCS12:
步骤1:转换为PKCS12文件
openssl pkcs12 -export -in client_cert.crt -inkey client_key.pem -out client.p12 -name client-alias
设置PKCS12文件密码。
步骤2:转换为JKS格式(可选)
keytool -importkeystore -srckeystore client.p12 -srcstoretype PKCS12 -destkeystore client.jks -deststoretype JKS
输入源密码和目标JKS密码。
2. 创建客户端Truststore
客户端需要验证服务端身份,按你的需求导入服务端证书:
keytool -import -alias server-cert -file server_cert.crt -keystore client-truststore.jks
- 设置Truststore密码
- 提示信任时输入
yes
补充优化:同样推荐导入根CA证书,这样所有由根CA签名的服务端证书都能被客户端信任:
keytool -import -alias root-ca -file cacert.crt -keystore client-truststore.jks
内容的提问来源于stack exchange,提问作者Anas
相关产品推荐
相关产品推荐

