PHP cURL不能使用HTTPS

我一直在我的开发服务器上的问题,其中cURL,而完美的HTTP任何工作,与任何HTTPS无法正常工作 – 即使是完全相同的资源与不同的协议(用于testing我一直在要求google.com同时使用http和https)。

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

我已经梳理了networking和解决scheme,所有这些都设置CURLOPT_SSL_VERIFYPEER为false,这不会改变什么,或者下载证书文件并将CURLOPT_CAINFO设置为它的path,这也不会改变。

设置证书时,我按照本教程和本教程的说明尝试同时下载我请求的资源的证书并下载证书包。

我也试着明确地设置CURLOP_PORT为443.为了彻底的问题,我设置的其他选项是CURLOPT_VERBOSE = true,CURLOPT_RETURNTRANSFER = true,并且CURLOPT_SSL_VERIFYHOST = 2(我尝试了1和2的所有组合都是VERIFYPEER和假)。 我也已经在phpinfo()中确认我有OpenSSL并且已经启用了。

我使用了很多在我的最后一个生产服务器上完美工作的旧代码,所以这个代码已经工作过了。 但是,托pipe共享主机,我不知道大部分的configuration。

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

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

没有这个,curl不能validation通过ssl发回的证书。 每次在curl中使用SSL时,都可以使用相同的根证书文件。

您可以在这里获取cacert.pem文件: http ://curl.haxx.se/docs/caextract.html

这个怎么样。 它为我提取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 ?> 

查找您的操作系统是否包含证书目录。 如果是这样,那么通常会包含所需的CA证书。 在Ubuntu上,例如,通常是/etc/ssl/certs 。 如果该目录存在,请设置CApath参数:

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

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

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

closures对等和主机validation是一个快速但不安全的解决方法。 这些function的存在是有原因的:所以你可以通过第三方信任你连接的系统是你期望的。

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