【问题标题】:OpenSSL: unable to verify the first certificate for Experian URLOpenSSL:无法验证 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

【问题讨论】:

    标签: ssl certificate openssl


    【解决方案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),您将得到您所描述的确切症状。

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

    【讨论】:

    • ***这是我的确切问题。我这样做了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

    【讨论】:

    【解决方案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 问题 - 取决于操作系统、格式和字符间距。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-21
          • 1970-01-01
          • 2021-10-20
          • 2021-01-02
          • 2020-02-17
          • 2021-03-26
          • 1970-01-01
          • 2018-08-29
          相关资源
          最近更新 更多