SSL证书错误:不是X.509证书

clj7thdc  于 2023-10-19  发布在  其他
关注(0)|答案(6)|浏览(181)

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

我该怎么办?

wko9yo5t

wko9yo5t1#

您的caceton.pem文件是否只持有一个证书?由于它是一个PEM,请查看它(使用文本编辑器),它应该以
-----BEGIN CERTIFICATE-----
并终结于
-----END CERTIFICATE-----
最后,为了检查它是否被破坏,可以使用openssl并打印它的详细信息
openssl x509 -in cacerts.pem -text

编辑

正如@stefan-seidel在下面提到的,尝试使用
openssl x509 -in broken.pem -out correct.pem

vktxenjb

vktxenjb2#

许多CA将提供PKCS 7格式的证书。
根据Oracle文档,keytool命令可以处理PKCS#7,但有时会失败
keytool命令可以导入X.509 v1、v2和v3证书,以及由该类型的证书组成的PKCS#7格式的证书链。要导入的数据必须以Internet RFC 1421标准定义的二进制编码格式或可打印编码格式(也称为Base64编码)提供。在后一种情况下,编码必须在开始时以--BEGIN开头的字符串为界,在结束时以-END开头的字符串为界。
如果PKCS 7文件无法导入,请尝试将其从PKCS 7转换为X.509:

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

jutyujz03#

这似乎是一个古老的主题,但我会在这里添加我的经验。我也试着安装一个证书,得到了这个错误。然后我用txt编辑器打开cer文件,注意到每行末尾都有一个额外的空格(字符)。删除这些行允许我导入证书。
希望这对别人有价值。

4xrmg8kj

4xrmg8kj4#

正如这个问题的其他各种答案所示,这个错误消息有许多不同的可能原因。发生在你身上的原因可能与发生在我身上的原因完全不同。不幸的是,错误消息完全没有指出问题的实际来源,因此它对故障排除完全没有帮助。事实上,这完全是误导。
所以,而不是给你从这个错误消息的无数可能的原因,我会做的是告诉你如何解决这个问题,以找出是什么原因导致它在您的特定情况.
在工作中,我们通常使用以下两个命令来使一些软件与各种服务器进行对话,例如使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之前的错误消息

oxosxuxt

oxosxuxt5#

我改变了三件事,然后它工作:
1.有一列空格,我把它们去掉了
1.将换行符从Windows CRLF更改为Linux LF
1.删除了结尾处的空行。

cld4siwp

cld4siwp6#

我必须删除-----BEGIN CERTIFICATE-----之后的新行之前的空格。

相关问题