Rob*_*Rob 21 ssl openssl ssl-certificate tls curl
我有一个奇怪的问题。将我的 LAMP 开发机器 (Debian) 更新为 PHP 7。之后我无法再通过 Curl 连接到特定的 TLS 加密 API。
有问题的 SSL 证书由 thawte 签名。
curl https://example.com
Run Code Online (Sandbox Code Playgroud)
给我
curl: (60) SSL certificate problem: unable to get local issuer certificate
Run Code Online (Sandbox Code Playgroud)
然而
curl https://thawte.com
Run Code Online (Sandbox Code Playgroud)
当然,这也是 Thawte 作品的签名。
我可以在其他机器上通过 HTTPS 访问 API 站点,例如我的桌面通过 curl 和浏览器。所以证书绝对有效。SSL 实验室评级为 A。
从我的开发机器到其他 SSL 加密站点的任何其他 Curl 请求都有效。我的根证书是最新的。为了验证,我跑了update-ca-certificates。我什至将http://curl.haxx.se/ca/cacert.pem下载到 /etc/ssl/certs 并运行c_rehash.
还是一样的错误。
有什么方法可以调试验证过程并查看哪个本地颁发者证书 curl(或 openssl)正在寻找但未找到,即文件名?
更新
curl -vs https://example.com
Run Code Online (Sandbox Code Playgroud)
告诉我(IP+域名匿名)
* Hostname was NOT found in DNS cache
* Trying 192.0.2.1...
* Connected to example.com (192.0.2.1) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
Run Code Online (Sandbox Code Playgroud)
和
echo | openssl s_client -connect example.com:443
Run Code Online (Sandbox Code Playgroud)
给
CONNECTED(00000003)
depth=2 C = US, O = "thawte, Inc.", OU = Certification Services Division, OU = "(c) 2006 thawte, Inc. - For authorized use only", CN = thawte Primary Root CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/C=DE/ST=XYZ/CN=*.example.com
i:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
1 s:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
2 s:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
i:/C=ZA/ST=Western Cape/L=Cape Town/O=Thawte Consulting cc/OU=Certification Services Division/CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com
---
Server certificate
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
subject=/C=DE/ST=XYZ/CN=*.example.com
issuer=/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
---
No client certificate CA names sent
---
SSL handshake has read 4214 bytes and written 421 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: [...]
Session-ID-ctx:
Master-Key: [...]
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 300 (seconds)
TLS session ticket:
0000 - 5a 95 df 40 2c c9 6b d5-4a 50 75 c5 a3 80 0a 2d Z..@,.k.JPu....-
[...]
00b0 - d5 b9 e8 25 00 c5 c7 da-ce 73 fb f2 c5 46 c4 24 ...%.....s...F.$
Start Time: 1455111516
Timeout : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
---
DONE
Run Code Online (Sandbox Code Playgroud)
Cas*_*lia 15
使用openssl s_client -connect thawte.com:443节目:
---
Certificate chain
0 s:/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/O=Thawte, Inc./C=US/ST=California/L=Mountain View/businessCategory=Private Organization/serialNumber=3898261/OU=Infrastructure Operations/CN=www.thawte.com
i:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
1 s:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2008 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA - G3
---
Run Code Online (Sandbox Code Playgroud)
最后一个“i”显示了颁发的自签名根 CA。我猜那个特定的Thawte 根 CA,_i.e. 在主根CA - G3证书,是不是在你的/etc/ssl/certs目录(如在规定curl输出;openssl s_client没有默认的CA的路径,需要给出一个明确的,例如 -CApath /etc/ssl/certs)。
将该证书显式添加到您的/etc/ssl/certs目录(并重新运行c_rehash)当然不会受到伤害。如果它有效,例如使用 验证openssl s_client -connect example.com:443 -CApath /etc/ssl/certs,那么您知道该update-ca-certificates命令可能需要一些检查/调试,至于为什么它没有选择这个根 CA。
现在,可能是上面的根CA已经在你的/etc/ssl/certs目录下了,上面的步骤没有效果。在这种情况下,还有另外两个颁发 CA 证书需要检查(至少在 提供的证书链中thawte.com:443):thawte Primary Root CA和thawte SSL CA - G2。重复上述步骤将这些证书安装到您的/etc/ssl/certs目录中(并重新运行c_rehash)可能会奏效。由于这两个是中间 CA,而不是根 CA,缺少其中一个可以解释您的结果,并且可能会被update-ca-certificates.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
89984 次 |
| 最近记录: |