无法使用 cURL 连接到 HTTPS 站点。改为返回长度为 0 的内容。我该怎么办?

2022-08-30 09:12:58

我有一个使用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不同的网站,它们返回的内容很好。我认为问题可能与https连接有关。

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

是否有其他人遇到过此错误并知道解决方法?我应该放弃cURL并尝试使用吗?fsockopen()

谢谢。:)


答案 1

我今天也有同样的问题。Curl 附带了一个过时的文件,用于对 HTTPS 证书进行身份验证。

从以下位置获取新数据:

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

将其保存到您网站上的某个目录

并添加

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

对每一个要求:-)

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

2016年12月编辑:

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

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

2017年10月编辑:

现在有一个 composer 包可以帮助您管理 ca 证书,这样,如果您的 cacert.pem 由于吊销证书而过时,您就不会容易受到攻击。

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


答案 2

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

http://www.php.net/curl_error


推荐