Mag*_*sol 27 php ssl curl certificate
我正在尝试使用cURL编写PHP脚本,该脚本可以通过使用SSL证书的页面授权用户,除了用户名和密码,我似乎无法通过SSL证书阶段.
在这种情况下,curl_setopt($handle, CURLOPT_VERIFYPEER, 0)遗憾的是不是一种选择.证书是身份验证的必要部分,否则我会收到此其他类似SO帖子中提到的错误.
我已尝试使用cURL进行一些命令行运行:
> curl --url https://website
这将返回(60) SLL certificate problem错误.如果我调整命令以包含--cacert选项:
> curl --url https://website --cacert /path/to/servercert.cer
它运作得很好; 返回auth网站.
但是,我尝试了以下PHP代码:
$handle = curl_init();
$options = array(
CURLOPT_RETURNTRANSFER => false,
CURLOPT_HEADER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_SSL_VERIFYHOST => '0',
CURLOPT_SSL_VERIFYPEER => '1',
CURLOPT_CAINFO => '/path/to/servercert.cer',
CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)',
CURLOPT_VERBOSE => true,
CURLOPT_URL => 'https://website'
);
curl_setopt_array($handle, $options);
curl_exec($handle);
if (curl_errno($handle)) {
echo 'Error: ' . curl_error($handle);
}
curl_close($handle);
Run Code Online (Sandbox Code Playgroud)
我原以为代码基本上类似于shell命令,但我得到了以下错误消息:
错误:错误设置证书验证位置:CAfile:/path/to/servercert.cer CApath:none
我已经阅读了所有可以找到的文献(特别是在php.net和curl.haxx上)并且似乎无法找到解决此问题的任何内容.有什么建议?
编辑:我试过chmod 777 servercert.cer没有成功.但是,在使用命令行而不是浏览器通过上面的代码执行PHP脚本时php test.php,它可以很好地工作.有什么解释为什么它在浏览器中不起作用?
编辑2:对于唯一勇敢回答这个问题的灵魂来说,这些驱逐的投票正在变老.请提供有意义的东西或传递给我们.
Nig*_*Owl 15
因为事情是通过命令行工作但不是通过使用curl的php工作,那么我会追求curl成为问题.
根据这个URL,http://curl.haxx.se/docs/sslcerts.html,在上面引用的SO帖子中引用(用CURL(php)阅读SSL页面)...
"直到7.18.0,卷曲捆绑这是默认安装的一个严重过时的CA包文件.这些天来,卷曲档案包括完全没有CA证书,你需要让他们在其他地方,下面是一个例子.
如果远程服务器使用自签名证书,如果未安装CA证书捆绑包,则服务器使用由CA签名的证书(未包含在您使用的捆绑包中)或远程主机是冒名顶替者模拟您最喜欢的网站,并且您想要从此服务器传输文件,请执行以下操作之一:"
然后,它会列出您可以尝试的一些步骤.
由于您的7.16.3版curl优先于7.18.0,如果您还没有,我建议您更新curl和openssl组件,然后完成上面引用的列表.
经过6年的问题,我在共享主机上遇到了同样的问题,显然没有令人满意的答案.我找到了一个解决方案,希望它对每个人都有用.
你可以尝试这个配置:
curl_setopt($config,CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($config,CURLOPT_SSL_VERIFYPEER,1);
curl_setopt($config,CURLOPT_CAINFO,'ca-bundle.crt');
curl_setopt($config,CURLOPT_CAPATH,'ca-bundle.crt');
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的错误与@Magsol:Error: error setting certificate verify locations: CAfile: /path/to/servercert.cer CApath: none; 所以我添加了第4行来设置CAPath.
它与我合作.但请注意,CA文件必须放在可访问的目录中(使用chmod 755或777),如果CA文件与PHP文件位于同一目录中,则会更好.
小智 5
详细说明和总结:
如果您有一个使用PHP curl的PHP文件,并将系统的ca证书放在同一目录中,则以下代码将为您快速入门
$url = "https://myserver.mydomain.local/get_somedata.php";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//These next lines are for the magic "good cert confirmation"
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_VERBOSE, true);
//for local domains:
//you need to get the pem cert file for the root ca or intermediate CA that you signed all the domain certificates with so that PHP curl can use it...sorry batteries not included
//place the pem or crt ca certificate file in the same directory as the php file for this code to work
curl_setopt($ch, CURLOPT_CAINFO, __DIR__.'/cafile.pem');
curl_setopt($ch, CURLOPT_CAPATH, __DIR__.'/cafile.pem');
//DEBUG: remove slashes on the next line to prove "SSL verify" is the cause
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//Error handling and return result
if (curl_exec($ch) === false)
{
$result = curl_error($ch);
}
else
{
$result = curl_exec($ch);
}
// Close handle
curl_close($ch);
return $result;
Run Code Online (Sandbox Code Playgroud)