Java 1.8 update 321密钥库导出.pfx文件导入报错问题
问题背景
使用Java 1.8 update 321版本时,导入从Java密钥库导出的.pfx文件抛出异常,相同操作在Java 1.7环境下可正常执行。
复现步骤
- 配置JDK环境路径:
C:\SSL> set path=%path%;"C:\Java\jdk1.8.0_321\bin"
- 生成密钥库文件:
C:\SSL> keytool -genkey -alias server -keyalg RSA -keysize 2048 -keystore reporting.jks -dname "CN=reportserver.itech.com, OU=Company, O=OCompany, L=BSAS, ST=BSAS, C=AR" -keypass Reporting1 -storepass Reporting1 -deststoretype PKCS12
- 转换密钥库格式导出
.pfx文件:
C:\SSL> keytool -importkeystore -srckeystore reporting.jks -destkeystore reportserver.itech.com.pfx -srcstoretype JKS -deststoretype PKCS12
- 调用certutil命令导入
.pfx文件:
C:\SSL> certutil –f –p Reporting1 –importpfx reportserver.itech.com.pfx
报错信息
执行导入命令后返回如下错误:
CertUtil: -importPFX command FAILED: 0x80090020 (-2146893792 NTE_FAIL)
CertUtil: An internal error occurred.
问题根因
从Java 8 update 301版本开始,Oracle调整了keytool生成PKCS12格式密钥库的默认加密算法:私钥和证书条目默认使用PBEWithHmacSHA256AndAES_256算法加密。
Windows系统自带的certutil工具(包括旧版本Windows的证书导入向导)不支持该新加密算法,解析PFX结构时直接抛出内部错误。Java 1.7版本生成PKCS12时默认使用PBEWithSHA1AndDESede/PBEWithMD5AndDES等传统加密算法,属于certutil原生支持的范围,因此不会报错。
修复方案
选择以下任意一种方案即可解决问题:
- 方案1:转换PFX时强制指定兼容Windows的传统加密算法
修改第三步的导出命令,添加JVM参数指定PKCS12加密算法为certutil支持的传统套件,命令如下:
执行后生成的PFX文件可正常被certutil导入。C:\SSL> keytool -importkeystore -srckeystore reporting.jks -destkeystore reportserver.itech.com.pfx -srcstoretype JKS -deststoretype PKCS12 -J-Dkeystore.pkcs12.certPbeAlgorithm=PBEWithSHA1AndDESede -J-Dkeystore.pkcs12.keyPbeAlgorithm=PBEWithSHA1AndDESede - 方案2:使用JDK自带的legacy模式导出PFX(适用于Java 8u331及以上小版本)
导出命令添加-legacy参数,直接生成兼容所有老系统的传统格式PFX:C:\SSL> keytool -importkeystore -srckeystore reporting.jks -destkeystore reportserver.itech.com.pfx -srcstoretype JKS -deststoretype PKCS12 -legacy - 方案3:绕开certutil导入
不使用命令行certutil,直接双击PFX文件通过Windows证书导入向导(新版Win10/11已支持新加密算法的PFX解析)完成导入,或使用OpenSSL工具对Java生成的PFX做格式转码后再调用certutil导入。
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

