导入SSL证书时出错:不是X.509证书

时间:2012-03-27 12:38:35

标签: java security ssl x509certificate

我正在尝试按照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)

我该如何解决这个问题?

5 个答案:

答案 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件事,然后它起作用了:

  1. 有一列空格,我将其删除
  2. 将换行符从Windows CRLF更改为linux LF
  3. 删除了最后的空行。

答案 4 :(得分:0)

我不得不在 -----BEGIN CERTIFICATE----- 之后的新行之前删除空格。