我在同一服务器-客户端微服务的两个不同安装中遇到两个不同的错误。这些是在不同主机上运行的基于 Node.js 的服务。是的,我使用的是自签名证书。根据在线搜索,我可以在https.agent 选项中使用rejectUnauthorized: false绕过这些错误,或者将NODE_TLS_REJECT_UNAUTHORIZED=0设置为客户端的 ENVIRONMENT 变量。我不想这样做,主要是因为这违背了 TLS 和 HTTPS 的全部目的。因此,我将签名证书传递给了客户端,现在一切正常。至少,在我的安装实例中,它给出了 DEPTH_ZERO_SELF_SIGNED_CERT。我无法测试给出的另一个实例SELF_SIGNED_CERT_IN_CHAIN(后勤问题)。我想知道,这两个错误有什么区别?一些在线博客和论坛将这两个错误视为同义词,并为两者提供类似的修复。
1 回答
两个错误字符串都来自 OpenSSL。
因此,如果您查看https://www.openssl.org/docs/manmaster/man1/openssl-verify.html,您会得到:
X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN
可以使用不受信任的证书建立证书链,但在本地找不到根。
和
X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
通过的证书是自签名的,在受信任的证书列表中找不到相同的证书。
所以它们在技术上是不同的,但在这两种情况下,这意味着在证书链中(无论是自签名时的证书本身还是链中更高的证书),其中有一个是不受信任的/在本地未发现为受信任的。
这基本上意味着您没有使用您希望使用的证书,或者您的信任库没有相应地配置。
使用 openssl 验证的详细信息
创建一个自签名证书并openssl verify
在其上运行,您将获得:
$ openssl verify -verbose cert.pem
cert.pem: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd
error 18 at 0 depth lookup:self signed certificate
OK
如果您查看它的联机帮助页,您会得到:
18 X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: self signed certificate
所以错误18
是DEPTH_ZERO_SELF_SIGNED_CERT
现在创建另一个cert2.pem
将由该自签名证书签名的证书 ( )。
不通过不受信任的部分:
$ openssl verify -verbose cert2.pem
cert2.pem: C = US, ST = Some-State, O = Internet Widgits Pty Ltd
error 20 at 0 depth lookup:unable to get local issuer certificate
错误20
是X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
。正如预期的那样,openssl 告诉你这个证书不是自签名的,而是由它在本地不知道的权威签名的。
但是通过将先前的自签名证书作为 CA 传递给第二个证书:
$ openssl verify -verbose -untrusted cert.pem cert2.pem
cert2.pem: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd
error 19 at 1 depth lookup:self signed certificate in certificate chain
错误19
确实是X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN
:openssl 告诉您它可以cert2.pem
根据中的不受信任(通常是中间)证书验证最终证书cert.pem
(因此两者之间存在有效签名),但是该中间证书是自签名的并且不称为受信任的 CA,因此根据您当前的信任存储,openssl 无法完全验证此证书。