我在我的开发服务器上遇到了问题,其中cURL虽然可以与任何HTTP完美配合,但无法正常使用任何HTTPS – 即使是使用不同协议的完全相同的资源(用于测试我一直在使用http请求google.com)和https).
返回的cURL错误是35:“SSL / TLS握手中某处出现问题.”
我已经梳理了网络和SO以获得解决方案,并且所有这些都已将CURLOPT_SSL_VERIFYPEER设置为false,这不会改变任何内容,或者下载证书文件并将CURLOPT_CAINFO设置为其路径,这也不会改变任何内容.
设置证书时,我按照this tutorial和this tutorial的说明,尝试下载我请求的资源的证书,并下载证书包.
我也尝试过明确地将CURLOP_PORT设置为443.为了彻底解决我的问题,我设置的其他选项是CURLOPT_VERBOSE = true,CURLOPT_RETURNTRANSFER = true,CURLOPT_SSL_VERIFYHOST = 2(我已经尝试了每个组合1和2,VERIFYPEER都是true和假).我也确定在phpinfo()中我有OpenSSL并且它已启用.
我正在使用很多旧代码,这些代码在我的上一个生产服务器上运行得非常好,所以这段代码以前都有用过.但是这个托管是共享托管,我不知道那里的大部分配置.
解决方法:
Curl没有内置的根证书(就像大多数现代浏览器一样).您需要将其明确指向cacert.pem文件:
curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cert/file/cacert.pem');
如果没有这个,curl无法验证通过ssl发回的证书.每次在curl中使用SSL时,都可以使用相同的根证书文件.
标签:php,ssl,https,curl
来源: https://codeday.me/bug/20190917/1808750.html