Openssl: 错误“证书链中的自签名证书”

45
当我使用openssl API来验证服务器证书(自签名)时,出现了以下错误:
错误19在1深度查找中:证书链中的自签名证书
根据openssl documentation,这个错误(19)是:
“X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:证书链中的自签名证书-可以使用不受信任的证书构建证书链,但本地找不到根。”
为什么会出现这个错误?我的服务器证书有问题吗?
6个回答

32
您拥有的证书是自签名的,因此默认情况下它是不受信任的,这就是为什么OpenSSL会发出警告的原因。实际上,这个警告是一件好事,因为这种情况也可能是由于中间人攻击而产生的。
要解决这个问题,您需要将其安装为受信任的服务器。如果它是由非受信任的CA签名的,则还必须安装该CA的证书。
请参考此链接了解如何安装自签名证书。

26

以下是验证证书是否由特定CA签名的一行命令:

openssl verify -verbose -x509_strict -CAfile ca.pem certificate.pem

这不需要在任何地方安装CA。

有关详细信息和正确的证书链处理,请参阅SSL证书链束如何工作?


9
解决此错误的方法是在代码顶部添加此行:
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

12
我会考虑这个方法作为一个解决方案或用于测试的选项。但它不应该是持久的,因为这会破坏现有的安全措施。 - Alexander Stohr
5
如果我没记错,这似乎是特定于Node.js的。 - sshow
2
它是特定于NodeJS的,只是禁用了所有证书检查。如果您确实知道自己在做什么,那么您可以这样做。但是,将其作为答案放在这里是不好的,因为使用此代码的人无法获得任何关于他们正在做什么的信息。 - Sebastian
1
这不是一个解决方案。-10 - spryce
2
我很满意在开发过程中使用这个。DevOps 可以按照他们希望的方式处理生产环境中的证书。 - Qwerty

5
如果您正在运行Charles并尝试构建容器,则很可能会遇到此错误。
请确保在代理 -> macOS代理下禁用macOS代理。
Charles是一个HTTP代理/ HTTP监视器/反向代理,使开发人员可以查看他们的计算机与互联网之间的所有HTTP和SSL/ HTTPS流量。
因此,任何类似的东西都可能导致相同的问题。

1
即使我在出现错误时没有打开 Charles,这个方法对我仍然有效。 - BooRanger
谢谢。我正在使用Postgres的TLS连接,但Charles导致它们失败了。 - zino

0

如果你正在使用Postman测试你的端点,只需进入设置并禁用“启用SSL证书验证”即可。


-1

您也可以使用以下命令全局跳过SSL验证:

git config --global http.sslVerify false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接