SSL/TLS 操作失败 PHP5.6 - curl-ca-bundle.crt & cacert.pem

Posted

技术标签:

【中文标题】SSL/TLS 操作失败 PHP5.6 - curl-ca-bundle.crt & cacert.pem【英文标题】:SSL/TLS operations failing PHP5.6 - curl-ca-bundle.crt & cacert.pem 【发布时间】:2016-03-09 08:43:34 【问题描述】:

这已经让我发疯了几个星期了。

我通常在 CentOS 7 机器上进行开发,但最近我开始在 Windows 10 上使用 Xampp 并使用 CentOS 机器将代码提交到客户端测试。

在 linux 机器上一切正常,但在 Windows 上,任何 SSL/TLS 调用都失败了,据我所知,这是由于 php5.6 默认验证对等证书和主机名的新特性 - http://php.net/manual/en/migration56.openssl.php

我已经阅读了几乎所有在线和 SO 上的操作指南,据我所知,我已经尝试了所有方法,但一无所获。

有人可以帮忙吗?!

在 php.ini 中启用了扩展 extension=php_openssl.dllextension=php_curl.dll 也是如此。

我还下载了证书文件并将以下内容添加到我的 php.ini..

curl.cainfo = "‪C:\xampp\php\certs\curl-ca-bundle.crt"
curl.capath = "‪C:\xampp\php\certs\"


openssl.cafile= "‪C:\xampp\php\certs\curl-ca-bundle.crt"
openssl.capath= "‪C:\xampp\php\certs\"

我得到的错误是:

对于使用 TLS 的 SMTP 调用:

PHP Warning:  stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in W:\libraries\Zend\Mail\Protocol\Smtp.php on line 206

对于 cURL 调用:

API call to messages/send failed: error setting certificate verify locations: CAfile: ‪C:\xampp\php\certs\cacert.pem CApath: none

C:\xampp\php\certs\目录的内容是:

ca-bundle.trust.crt
cacert.pem
curl-ca-bundle.crt

我已经重新启动了 Apache,甚至尝试在命令行中使用 curl.exe 作为独立程序,它可以正常请求 HTTPS 域(不确定这是否相关,但我还是尝试了!)

我也尝试将以下内容添加到 php.ini(并重新启动 Apache),但没有任何效果..

openssl.verify_peer= false
openssl.verify_peer_name = false

有什么想法吗?

【问题讨论】:

您确定您使用的不是 PHP 5.6,而是从未真正正式发布的 PHP6? 如果你绝望了,就禁用它。 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); @hanshenrik - 理想情况下希望解决这个问题,而且我没有直接调用 cURL,它是在我集成的 API 中调用的,所以不能真正搞乱那里的代码.不过还是谢谢。 api 是否提供 curl 的直接句柄? 【参考方案1】:

错误消息error setting certificate verify locations 来自 libcurl 本身,意味着它无法找到或打开指定的 CAFile。

在 Windows 上,我认为如果您将路径更改为:

curl.cainfo = "‪C:\xampp\php\certs\curl-ca-bundle.crt"

curl.cainfo = "‪C:/xampp/php/certs/curl-ca-bundle.crt"

OpenSSL 可能也是如此,但我还没有测试确认。

【讨论】:

不,仍然出现同样的错误,也重新启动了 Apache :(【参考方案2】:

原来这是一个权限问题并且没有读取证书文件 - 将 C:/xampp/php/certs/ 文件夹移动到另一个位置(例如在我的用户目录中)解决了这个问题 :)

【讨论】:

以上是关于SSL/TLS 操作失败 PHP5.6 - curl-ca-bundle.crt & cacert.pem的主要内容,如果未能解决你的问题,请参考以下文章

ftp_nlist():data_accept:SSL / TLS握手失败

Api 随机调用失败 - 请求被中止:无法创建 SSL/TLS 安全通道

[HTTPS] - 请求API失败(Could not create SSL/TLS secure channel)之解决

无法创建 SSL/TLS 安全通道。 (SSIS)

请求被中止:无法创建 SSL/TLS 安全通道

HttpWebRequest :: GetResponse-请求已中止:无法创建SSL / TLS安全通道