【发布时间】: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