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

标签 php curl https

我有一个使用 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/

相关文章:

php - 将 MySQL 结果存储到 PHP 数组或从 PHP 数组显示 MySQL 结果

php - 使用 PHP cURL 下载并提取 .tar.gz 文件并返回给客户端,因为字符串不起作用

bash - 为什么 grep 相同的联机帮助页有时会导致错误?

google-chrome - 为什么我在 Shopify.com 上使用 Chrome (v42) 浏览 https 页面时得到 "identify not verified"

php - API 按城市和酒店搜索,查找我的数据库中存在的城市和酒店

php - DateTimeZone 类中的奇怪常量

PHP/Mysql - 动态选择数据?

php - 将变量发送到另一个应用程序并从中获取响应?

apache - 在Apache上启用example.com:8080(Docker)上的https时,应用程序中的连接错误

apache - Spring Security ajax 登录使用 http 重定向而不是 https