我正在尝试按照this post更新SSL证书 。
我是证书的菜鸟,所以我跟着this guide。但是,当我进入
keytool -keystore mycacerts -storepass changeit -importcert -file "C:\Users\Noks\Desktop\cacerts.pem" -v
我收到错误:
keytool error: java.lang.Exception: Input not an X.509 certificate
java.lang.Exception: Input not an X.509 certificate
at sun.security.tools.KeyTool.addTrustedCert(KeyTool.java:1913)
at sun.security.tools.KeyTool.doCommands(KeyTool.java:818)
at sun.security.tools.KeyTool.run(KeyTool.java:172)
at sun.security.tools.KeyTool.main(KeyTool.java:166)
我该如何解决这个问题?
答案 0 :(得分:33)
您的cacerts.pem文件是否包含单个证书?既然它是一个PEM,看看它,它应该以
开头 -----BEGIN CERTIFICATE-----
以
结束 -----END CERTIFICATE-----
最后,要检查它是否已损坏,请抓住openssl并使用
打印其详细信息 openssl x509 -in cacerts.pem -text
答案 1 :(得分:29)
许多CA将提供PKCS7格式的证书。
根据Oracle documentation,keytool命令可以处理PKCS#7,但有时会失败
keytool命令可以导入X.509 v1,v2和v3证书,以及 PKCS#7格式化证书链,由证书组成 类型。要导入的数据必须以二进制形式提供 编码格式或可打印编码格式(也称为Base64 编码)由因特网RFC 1421标准定义。在后者 例如,编码必须在开头用一个字符串限定 以----- BEGIN开头,最后以一个字符串开头 与-----结束。
如果无法导入PKCS7文件,请尝试将其从PKCS7转换为X.509:
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
答案 2 :(得分:1)
如果有帮助,我也会在这里补充我的经验:
在工作中,我们通常使用以下两个命令来使IntelliJ IDEA与各种服务器进行通信,例如我们的内部Maven存储库:
[Elevated]C:\Program Files\JetBrains\IntelliJ IDEA {version}\jre64>bin\keytool
-printcert -rfc -sslserver maven.services.{our-company}.com:443 > public.crt
[Elevated]C:\Program Files\JetBrains\IntelliJ IDEA {version}\jre64>bin\keytool
-import -storepass changeit -noprompt -trustcacerts -alias services.{our-company}.com
-keystore lib\security\cacerts -file public.crt
现在,有时会发生keytool -printcert
命令由于临时连接问题而无法与外界通信的情况,例如防火墙阻止了该操作,用户忘记启动其VPN等。这是生活的事实。这实际上不是问题。
问题在于,当愚蠢的工具遇到这样的错误时,它不会将错误消息发送到标准错误设备,而是将其发送到标准输出设备!
这就是最终发生的事情:
public.crt
文件现在没有键,而是包含一条错误消息,内容为keytool error: java.lang.Exception: No certificate from the SSL server
。public.crt
中的键,因此失败,并说keytool error: java.lang.Exception: Input not an X.509 certificate
。最底线是:在keytool -printcert ... > public.crt
之后,始终转储public.crt
的内容以确保它实际上是键而不是错误消息,然后再继续运行keytool -import ... -file public.crt
答案 3 :(得分:0)
我更改了3件事,然后它起作用了:
答案 4 :(得分:0)
我不得不在 -----BEGIN CERTIFICATE-----
之后的新行之前删除空格。