OpenSSL 3.0.0与1.1.1兼容性问题:生成PKCS12无法被Java keytool识别
问题根本原因
OpenSSL 3.0 调整了 PKCS12 格式文件的默认加密配置,和旧版本生态存在兼容性问题:
- OpenSSL 1.1.1 及更早版本生成PKCS12时,默认使用 pbeWithSHA1And40BitRC2-CBC 加密证书条目、SHA1做MAC校验,这类弱加密算法在旧版Java、Windows原生证书组件中都默认支持
- OpenSSL 3.0 为了提升安全性,默认改用了更高安全等级的加密算法(比如AES-256-CBC加密条目、SHA-256做MAC校验),你使用的OpenJDK 11.0.2属于较早的Java 11版本,原生不支持OpenSSL 3.0的默认PKCS12加密配置,因此会误报密码错误;同时OpenSSL 3.0默认禁用了RC2这类弱算法,所以无法直接读取1.1.1生成的p12文件。
OpenSSL 3.0 兼容方案
生成适配旧Java/Windows的PKCS12文件
执行openssl pkcs12 -export命令时,额外指定加密算法参数,对齐1.1.1的默认配置即可,命令如下:
openssl pkcs12 -export -name tomcat -in cert.cer -inkey key -out ks300_compatible.p12 -certpbe pbeWithSHA1And40BitRC2-CBC -keypbe pbeWithSHA1And40BitRC2-CBC -macalg sha1
参数说明:
-certpbe指定证书条目的加密算法-keypbe指定私钥条目的加密算法-macalg指定MAC校验的哈希算法
读取OpenSSL 1.1.1生成的旧PKCS12文件
临时开启弱算法支持,在命令中加-legacy参数即可:
openssl pkcs12 -info -in ks111.p12 -legacy
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

