我有一个使用 cURL(最新版本)连接到安全网关以进行支付的网站。
问题是 cURL 总是返回 0 长度的内容。我只得到标题。并且仅当我将 cURL 设置为返回 header 时。我有以下标志。
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);
返回的 header 是
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 带有一个过时的文件来验证 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 方法正确解决这个问题。
将 curl.cainfo=/etc/ssl/certs/ca-certificates.crt
添加到您的 php.ini
2017 年 10 月编辑:
现在有一个 composer 包可以帮助您管理 ca 证书,这样如果您的 cacert.pem 因吊销证书而过期,您就不会受到攻击。
https://github.com/paragonie/certainty -> composer 需要 paragonie/certainty:dev-master
关于php - 无法使用 cURL 连接到 HTTPS 站点。而是返回 0 长度的内容。我能做些什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/316099/