我们现有的系统(ubuntu服务器)使用curl通过https连接到另一台远程服务器。从任何浏览器连接都可以正常工作,我们得到了回应。我打开了端口443,以确保它没有被防火墙阻止。
为了进行测试,我通过终端使用curl命令,并收到错误消息:
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines: SSL3_GET_SERVER_CERTIFICATE:certificate verify failed.
然后在运行curl命令时使用
--cacert
指定了pem文件之后。现在它显示“ libcurl不支持或禁用https”
但是,当我查看curl信息时,它列出了以下内容:libcurl / 7.19.7 OpenSSL / 0.9.8k zlib / 1.2.3.3 libidn / 1.15,这似乎包含SSL支持。
另外,当我查看phpinfo时,它表明curl已被OpenSSL启用,这似乎是内置的支持。我尝试在脚本中设置
curl_setopt
,但仍然没有成功。有什么建议么?
这是脚本中的代码片段:
$url = 'https://ourserver.com/user/';
$fields = array(
'user' => urlencode($user),
'password' => urlencode($pass),
);
foreach ($fields as $key => $value) {
$fields_string .= $key . '=' . $value . '&';
}
rtrim($fields_string, '&');
curl_setopt($ch, CURLOPT_CAINFO, '/home/test/key.pem');
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url . '?' . $fields_string,
CURLOPT_USERAGENT => 'Sample cURL Request'
));
$resp = curl_exec($curl);
curl_close($curl);
最佳答案
您对curl_setopt
的CURLOPT_CAINFO
调用无效,因为它适用于不存在的cURL句柄($ch
)。您必须在curl_init
调用之后移动此调用,并传递正确的cURL句柄($curl
)。
同样,CURLOPT_CAINFO
选项需要绝对路径,'/home/test/key.pem'
是相对路径。
因此,您的代码应如下所示:
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url . '?' . $fields_string,
CURLOPT_USERAGENT => 'Sample cURL Request',
CURLOPT_CAINFO => $_SERVER['DOCUMENT_ROOT'].'/home/test/key.pem',
));
$resp = curl_exec($curl);
curl_close($curl);