java - 使用带有非 ASCII 密码的 PKCS#12 证书

标签 java pkcs#12 java-security

我试图打开 PKCS#12 文件,但由于密码不是 ASCII(包含波兰语字符),我在执行 KeyStore.load() 时收到“密码不是 ASCII”异常。使用此证书有什么解决方案吗?

最佳答案

RFC 7292指定对密码的 ASCII 和 UTF-8 编码的支持仅作为建议。
Java API仅支持 ASCII 密码。
因此,解决方法是更改​​ keystore 密码。
例子
生成私钥和证书

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=test/C=CH/ST=Zurich/L=Zurich/O=Test Org/OU=Test Unit"
使用非 ASCII 密码 ( пароль ) 创建 PKCS 12 keystore
openssl pkcs12 -export -in cert.pem -inkey key.pem -out keystore.p12 -password pass:пароль
使用 OpenSSL 获取 PKCS 12 keystore 信息
openssl pkcs12 -info -in keystore.p12 -noout -password pass:пароль
尝试使用 Java 获取 keystore 信息 keytool导致异常 Password is not ASCII
keytool -list -v -keystore keystore.p12 -storepass пароль -storetype PKCS12

java.io.IOException: keystore password was incorrect
    at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2108)
    at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:222)
    at java.base/java.security.KeyStore.load(KeyStore.java:1479)
    at java.base/sun.security.tools.keytool.Main.doCommands(Main.java:946)
    at java.base/sun.security.tools.keytool.Main.run(Main.java:397)
    at java.base/sun.security.tools.keytool.Main.main(Main.java:390)
Caused by: java.security.UnrecoverableKeyException: failed to decrypt safe contents entry: java.io.IOException: getSecretKey failed: Password is not ASCII
因此,必须更改 keystore 密码。
没有使用 OpenSSL 更改 PKCS 12 keystore 密码的简单方法。
现有的 keystore 必须转换为 PEM,并且必须创建一个具有新密码的新 keystore
openssl pkcs12 -in keystore.p12 -out keystore.txt -nodes -password pass:пароль
openssl pkcs12 -export -in keystore.txt -out newkeystore.p12 -password pass:password
rm keystore.txt
不要忘记执行最后一步来删除未加​​密的 PEM key 。
现在,可以使用 OpenSSL 和 Java keytool 获取 keytool 信息
openssl pkcs12 -info -in newkeystore.p12 -noout -password pass:password
keytool -list -v -keystore newkeystore.p12 -storepass password -storetype PKCS12

Your keystore contains 1 entry
通常,最好使用 Java keytool 更改 keystore 密码,如答案 https://stackoverflow.com/a/50900084/7873775 中所述。
keytool -storetype pkcs12 -keystore newkeystore.p12 -storepasswd -storepass password -new newpassword
但它不适用于具有非 ASCII 密码的 keystore 。

关于java - 使用带有非 ASCII 密码的 PKCS#12 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53998300/

相关文章:

Java程序输出句柄

java - 如何使用自签名证书运行 Java HTTP 服务器并信任浏览器?

c++ - 如何在 Mac OSX 上的 Qt 中使用 pkcs12/pfx 成功执行 SSL 加密?

tomcat - Jconsole 无法连接到在 AWS EC2 上使用安全选项运行的 tomcat

java - Sonar 违规在此操作系统命令中使用之前已正确清理

java - 将 AndroidKeyStoreRSAPrivateKey 转换为 RSAPrivateKey 时崩溃

java - 如何为我的 java swing 应用程序准备 Mac 安装程序

java - 测试预期异常时出错,即使它抛出正确的异常

java - 如何使用 Hamcrest 断言一个通用的整数列表?

java - 如何使用java程序创建带有客户端公钥和私钥的PKCS#12格式文件