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:

1 检查 SSL 对等证书中是否存在通用名称。 2 检查公用名是否存在,并验证它是否与提供的主机名匹配。
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没有用的主要内容,如果未能解决你的问题,请参考以下文章

php中使用crul时,怎么设置ssl的版本

php curl_init

php 如何开启ssl

Linux服务器PHP环境Curl模块详细配置,开启SSL和HTTPS支持

php curl设置ssl版

PHP Curl:SSL 例程:SSL23_GET_SERVER_HELLO:reason(1112)