使用带有非 ASCII 密码的 PCKS#12 证书

Pio*_*r S 5 java pkcs#12 java-security

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

Evg*_*yst 5

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

\n

Java API仅支持 ASCII 密码。

\n

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

\n

例子

\n

生成私钥和证书

\n
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"\n
Run Code Online (Sandbox Code Playgroud)\n

使用非 ASCII 密码创建 PKCS 12 密钥库 (\xd0\xbf\xd0\xb0\xd1\x80\xd0\xbe\xd0\xbb\xd1\x8c )

\n
openssl pkcs12 -export -in cert.pem -inkey key.pem -out keystore.p12 -password pass:\xd0\xbf\xd0\xb0\xd1\x80\xd0\xbe\xd0\xbb\xd1\x8c\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
openssl pkcs12 -info -in keystore.p12 -noout -password pass:\xd0\xbf\xd0\xb0\xd1\x80\xd0\xbe\xd0\xbb\xd1\x8c\n
Run Code Online (Sandbox Code Playgroud)\n

尝试使用 Java 获取密钥库信息keytool导致异常Password is not ASCII

\n
keytool -list -v -keystore keystore.p12 -storepass \xd0\xbf\xd0\xb0\xd1\x80\xd0\xbe\xd0\xbb\xd1\x8c -storetype PKCS12\n\njava.io.IOException: keystore password was incorrect\n    at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2108)\n    at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:222)\n    at java.base/java.security.KeyStore.load(KeyStore.java:1479)\n    at java.base/sun.security.tools.keytool.Main.doCommands(Main.java:946)\n    at java.base/sun.security.tools.keytool.Main.run(Main.java:397)\n    at java.base/sun.security.tools.keytool.Main.main(Main.java:390)\nCaused by: java.security.UnrecoverableKeyException: failed to decrypt safe contents entry: java.io.IOException: getSecretKey failed: Password is not ASCII\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
openssl pkcs12 -in keystore.p12 -out keystore.txt -nodes -password pass:\xd0\xbf\xd0\xb0\xd1\x80\xd0\xbe\xd0\xbb\xd1\x8c\nopenssl pkcs12 -export -in keystore.txt -out newkeystore.p12 -password pass:password\nrm keystore.txt\n
Run Code Online (Sandbox Code Playgroud)\n

不要忘记执行最后一步以删除未加密的 PEM 密钥。

\n

现在,可以使用 OpenSSL 和 Java keytool 获取 keytool 信息

\n
openssl pkcs12 -info -in newkeystore.p12 -noout -password pass:password\nkeytool -list -v -keystore newkeystore.p12 -storepass password -storetype PKCS12\n\nYour keystore contains 1 entry\n
Run Code Online (Sandbox Code Playgroud)\n

通常,最好使用 Java keytool 来更改密钥库密码,如答案中所述/sf/answers/3563005911/中所述

\n
keytool -storetype pkcs12 -keystore newkeystore.p12 -storepasswd -storepass password -new newpassword\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n