2012-03-19 136 views
9

我一直在我的开发服务器上遇到问题,其中cURL在完全适用于任何HTTP的情况下,无法正常使用任何HTTPS - 甚至是具有不同协议的完全相同的资源(用于测试I'我一直在使用http和https请求google.com)。PHP cURL不能使用HTTPS

返回的cURL错误是35:“SSL/TLS握手中某处发生了问题。”

我已经梳理了Web和SO以获得解决方案,并且它们都将CURLOPT_SSL_VERIFYPEER设置为false,这不会改变任何内容,或者下载证书文件并将CURLOPT_CAINFO设置为其路径,这也不会改变任何内容。

设置证书时,我按照this tutorialthis tutorial的说明尝试同时为我请求的资源下载证书,然后下载证书包。对于我的问题的彻底性,我设置的其他选项是CURLOPT_VERBOSE = true,CURLOPT_RETURNTRANSFER = true,和CURLOPT_SSL_VERIFYHOST = 2(我已经尝试了1和2的每个组合与VERIFYPEER都是真的和假的)。我也已经在phpinfo()中确认我有OpenSSL并且已启用。

我使用了很多旧代码,这些代码在我的上一个生产服务器上运行完美,所以此代码已工作过。但是,托管是共享主机,我不知道那里的大部分配置。

+0

您访问的网址是否相同?你遇到了我在处理这个问题时所做的大部分研究。 – Jason 2012-03-19 17:01:12

+0

我使用了http:// www.google.com,它工作;和https:// www.google.com,但没有。 – spezied 2012-03-19 19:08:23

+0

@Spezied,如果提供的答案回答你的问题,你可以选择它作为你的答案,所以问题可以被关闭?谢谢。 – 2012-03-24 21:33:14

回答

8

这个怎么样。它为我提取HTTPS Google主页。它应该为你做诡计。

<?PHP 

// connect via SSL, but don't check cert 
$handle=curl_init('https://www.google.com'); 
curl_setopt($handle, CURLOPT_VERBOSE, true); 
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false); 
$content = curl_exec($handle); 

echo $content; // show target page 
?> 
+1

看到我上面的答案,忽略cert不是最好的选择。 – Ray 2013-07-01 16:36:42

+3

这就是INSECURE。不要这样做。始终验证对等和主机。查看其他答案。 – 2013-09-18 15:19:02

+5

@Matt。取决于你在做什么。移动重要的财务资源,肯定会验证HTTPS。从零售商网站刮擦鞋子品牌...... MITM应该不成问题。显然考虑问题的上下文。 – 2013-09-18 17:37:12

16

Curl没有内置的根证书(像大多数现代浏览器一样)。你需要明确地将它指向一个cacert.pem文件:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cert/file/cacert.pem'); 

如果没有这个,卷曲无法验证证书通过SSL送回。每次在curl中使用SSL时,都可以使用相同的根证书文件。

你可以在这里得到cacert.pem文件:http://curl.haxx.se/docs/caextract.html

+0

为什么不使用相同的'--insecure'标志?有一个吗? – Pacerier 2016-01-17 21:25:09

+1

@Pacerier将'CURLOPT_SSL_VERIFYPEER'设置为false,正好是'--insecure'标志在命令行上执行的操作。如果您关心目标服务器 – Ray 2016-01-18 16:57:17

+0

的真实性,则不想执行任何操作。虽然'CURLOPT_SSL_VERIFYPEER'为'false'。 – n8bar 2017-05-18 16:34:43

2

找到,如果你的操作系统包括证书的目录。如果是这样,那么所需的CA证书通常已经包含在内。例如,在Ubuntu上,它通常是/etc/ssl/certs。如果此目录存在,请设置CA路径参数:

curl_setopt($ch, CURLOPT_CAPATH, '/etc/ssl/certs'); 

或者,您可以引用单个CA证书文件。在您的项目中包含一个cacert.pem文件或将其安装在您的服务器上。从可信来源下载,例如cacert.org。对于单个文件不设置CAPATH,而是只设置CAINFO:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem'); 

关闭同行和主机验证是一个快速而不安全解决方法,以真正的问题。这些功能的存在是有原因的:所以您可以通过第三方相信您连接的系统是您期望的系统。

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