OpenSSL:无法验证 Experian URL 的第一个证书

Posted

技术标签:

【中文标题】OpenSSL:无法验证 Experian URL 的第一个证书【英文标题】:OpenSSL: unable to verify the first certificate for Experian URL 【发布时间】:2011-11-27 02:54:08 【问题描述】:

我正在尝试使用 OpenSSL 客户端在 Ubuntu 10.10 中验证与 Experian 的 SSL 连接。

openssl s_client -CApath /etc/ssl/certs/ -connect dm1.experian.com:443

问题是连接以验证返回码关闭:21(无法验证第一个证书)。

我检查了证书列表,用于签署 Experian (VeriSign Class 3 Secure Server CA - G3) 的证书包含在列表中。

/etc/ssl/certs/ca-certificates.crt 

但我不知道为什么它无法验证第一个证书。 提前致谢。

整个响应可以在这里看到: https://gist.github.com/1248790

【问题讨论】:

【参考方案1】:

第一条错误信息告诉你更多关于问题的信息:

验证错误:num=20:unable to get local issuer certificate

终端实体服务器证书的发证机构是

威瑞信 Class 3 安全服务器 CA - G3

仔细查看您的 CA 文件 - 您将不会找到此证书,因为它是一个中间 CA - 您发现的是一个 类似名称 G3 Public Primary CA威瑞信。

但是为什么另一个连接成功,而这个却没有呢?问题是服务器配置错误(使用-debug 选项自行查看)。 “好”服务器在握手期间发送整个证书链,从而为您提供必要的中间证书。

但发生故障的服务器向您发送最终实体证书,并且 OpenSSL 无法“即时”下载丢失的中间证书(这可以通过解释授权信息来实现访问扩展)。因此,您的尝试使用 s_client 失败,但如果您使用例如浏览到相同的 URL,它仍然会成功。 FireFox(确实支持“证书发现”功能)。

解决问题的方法是在服务器端解决这个问题,让服务器也发送整个链,或者将缺少的中间证书作为客户端参数传递给 OpenSSL。

【讨论】:

你可以使用-CAfile /etc/ssl/certs/ca-certificates.crt在linux上添加所有本地CA 对于 VeriSign,请访问此处:ssltools.websecurity.symantec.com/checker/#certChecker Apache 配置中不同虚拟主机之间的冲突也可能是一个问题。尝试这样的方法来帮助识别问题:grep -riE 'virtualhost|server(name|alias)' /etc/httpd "openssl s_client -servername -showcerts -connect :443 " 可以得到域的证书。【参考方案2】:

为浮雕的答案添加额外信息。

简单来说,你的证书链中存在不正确的证书。

例如,您的证书颁发机构很可能会给您 3 个文件。

your_domain_name.crt DigiCertCA.crt #(或您的证书颁发机构的名称) TrustedRoot.crt

您很可能将所有这些文件合并到一个包中。

-----BEGIN CERTIFICATE----- 
(Your Primary SSL certificate: your_domain_name.crt) 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
(Your Intermediate certificate: DigiCertCA.crt) 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
(Your Root certificate: TrustedRoot.crt) 
-----END CERTIFICATE-----

如果您创建捆绑包,但使用旧版本或不正确版本的中间证书(在我的示例中为 DigiCertCA.crt),您将得到您所描述的确切症状。

SSL 连接似乎可以通过浏览器工作 来自其他客户端的 SSL 连接失败 Curl 失败并出现错误:“curl: (60) SSL certificate : unable to get local issuer certificate” openssl s_client -connect 给出错误“验证错误:num=20:无法获取本地颁发者证书”

从您的证书颁发机构重新下载所有证书并制作一个新的捆绑包。

【讨论】:

***这是我的确切问题。我这样做了digitalocean.com/community/tutorials/… ***然后使用以下命令从 apache 切换到 nginx ***digitalocean.com/community/tutorials/… ***一切都很好。但现在 facebook 调试器给了我:Curl 错误:SSL_CACERT SSL 证书问题:无法获取本地颁发者证书 ***问题:如何从您的证书颁发机构重新下载所有证书并在我的情况下制作一个新包?【参考方案3】:

我在 Amazon Elastic Load Balancer 实例上安装我的签名证书时遇到了同样的问题。

似乎都是通过浏览器 (Chrome) 找到的,但通过我的 java 客户端访问该站点会产生异常 javax.net.ssl.SSLPeerUnverifiedException

我没有做的是在我的 ELB 实例上安装我的证书时提供一个“证书链”文件(请参阅https://serverfault.com/questions/419432/install-ssl-on-amazon-elastic-load-balancer-with-godaddy-wildcard-certificate)

我们只从签名机构收到了签名的公钥,所以我必须创建自己的证书链文件。使用浏览器的证书查看器面板,我导出了签名链中的每个证书。 (证书链的顺序很重要,见https://forums.aws.amazon.com/message.jspa?messageID=222086)

【讨论】:

+1 表示从浏览器下载的想法。我还为 Verisign 找到了您可以在这里查看您的 SSL ssltools.websecurity.symantec.com/checker/#certChecker,他们会给您一个下载链接。【参考方案4】:

你可以这样做:-

Exim SSL 证书

默认情况下,/etc/exim.conf 将使用证书/密钥文件:

/etc/exim.cert
/etc/exim.key

所以,如果您想知道在哪里设置文件,那就是那里。

它们由 exim.conf 的选项控制:

tls_certificate = /etc/exim.cert
tls_privatekey = /etc/exim.key

中级证书

如果您有 CA 根证书(ca 捆绑包、链等),您需要将 CA 的内容添加到 exim.cert 中,在您的实际证书之后。

确保您在其他地方拥有所有内容的副本以防出错可能是个好主意。

Dovecot 和 ProFtpd 也应该正确读取它,因此 dovecot 不再需要 ssl_ca 选项。 因此,对于这两种情况,都无需对 exim.conf 或 dovecot.conf(/etc/dovecot/conf/ssl.conf) 进行任何更改

【讨论】:

【参考方案5】:

如果您使用的是 MacOS,请使用:

sudo cp /usr/local/etc/openssl/cert.pem /etc/ssl/certs

此 Trust anchor not found 错误消失后

【讨论】:

【参考方案6】:

对于使用 zerossl.com 证书的用户,请将所有证书(按原样)拖放到各自的文件夹中。

将文本剪切并粘贴到现有文件中,可能会导致 utf8 问题 - 取决于操作系统、格式和字符间距。

【讨论】:

以上是关于OpenSSL:无法验证 Experian URL 的第一个证书的主要内容,如果未能解决你的问题,请参考以下文章

OpenSSL 验证:不同 OpenSSL 版本之间的“0 深度查找时的错误 20:无法获取本地颁发者证书”

为啥 openssl_verify() 无法验证我的 JWT 令牌签名?

Openssl 命令行无法验证之前创建的分离的 smime 签名

OpenSSL 验证返回码:20(无法获取本地颁发者证书)

您的 openssl 扩展不支持 SHA384,无法验证 phar 文件完整性

Ruby 2.6.6 OpenSSL 1.1.1g - 证书验证失败(无法获取本地颁发者证书)