PHP cURL不使用HTTPS

spe*_*ied 21 php ssl https curl

我在我的开发服务器上遇到了问题,其中cURL虽然可以与任何HTTP完美配合,但无法正常使用任何HTTPS - 即使是使用不同协议的完全相同的资源(用于测试我一直在使用http请求google.com)和https).

返回的cURL错误是35:"SSL/TLS握手中某处出现问题."

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

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

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

我正在使用很多旧代码,这些代码在我的上一个生产服务器上运行得很好,所以这段代码以前一直有用.但是这个托管是共享托管,我不知道那里的大部分配置.

Ray*_*Ray 24

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

  curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cert/file/cacert.pem');
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Pacerier将`CURLOPT_SSL_VERIFYPEER`设置为false完全是命令行上的--insecure标志。如果您关心目标服务器的真实性,则也不想这样做 (2认同)

Jos*_*ust 12

这个怎么样.它为我提取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
?>
Run Code Online (Sandbox Code Playgroud)

  • @马特.取决于你在做什么.移动重要的东西用于财务,当然验证HTTPS.从零售商网站刮擦鞋品牌... MITM应该不是问题.显然考虑问题的背景. (8认同)
  • 这是不安全的.不要这样做.始终验证对等方和主机.看其他答案. (5认同)
  • 请参阅上面的答案,忽略证书不是最好的选择. (2认同)

Mat*_*t S 6

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

curl_setopt($ch, CURLOPT_CAPATH, '/etc/ssl/certs');
Run Code Online (Sandbox Code Playgroud)

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

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');
Run Code Online (Sandbox Code Playgroud)

关闭对等方和主机验证是解决实际问题的一种快速但不安全的解决方法。这些功能的存在是有充分的理由的:因此,您可以通过第三方相信所连接的系统就是您所期望的系统。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
Run Code Online (Sandbox Code Playgroud)