无法使用cURL连接到HTTPS站点。 返回0长度的内容。 我能做什么?

我有一个网站使用cURL(最新版本)连接到安全网关进行付款。

问题是cURL总是返回0长度的内容。 我只收到标题。 只有当我设置cURL返回标题。 我有以下的标志。

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_URL, $gatewayURI); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_POST, 1); 

返回的头是

 HTTP/1.1 100 Continue HTTP/1.1 200 OK Date: Tue, 25 Nov 2008 01:08:34 GMT Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET Content-Length: 0 Content-Type: text/html Set-Cookie: ASPSESSIONIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; path=/ Cache-control: private 

我也尝试cURL'ing不同的网站,他们返回的内容很好。 我认为这个问题可能与https连接有关。

我曾经和公司谈过,他们没有帮助。

有没有人遇到这个错误,并知道一个工作? 我应该cURL并尝试使用fsockopen()

谢谢。 🙂

您还应该尝试检查curl_error()中的错误消息。 您可能需要在每个curl_ *函数后执行一次。

http://www.php.net/curl_error

我今天也有同样的问题。 Curl附带一个过时的文件来validationHTTPS证书。

从以下获取新的:

http://curl.haxx.se/ca/cacert.pem

保存到您的网站上的一些目录

并添加

 curl_setopt ($curl_ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem"); 

对于每一个请求:-)

忽略关于禁用CURLOPT_VERIFYPEER和CURLOPT_VERIFYHOST的任何愚蠢的评论! 这让您的代码在中间攻击中容易受到攻击!

2016年12月编辑:

通过使用下面提到的Jasen的方法来正确解决这个问题。

添加curl.cainfo=/etc/ssl/certs/ca-certificates.crt给你php.ini

2017年10月编辑:

现在有一个composer软件包可以帮助你pipe理ca证书,所以如果你的cacert.pem由于撤销证书而变得过时,你就不会受到攻击。

https://github.com/paragonie/certainty – > composer require paragonie/certainty:dev-master

注意:这是严格不生产使用。 如果你想快速debugging,这可能是有用的。 否则,请使用上面的@ SchizoDuckie的答案。

 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 

只要添加他们。 有用。

刚刚有一个非常类似的问题,并通过添加解决它

 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

显然,我正在提取redirect到另一个位置的网站,默认情况下,php-curl不遵循redirect。

我有一个情况,这有助于:(在Windows上PHP 5.4.16)

 curl_setopt($ch, CURLOPT_SSLVERSION, 3); 

每当我用PHP / Curltesting一些东西的时候,我先从命令行尝试一下,找出可行的方法,然后把我的选项移植到PHP中。

有时你必须升级你的Curl证书到最新版本,而不会有https错误。

我用stream_create_context使用file_get_contents ,它工作正常:

 $postdataStr = http_build_query($postdataArr); $context_options = array ( 'http' => array ( <blink> // this will allways be http!!!</blink> 'method' => 'POST', 'header'=> "Content-type: application/x-www-form-urlencoded\r\n" . "Content-Length: " . strlen($postdataArr) . "\r\n" . "Cookie: " . $cookies."\r\n" 'content' => $postdataStr ) ); $context = stream_context_create($context_options); $HTTPSReq = file_get_contents('https://www.example.com/', false, $context); 

你的networking托pipe公司可能会有一个问题,你正在testing网关的安全通信,他们可能不会允许你这样做。

也可能有一个用户名,连接到远程主机之前必须提供的密码。

或者您的IP可能需要位于远程服务器的批准IP列表中才能启动。

我在最近的应用程序项目中发现了这个错误。 我正在编写从命令行或浏览器窗口运行,所以我使用服务器检测来获取我所要求的文档的相对URL。 麻烦的是,该网站是https,每次我试图访问http://(同一台服务器)时,cURL有用地将其更改为https。

这从浏览器工作正常,但从命令行,我会然后得到一个SSL错误,即使两个validation的设置为false。 我所要做的是,

1)检查$ _SERVER ['HTTP_HOST']。 如果存在,使用($ _SERVER ['HTTPS']?“https://”:“http://”)。$ _ SERVER ['HTTP_HOST']

2)检查$ _SERVER ['COMPUTERNAME'],如果它匹配生产服务器,请提供https URL。 (“ https://(servername) ”)

3)如果没有条件通过,这意味着我在不同的服务器上运行命令行,并使用“ http:// localhost ”。

现在,这工作,但它是一个黑客。 另外,我从来没有弄清楚为什么在一个服务器(https)cURL改变了我的URL,而在另一个(也是https)它离开了我的URL单独。

奇怪的。

使用https和避免安全问题的最佳方法是使用Firefox(或其他工具)并将证书下载到您的服务器。 这个网页帮了我很多 ,而这些步骤对我来说是有效的:

1)在Firefox中打开你要使用CURL的URL

2)在地址栏上点击padlock > more information (FF版本可以有不同的菜单,只要find它)。 点击查看证书button> Details选项卡。

3)在Certificate hierarchy突出显示“正确的”证书。 在我的情况下,这是三个名为“cPanel公司authentication机构”的第二个。 我刚刚通过“试错法”发现了正确的一个。

4)点击导出button。 在我的情况下,工作的人是文件types“带链的PEM”(再次通过试错法)。

5)然后在你的PHP脚本中添加:

 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_CAINFO, [PATH_TO_CRT_FILE]); 

另外,我想说的是,我们必须注意,这些步骤可能需要每年重做一次,或者每当URL证书被更换或更新时。

您正在使用POST方法,但您是否提供了一组数据? 例如

 curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data);