Java keytool显示"密钥库密码不正确";在尝试将PKCS12导入到JKS时



我知道这个问题看起来是已知的(这里有很多问题),在不同的JDK版本上已经报告了几个错误,这篇文章已经很好地总结了这种情况:https://stackoverflow.com/a/72501767

我碰巧落在我认为是另一个案件,尚未回答。我一定是做错了什么,但我看不出是什么。

我有一个PEM格式的证书和私钥,我想从中创建一个JKS。我读到JKS格式可能不再需要了,但我不控制那部分。

我在命令行中处理文件。事情是这样的,没有什么特别的,也没有什么深奥的:

openssl pkcs12 -export -in cert.crt -passout pass:changeit -inkey pkey.key -out keystore.p12
keytool -importkeystore -srckeystore  keystore.p12 -srcstoretype PKCS12 -srcstorepass changeit -deststorepass changeit -destkeystore keystore.jks

我:

Importing keystore keystore.p12 to keystore.jks...
keytool error: java.io.IOException: keystore password was incorrect

现在,问题是我已经在很多版本的JDK上尝试过了,但从来没有成功过。

事实:

  • 输入文件都是正确的(与openssl x509 -in cert.crt -text -nooutopenssl rsa -in pkey.key -text -noout检查)
  • 可以使用openssl:openssl pkcs12 -in keystore.p12 -info -noout -passin pass:changeit检查生成的PKCS12。Ubuntu 22.04, openssl v3 (OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

从那时起,我以为我偶然发现了已知的JDK问题。

我尝试过这些版本,都失败了,并给出了完全相同的消息:

  • openjdk版本"11.0.15";2022-04-19
  • openjdk版本"17.0.3";2022-04-19
  • openjdk版本"18-ea"2022-03-22

最后,我还可以尝试使用以下组合:openssl 1.1.1n + openjdk 11.0.15,产生相同的错误。我试过的JDK版本都在11.0.12以上。

我被困住了,绝望了,在这上面花了太多时间。(为了记录,我尝试使用包含PEM证书的现有密钥来设置bitnami keycloak图表,负责导入它的容器失败了。我试过手动做同样的事情,现在我在这里)。 编辑:

谢谢dave_thompson_085的建议。下面是keytool错误的回溯:

java.io.IOException: keystore password was incorrect
at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2158)
at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:226)
at java.base/java.security.KeyStore.load(KeyStore.java:1503)
at java.base/sun.security.tools.keytool.Main.loadSourceKeyStore(Main.java:2319)
at java.base/sun.security.tools.keytool.Main.doCommands(Main.java:1234)
at java.base/sun.security.tools.keytool.Main.run(Main.java:416)
at java.base/sun.security.tools.keytool.Main.main(Main.java:409)
Caused by: java.security.UnrecoverableKeyException: failed to decrypt safe contents entry: java.security.cert.CertificateParsingException: Empty issuer DN not allowed in X509Certificates

和openssl pkcs12 -info:

MAC: sha256, Iteration 2048
MAC length: 32, salt length: 8
PKCS7 Encrypted data: PBES2, PBKDF2, AES-256-CBC, Iteration 2048, PRF hmacWithSHA256
Certificate bag
PKCS7 Data
Shrouded Keybag: PBES2, PBKDF2, AES-256-CBC, Iteration 2048, PRF hmacWithSHA256

我将遵循java.security.cert.CertificateParsingException: Empty issuer DN not allowed in X509Certificates消息所显示的路径…

感谢@dave_thompson_085的评论,我可以将-J-showversion标志用于keytool -importkeystore命令,并从该Java工具获得有用的消息。

你可以从我的帖子的回溯中看到,结果消息keystore password was incorrect是更深层次的Empty issuer DN not allowed in X509Certificates异常的结果…这个错误信息很容易误导我,让我浪费了时间。

我的问题来自于如何声明我的keycloak证书的颁发者。我已经参考了cert-manager文档,修复了我的问题,并且keycloak最终接受了我的PEM作为输入来创建密钥存储库。

感谢并致以最诚挚的问候

皮埃尔

最新更新