我在Windows 7上运行PHP Version 5.6.3作为XAMPP的一部分。

当我尝试使用Mandrill API时,我得到以下错误:

未捕获的异常“Mandrill_HttpError”与消息“API调用消息/发送模板失败:SSL证书问题:无法获得本地颁发者证书”

我已经尝试了我在StackOverflow上读到的所有内容,包括将以下内容添加到php.ini文件:

curl.cainfo = "C:\xampp\php\cacert.pem"

当然也下载到了cacert。来自http://curl.haxx.se/docs/caextract.html的Pem文件

但是在这之后,重新启动XAMPP和Apache服务器,但仍然得到相同的错误。

我真的不知道还能试什么。

有没有人能建议我还能尝试些什么?


当前回答

我在本地系统中遇到过类似的问题,但在活动服务器中没有。我还提到了另一个解决方案在此页之前,但这是不工作在本地主机。所以找到一个新的解决方案,这是在本地主机wamp服务器工作。

cURL错误#:SSL证书问题:无法获得本地颁发者 证书

有时系统无法找到您的cacert。Pem在你的硬盘里。所以你可以在你要使用CURL的代码中定义它

请注意,我正在为此满足所有条件,如OPEN-SSL库活动和其他事情。

检查CURL的代码。

 $curl = curl_init();
 curl_setopt_array($curl, array(
            CURLOPT_URL =>$url,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_RETURNTRANSFER=> true,
        ));
curl_setopt($curl, CURLOPT_CAINFO, "f:/wamp/bin/cacert.pem"); // <------ 
curl_setopt($curl, CURLOPT_CAPATH, "f:/wamp/bin/cacert.pem"); // <------
$response = json_decode(curl_exec($curl),true);
$err = curl_error($curl);
curl_close($curl);

但这种解决方案可能无法工作在现场服务器。因为cacert.pem的绝对路径

其他回答

上面的步骤虽然有帮助,但在Windows 8上并不适用。我不知道其中的关联,但以下步骤是有效的。基本上是cacert的变化。pem文件。希望这能帮助到一些人。

下载cacert。Pem文件: http://curl.haxx.se/docs/caextract.html 将该文件保存在PHP安装文件夹中。(例如:如果使用xampp -保存在c:\Installation_Dir\xampp\php\cacert.pem)。 打开你的php.ini文件,添加这些行: curl.cainfo = " C: \ Installation_Dir \ xampp \ php \ cacert.pem” openssl.cafile = " C: \ Installation_Dir \ xampp \ php \ cacert.pem” 重新启动Apache服务器应该就能解决问题了(只需停止并启动 根据需要提供服务)。

如果以上解决方案都不适用,请尝试将XAMPP安装更新到新版本。

我用php 5.5.11运行XAMPP,同样的代码不能工作,我用php 5.6.28升级到XAMPP,上面的解决方案工作了。

此外,只更新PHP也不工作,似乎是XAMPP版本的apache和PHP设置的组合。

希望它能帮助到别人。

我有非常简单的解决这个问题。您可以在没有任何证书文件的情况下完成此操作。

注意,此解决方案适用于本地系统,而不适用于客户端服务器和生产服务器。

继续Laravel根文件夹-> vendor -> guzzlehttp -> guzzle -> src

打开Client.php

查找$defaults数组。看起来像这样。

$defaults = [
    'allow_redirects' => RedirectMiddleware::$defaultSettings,
    'http_errors'     => true,
    'decode_content'  => true,
    'verify'          => true,
    'cookies'         => false
];

现在主要工作是更改验证键的值..

'verify'          => false,

所以在这之后,它将不会检查SSL证书为CURL请求…这个解决方案对我来说就是工作。经过多次研究,我找到了这个解决方案…

我有一个适当的解决这个问题的办法,让我们试着了解这个问题的根本原因。当无法使用系统证书存储中的根证书验证远程服务器ssl或远程ssl未与链证书一起安装时,就会出现此问题。如果您的linux系统具有root ssh访问权限,那么在这种情况下,您可以尝试使用以下命令更新您的证书存储:

update-ca-certificates

如果仍然不起作用,那么您需要在证书存储中添加远程服务器的根证书和临时证书。您可以先下载根证书和中间证书,添加到/usr/local/share/ca-certificates目录下,然后执行update-ca-certificates命令。这应该能奏效。类似地,对于windows,您可以搜索如何添加根证书和中间证书。

解决此问题的另一种方法是要求远程服务器团队将ssl证书作为域根证书、中间证书和根证书的捆绑添加。

终于让这个工作了!

Download the certificate bundle. Put it somewhere. In my case, that was c:\wamp\ directory (if you are using Wamp 64 bit then it's c:\wamp64\). Enable mod_ssl in Apache and php_openssl.dll in php.ini (uncomment them by removing ; at the beginning). But be careful, my problem was that I had two php.ini files and I need to do this in both of them. One is the one you get from your WAMP taskbar icon, and another one is, in my case, in C:\wamp\bin\php\php5.5.12\ Add these lines to your cert in both php.ini files: curl.cainfo="C:/wamp/cacert.pem" openssl.cafile="C:/wamp/cacert.pem" Restart Wamp services.