php curl 忽略ssl 不是否等于ssl没有用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php curl 忽略ssl 不是否等于ssl没有用相关的知识,希望对你有一定的参考价值。
参考技术A 差不多吧,等于不验证https的证书。症状:php curl调用curl_exec返回bool(false),命令行curl调用正常。
排查方法:
var_dump(curl_error($ch));
返回:
string(23) "Empty reply from server"
再排查:
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
返回:
HTTP/1.1 100 Continue
Connection: close
原因:php curl接收到HTTP 100就结束了,应该继续接收HTTP 200
解决方案:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));本回答被提问者采纳 参考技术B 差不多吧,等于不验证https的证书。
PHP CURL CURLOPT_SSL_VERIFYPEER 被忽略
【中文标题】PHP CURL CURLOPT_SSL_VERIFYPEER 被忽略【英文标题】:PHP CURL CURLOPT_SSL_VERIFYPEER ignored 【发布时间】:2013-02-14 15:52:41 【问题描述】:由于某种原因,我无法将 CURL 与 HTTPS 一起使用。在我升级 curl 库之前,一切正常。现在我在尝试执行 CURL 请求时遇到此响应:SSL CA 证书有问题(路径?访问权限?)
根据此处发布的有关相关问题的建议,我尝试执行以下操作:
禁用主机和对等方的验证
curl_setopt($cHandler, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($cHandler, CURLOPT_SSL_VERIFYPEER, true);
启用CURLOPT_SSL_VERIFYPEER
并指向从http://curl.haxx.se/docs/caextract.html下载的cacert.pem
curl_setopt($cHandler, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($cHandler, CURLOPT_CAINFO, getcwd() . "/positiveSSL.ca-bundle");
我还尝试对作为我尝试连接的服务器的捆绑 CA 证书提供的 positiveSSL.ca-bundle 执行相同的操作。
使用curl.cainfo=cacert.pem
编辑php ini 设置(文件在同一目录中,可供apache 访问)
将/etc/pki/nssdb
重命名为/etc/pki/nssdb.old
不幸的是,以上方法都无法解决我的问题,并且我经常收到 SSL CA 证书问题(路径?访问权限?)消息。
而且我一开始就不需要这个验证(我知道安全问题)。
还有人有其他建议吗?
更新
在更新到最新的库并重新启动整个机器之后,不仅仅是我正在做的 apache 现在似乎又可以工作了!!!
【问题讨论】:
您是否升级了针对不同 SSL 堆栈编译的 Curl 库(可能是 GnuTLS 与 OpenSSL)? 我不这么认为。系统是 Fedora 16,确实是 yum update 的情况。最烦人的是我不需要/想要整个验证,而且我似乎无法简单地禁用它。 如果您的目标是使用 HTTPS 来确保安全,您总是希望有这个验证过程。 我知道这一点,但是我在这里的用例使它有点多余。此外,我已将 curl 更新为最新可用,并将 php 更新为 5.4。现在,错误消息消失了,但我也没有从 curl 中得到任何内容 :) 哈,现在我在某个地方 curl_errno 函数报告状态 77,根据手册是 CURLE_SSL_CACERT_BADFILE。 【参考方案1】:根据文档:要验证主机或对等证书,您需要使用CURLOPT_CAINFO
选项指定备用证书,或者可以使用CURLOPT_CAPATH
选项指定证书目录。
也看CURLOPT_SSL_VERIFYHOST:
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
【讨论】:
关闭 SSL 验证几乎会消除 SSL 的所有安全性。您应该改为修复您的 PHP 配置。 @Scopey 但有时您可能需要在具有自签名证书的本地开发环境中使用它。所以在非公共环境中可能没有意义,但提醒一下,在日志中添加一些警告总是更好的(例如SSL verification disabled
)
Put 'false' 也可以。这个解决方案适用于简单的情况,但如果真的需要 SSL,它就不会起作用。【参考方案2】:
我们在 CentOS7 机器上遇到了同样的问题。禁用 VERIFYHOST
VERIFYPEER
并没有解决问题,我们不再出现 cURL 错误,但响应仍然无效。对与 cURL 相同的链接执行 wget
也会导致证书错误。
-> 我们的解决方案也是重新启动 VPS,这解决了它,我们能够再次完成请求。
对我们来说,这似乎是一个内存损坏问题。重新启动 VPS 重新加载了内存中的库,现在它可以工作了。因此,如果来自@clover
的上述解决方案不起作用,请尝试重新启动您的机器。
【讨论】:
确保它不是间歇性的。我在使用贝宝和同行验证时遇到了问题,有时可以,有时不行。这似乎是随机的。显式设置cafile路径并告诉curl它在哪里解决了问题。以上是关于php curl 忽略ssl 不是否等于ssl没有用的主要内容,如果未能解决你的问题,请参考以下文章