【问题标题】:CURL not validating certifcateCURL 不验证证书
【发布时间】:2018-08-21 20:36:59
【问题描述】:

我们使用 curl 作为脚本的一部分从我们的站点下载固件更新。我们网站上的链接实际上是指向 S3 存储桶上最新版本固件的重定向。我曾尝试将 curl 与 S3 url 一起使用;这样可行。我们的站点是在具有两个实例的 AWS EC2 负载均衡器上运行的负载均衡站点。在我们的负载均衡器和 NGINX 托管实例上安装了以 GoDaddy 作为颁发者的 CHAINED 证书。下面是从 Chrome 中查看的链。

但是,从我们的 URL 卷曲固件更新时,我收到标准证书验证错误消息

curl: (60) server certificate verification failed. CAfile: 
/etc/ssl/certs/ca-certificates.crt CRLfile: none
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"

我尝试了什么:

我们的固件发行版针对具有 256MB 闪存的 ARM 处理器进行了 bitbaked,它内置了 curl,并且在 /usr/share/ca-certificates 和 /etc 中安装了相当大的 CA 证书“mozilla + ca_certs”安装/ca-certificates.conf。这些显然在 bitbake 上运行了 update-ca-certificates - /etc/ssl/certs/ca-certificates.crt 中有 1-1 匹配

我们的站点证书具有以下来自 openssl 解码的输出:

Signature Algorithm: sha256WithRSAEncryption
    Issuer: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., OU=http://certs.godaddy.com/repository/, CN=Go Daddy Secure Certificate Authority - G2
    Validity
        Not Before: Jul  1 21:02:38 2016 GMT
        Not After : Sep 29 21:02:38 2019 GMT .......
 ......
             X509v3 Authority Key Identifier:
            keyid:40:C2:BD:27:8E:CC:34:83:30:A2:33:D7:FB:6C:B3:F0:B4:2C:80:CE

        X509v3 Subject Alternative Name:
            DNS:*.ourdomain.com
        X509v3 Subject Key Identifier:
            A2:CE:7F:D5:B2:51:2C:B1:D4:FF:34:A1:9C:B3:AF:C4:29:34:1A:FF

现在,正如您之前看到的,我们网站的证书链包括三个 Go Daddy 证书。我们链中四个证书的主题密钥标识符是:

root: D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3
second: 3A:9A:85:07:10:67:28:B6:EF:F6:BD:05:41:6E:20:C1:94:DA:0F:DE
third: 40:C2:BD:27:8E:CC:34:83:30:A2:33:D7:FB:6C:B3:F0:B4:2C:80:CE
OURS: A2:CE:7F:D5:B2:51:2C:B1:D4:FF:34:A1:9C:B3:AF:C4:29:34:1A:FF

链中的顶部与我们发行版中的 Go_Daddy_Class_2_CA.crt 证书完全匹配。我们站点链中顶部证书的第二个与我们在 mozilla 证书中的发行版“Go_Daddy_Root_Certificate_Authority_-_G2.crt”文件中的“主题密钥标识符”匹配。但是,我们发行版中的该文件似乎没有通过“授权密钥标识符”链接到 2 类 CA。链中的第三个证书在包含的证书中根本不存在!

所以,我在我们的链式证书中取了第二个,并在我们的发行版中替换了该文件。我还将第三个证书放在分发链中,所以现在所有的 GoDaddy 证书似乎都被代表了。我将它们放在 /usr/share/ca-certificates/mozilla 目录中,并确保所有条目都表示在 /etc/ca-certificates.conf 文件中。然后我运行“update-ca-certificates”

这个,我验证了,把新证书放到 /etc/ssl/certs/ca-certificates.crt 文件中,当我运行时

curl --verbose --location https://ourdomain.com/location
* found 158 certificates in /etc/ssl/certs/ca-certificates.crt
* server certificate verification failed. CAfile: /etc/ssl/certs/ca-
certificates.crt CRLfile: none
* Closing connection 0
curl: (60) server certificate verification failed.

158 个证书是添加我们的证书后的必要增加。正如我之前所说,我已经尝试了从直接使用 --cacert 到由于盒子上没有受信任的证书数据库而无法工作的文章。直接从安全的亚马逊 URL 下载工作正常,但我们不想告诉客户新的 URL,因此我们希望从我们的站点进行重定向。

那么,对于 SSL over CURL 专家,我缺少什么?

更新:curl 适用于 Linux Mint VM 上的此 URL,具有与此输出完全相同的证书列表文件。

* SSL connection using ECDHE-RSA-AES128-GCM-SHA256
* Server certificate:
*    subject: OU=Domain Control Validated; CN=*.ourdomain.com
*    start date: 2016-07-01 21:02:38 GMT
*    expire date: 2019-09-29 21:02:38 GMT
*    subjectAltName: support.ourdomain.com matched
*    issuer: C=US; ST=Arizona; L=Scottsdale; O=GoDaddy.com, Inc.; 
OU=http://certs.godaddy.com/repository/; CN=Go Daddy Secure Certificate 
Authority - G2
*    SSL certificate verify ok.
> GET /download/firmware HTTP/1.1
> User-Agent: curl/7.35.0
> Host: support.ourdomain.com
> Accept: */*
> 

【问题讨论】:

    标签: ssl curl ssl-certificate


    【解决方案1】:

    当我将负载平衡服务器之一的单个 IP 应用到 ourdomain.com 的 /etc/hosts 时,curl 命令在我们的固件上运行。然后我去了 AWS 上的负载均衡器,并将带有完整链的证书重新应用到负载均衡器。完成后,即使没有 hosts 条目, curl 命令也能正常工作。因此,证书在负载均衡器上应用不当,但不知何故,浏览器(以及 VM 上功能更全的 curl)看到了这一点并获得了正确的证书,但我们固件上的版本却没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-05
      • 2018-10-20
      • 2014-10-14
      • 2017-03-16
      • 2018-11-29
      • 2018-08-07
      • 2016-06-01
      • 2013-10-02
      相关资源
      最近更新 更多