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.dll
,extension=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)之解决