【问题标题】:Using PCKS#12 certifcate with non-ASCII password使用带有非 ASCII 密码的 PKCS#12 证书
【发布时间】:2019-05-28 15:02:18
【问题描述】:

我试图打开 PKCS#12 文件,但由于密码不是 ASCII(包含波兰字符),在执行 KeyStore.load() 时出现“密码不是 ASCII”异常。有没有办法使用这个证书?

【问题讨论】:

  • 您是否使用keytool 生成密钥库文件?可以重新生成文件吗?如果是的话,看看这个问题:stackoverflow.com/questions/12811950/…
  • 没有。证书是由其他软件和不同公司生成的。
  • Piotr S,你找到解决办法了吗?
  • 理论上你仍然可以使用 openssl 将密钥库密码更改为合理的值
  • Stacktrace 会很有帮助。 Java 中的 PKCS12 格式仅允许 ASCII (''..'~'),您需要更改密码:请参阅 stackoverflow.com/questions/29971837/…

标签: java pkcs#12 java-security


【解决方案1】:

RFC 7292 指定对密码的 ASCII 和 UTF-8 编码的支持仅作为建议。

Java API 仅支持 ASCII 密码。

因此,解决方法是更改​​密钥库密码。

示例

生成私钥和证书

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 密钥库

openssl pkcs12 -export -in cert.pem -inkey key.pem -out keystore.p12 -password pass:пароль

使用 OpenSSL 获取 PKCS 12 密钥库信息

openssl pkcs12 -info -in keystore.p12 -noout -password pass:пароль

尝试使用 Java 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

因此,必须更改密钥库密码。 没有简单的方法可以使用 OpenSSL 更改 PKCS 12 密钥库密码。 必须将现有的密钥库转换为 PEM,并且必须创建具有新密码的新密钥库

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 密钥。

现在,可以使用 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 来更改密钥库密码,如答案https://stackoverflow.com/a/50900084/7873775中所述

keytool -storetype pkcs12 -keystore newkeystore.p12 -storepasswd -storepass password -new newpassword

但它不适用于具有非 ASCII 密码的密钥库。

【讨论】:

    【解决方案2】:

    我已将密码“889002333”更改为“amrajat”并解决了我的错误

    【讨论】:

    • 也许您应该考虑不要在互联网上发布您的证书密码。
    猜你喜欢
    • 2011-05-21
    • 2011-06-08
    • 2015-11-22
    • 1970-01-01
    • 2017-03-16
    • 2011-05-02
    • 2016-11-17
    • 2013-02-15
    相关资源
    最近更新 更多