为何Java的keytool读取openssl生成的PKCS12信任库时显示无条目
问题原因
Java的keytool对PKCS12格式密钥库中的信任证书条目有专属识别规则:你通过openssl pkcs12 -export -nokeys生成的仅含公钥证书的p12文件,没有给证书袋设置对应别名(friendlyName)属性,keytool会默认忽略没有标识的纯公钥证书袋,因此返回0条目。
而你加私钥时能正常识别,是因为privateKeyEntry类型的条目默认会关联证书属性,keytool可以直接读取识别。
解决方案
有两种可行方式解决该问题:
方式一:修改openssl生成命令,补充别名参数
在生成PKCS12信任库的命令中添加-name参数,给证书设置自定义别名,keytool就可以正常识别该可信证书条目:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj "/C=US/ST=Oregon/L=Portland/O=Company Name/OU=Org/CN=www.example.com" -sha256 # 新增 -name 参数设置证书别名 openssl pkcs12 -export -out truststore.p12 -nokeys -in cert.pem -name "example-root-ca"
方式二:直接用keytool生成适配Java的PKCS12信任库
直接使用keytool导入公钥证书生成信任库,天然适配Java生态的识别规则:
keytool -importcert -file cert.pem -alias example-root-ca -keystore truststore.p12 -storepass changeit -storetype PKCS12 -noprompt
操作完成后再执行keytool -list -v -keystore truststore.p12 -storepass changeit -storetype PKCS12验证,就能看到1条类型为trustedCertEntry的条目,Java应用通过-Djavax.net.ssl.trustStore参数加载该信任库也会正常生效。
内容的提问来源于stack exchange,提问作者heez
相关产品推荐
相关产品推荐

