我有一个脚本需要使用 cURL 安全连接到网站 foo.bar.com,该网站由 *.bar.com 的通配符 SSL 证书覆盖。
通配符证书由 Verisign 颁发,所有浏览器都信任它,没有任何问题。但是,我无法让 PHP / cURL 连接(至少在不禁用证书验证的情况下)。
只是为了隔离问题,我尝试仅使用命令行 cURL(版本 7.21.1)进行连接。我从 Mozilla 下载了更新的 CA 包(另存为 cacert.pem),然后运行:
curl --cacert /path/to/cacert.pem "https://foo.bar.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.
我一直在谷歌搜索并阅读有关此错误的帖子,但似乎无济于事。
如果我尝试任何正常的非通配符证书域,它似乎工作得很好,所以它似乎局限于这个特定的通配符证书问题。我什至手动导出了信任链中的所有证书,并将它们手动添加到 cacert.pem 文件中(只是为了查看 CA 捆绑包是否缺少某些内容),但仍然没有任何结果。
最终,我希望在 PHP cURL 中实现此功能,但我认为如果我可以通过命令行 cURL 确定问题,那么该解决方案也可能适用于 PHP 脚本。