我知道这个问题看起来是已知的(这里有很多问题),在不同的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 -noout
和openssl 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作为输入来创建密钥存储库。
感谢并致以最诚挚的问候
皮埃尔