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

问题描述 投票:0回答:6

我正在尝试按照这篇文章更新SSL证书 。

我是证书新手,所以我遵循了本指南。但是,当我进入

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)

我该如何解决这个问题?

java security ssl x509certificate
6个回答
61
投票

您的 cacerts.pem 文件是否包含单个证书?由于它是 PEM,请查看它(使用文本编辑器),它应该以

开头

-----BEGIN CERTIFICATE-----

并以

结束

-----END CERTIFICATE-----

最后,要检查它是否已损坏,请获取 openssl 并使用 打印其详细信息

openssl x509 -in cacerts.pem -text

编辑

正如@stefan-seidel 下面提到的,尝试使用 openssl“重新生成”它

openssl x509 -in broken.pem -out correct.pem


42
投票

许多 CA 将提供 PKCS7 格式的证书。

根据Oracle文档,keytool命令可以处理PKCS#7,但有时会失败

keytool命令可以导入X.509 v1、v2和v3证书,并且 PKCS#7 格式的证书链由以下证书组成 类型。要导入的数据必须以二进制形式提供 编码格式或可打印编码格式(也称为 Base64 编码)由互联网 RFC 1421 标准定义。在后者中 在这种情况下,编码必须在开头由一个字符串限制 以 -----BEGIN 开头,并以开始的字符串结尾 与-----END。

如果无法导入 PKCS7 文件,请尝试将其从 PKCS7 转换为 X.509:

openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

9
投票

这似乎是一个旧线程,但我会在这里添加我的经验。我也尝试安装证书并收到该错误。然后我用txt编辑器打开cer文件,并注意到每行末尾有一个额外的空格(字符)。删除这些行可以让我导入证书。

希望这对其他人来说是有价值的。


5
投票

正如该问题的各种其他答案所示,此错误消息有许多不同的可能原因。它发生在你身上的原因可能与它发生在我身上的原因完全不同。不幸的是,错误消息完全没有指出问题的实际根源,因此对于故障排除完全没有帮助。事实上,这完全是误导。

因此,我不会向您提供导致此错误消息的无数可能原因,而是向您展示如何解决此问题,以便找出在您的特定情况下导致该问题的原因。

在工作中,我们通常使用以下两个命令来使某些软件能够与各种服务器通信,例如使IntelliJ IDEA能够与我们内部的maven存储库通信:

[Elevated]keytool 
    -printcert -rfc -sslserver maven.services.{our-company}.com:443 > public.crt

[Elevated]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


2
投票

我改变了 3 件事,然后它就起作用了:

  1. 有一列空格,我把它们去掉了
  2. 将换行符从 Windows CRLF 更改为 Linux LF
  3. 删除了末尾的空行。

1
投票

我必须删除

-----BEGIN CERTIFICATE-----
之后的新行之前的空格。

© www.soinside.com 2019 - 2024. All rights reserved.