SSL证书和cURL:证书捆绑包还是不受信任的证书?

3
我们有一个Web应用程序,它获取XML文件并根据XML模式进行验证。该应用程序在几年前设置的Ubuntu服务器上运行。
存在一个问题,即cURL访问给定域会失败,因为证书无法验证。关于问题是出在我们这边还是需要联系客户解决,我听到了不同的说法。
例如,使用cURL会出现以下情况:
(pyenv)vagrant@precise64:~$ curl "https://example.com"
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

我已经尝试研究可能出现的问题。这个SSL检查工具显示,一些浏览器无法信任证书颁发机构(CA):
“该证书在所有网络浏览器中都不可信任。您可能需要安装一个中间/链式证书将其链接到可信赖的根证书。”
然后我用browserstack在几个浏览器中尝试了这个URL,结果参差不齐 - 请求在某些浏览器中可以正常工作,在其他浏览器中失败。
基本上我不确定我们是否应该......
1.找到一些更新服务器上“证书包”的方法。如果这是最佳实践的话?
2.告诉example.com的人问题出在他们那里,他们需要获得完全受信任的证书
折扣选项:
3.只为example.com安装证书 <- 这个折扣选项会因其他网站存在相同问题而不可持续
4.关闭应用程序上的SSL验证 <- 不安全且不好的做法 - 即使是XML模式验证器
2个回答

2
查看 ngoaidmap.org 的 SSLLabs 报告,显示:

链问题 不完整

这意味着服务器设置不正确,因为它没有提供必要的中间证书。桌面浏览器通常可以通过下载缺失的证书或使用缓存的证书来解决此问题,但在浏览器之外,验证将失败。这意味着大多数情况下选择第二个选项:

告诉 example.com 的人问题出在他们这里,他们需要获得一个完全受信任的证书

告诉这些人修复他们的服务器是正确的。但问题不是他们需要获取另一个证书,而是他们的服务器也必须提供缺失的中间证书。最好指向 SSLLabs 报告,因为他们最好还应该修复此报告中提到的所有不安全的事项。

-1

我无法确定curl在Linux环境下的行为。

在Windows下,提供一个包含根CA子集的ca-bundle可以解决这个问题 - 您可以尝试使用建议的--cacert选项来提供bundle。

这里有一个有用的bundle可用: https://curl.haxx.se/docs/caextract.html

编辑: 根据Steffen Ulrich的答案,我深入研究了使用openssl。 您可以自己检查。

openssl s_client -showcerts -connect ngoaidmap.org:443

响应表明,交付的证书包含实际的服务器证书,但缺少中间CA的证书(这是完整离线验证证书链所必需的)。

证书链 0 s:/ CN = * .ngoaidmap.org i:/ C = US / O = GeoTrust Inc. / CN = RapidSSL SHA256 CA - G3 <= 这里应该是中间CA的证书(不属于ca-bundle的一部分)

在服务器端,可以通过组合交付的证书轻松实现此目标。


谢谢。我已经尝试过 curl "https://example.com" --cacert cacert.pem,但仍然出现了 error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 的错误。 - user2761030
你能分享目标链接吗?这样检查目标证书会更容易。 - Daniel Nachtrub
似乎所提供的证书用于客户端和服务器端,而openssl在此处显示了一个错误(X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY)。我已经检查了证书链并未发现违规。 - Daniel Nachtrub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接