使用PHP cURL和SSL证书时出错

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组件,然后完成上面引用的列表.


Dav*_*vuz 7

经过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文件位于同一目录中,则会更好.

  • 这有效,**仅当我将路径设置为绝对路径时** ...如果您在调用 PHP 文件的同一目录中有 `ca-bundle.crt`,则意味着该路径实际上是 `__DIR__。'/ ca-bundle.crt'` (2认同)

小智 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)