PHP - SSL证书错误:无法获得本地颁发者证书

时间:2015-03-04 15:31:09

标签: php ssl curl xampp mandrill

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

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

  

未捕获的异常' Mandrill_HttpError'邮件&API调用邮件/发送模板失败:SSL证书问题:无法获得本地颁发者证书'

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

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

当然从http://curl.haxx.se/docs/caextract.html

下载到该位置的cacert.pem文件

但是毕竟,重新启动了XAMPP和Apache服务器,但仍然遇到了同样的错误。

我真的不知道还有什么可以尝试。

有人可以建议我还能尝试什么吗?

17 个答案:

答案 0 :(得分:288)

终于让这个工作了!

  1. 下载certificate bundle

  2. 把它放在某个地方。在我的情况下,那是sudo node server.js 目录(如果您使用Wamp 64位,那么它是c:\wamp\)。

  3. 在Apache中启用c:\wamp64\,在mod_ssl启用php_openssl.dll(在开头删除php.ini取消注释)。但要小心,我的问题是我有两个;文件,我需要在两个文件中都这样做。一个是你从WAMP任务栏图标中获得的一个,另一个是在我的情况下,在php.ini

  4. C:\wamp\bin\php\php5.5.12\个文件中将这些行添加到您的证书中:

    php.ini
  5. 重启Wamp服务。

答案 1 :(得分:104)

  

免责声明:此代码会使您的服务器不安全。

我在第65行之后的Mandrill.php文件中遇到了同样的问题,它说$ this-> ch = curl_init();

添加以下两行:

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);

这解决了我的问题并且还使用localhost发送了电子邮件,但我建议不要在实时版本中使用它。在您的实时服务器上,代码应该没有此代码。

答案 2 :(得分:41)

谢谢@Mladen Janjetovic,

您的建议适用于我安装了功放的mac。

已复制: http://curl.haxx.se/ca/cacert.pem

收件人: /Applications/AMPPS/extra/etc/openssl/certs/cacert.pem

使用该路径更新php.ini并重新启动Apache:

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"
openssl.cafile="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"

并在Windows AMPPS安装中应用了相同的设置,它也完美地工作。

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/Ampps/php/extras/ssl/cacert.pem"
openssl.cafile="C:/Ampps/php/extras/ssl/cacert.pem"

: 对于wamp来说也一样。

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"
openssl.cafile="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"

如果您正在寻找使用SAN为localhost生成新的SSL证书,Centos 7 / Vagrant / Chrome Browser上的this post步骤对我有效。

答案 3 :(得分:18)

当您查看http://curl.haxx.se/docs/caextract.html页面时,您会在大字母中注明一个名为:

的部分
  

删除了RSA-1024

阅读它,然后下载包含“RSA-1024”证书的证书版本。 https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

这些将适用于Mandrill。

禁用SSL是一个坏主意。

答案 4 :(得分:10)

上述步骤虽然有用,但在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服务器,应该修复它(只需停止并启动即可 根据需要提供服务。

答案 5 :(得分:9)

我发现新的解决方案没有任何必要的认证来调用curl只添加两行代码。

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

答案 6 :(得分:7)

如果您无法访问 php.ini ,则添加此代码(在您的$ch = curl_init();行之后)适用于我:

$certificate_location = "C:\Program Files (x86)\EasyPHP-Devserver-16.1\ca-bundle.crt"; // modify this line accordingly (may need to be absolute)
curl_setopt($ch, CURLOPT_CAINFO, $certificate_location);
curl_setopt($ch, CURLOPT_CAPATH, $certificate_location);

然后,您只需下载ca-bundle.crt并将其保存到$certificate_location中指定的位置。

答案 7 :(得分:2)

详细说明服务器部署的上述答案。

$hostname = gethostname();
if($hostname=="mydevpc")
{
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}

应该为开发环境提供技巧,而不会在部署时危及服务器。

答案 8 :(得分:1)

我在本地系统中遇到了这样的问题,但在实时服务器中却没有。我在此页面上也提到了以前的另一种解决方案,但是该解决方案在 localhost 中不起作用。因此,请找到一个新的解决方案,该解决方案在 localhost-WAMP Server 中工作

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

的绝对路径

答案 9 :(得分:0)

如果上述解决方案均无效,请尝试将XAMPP安装更新为更新版本。

我用php 5.5.11运行XAMPP,同样的代码没有用,我用php 5.6.28升级到XAMPP,上面的解决方案都有效。

另外,只更新PHP不起作用,或者似乎是该版XAMPP上的apache和php设置的组合。

希望它有所帮助。

答案 10 :(得分:0)

在AppVeyor中构建我的应用程序时遇到了同样的问题。

  • https://curl.haxx.se/ca/cacert.pem下载到c:\php
  • 启用openssl echo extension=php_openssl.dll >> c:\php\php.ini
  • 找到证书echo curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini

答案 11 :(得分:0)

我对此问题有非常简单的解决方案。您可以在没有任何证书文件的情况下执行此操作。

进入 Laravel根文件夹->供应商-> guzzlehttp-> guzzle-> src

打开 Client.php

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

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

现在的主要任务是更改验证键的值。

'verify'          => false,

因此,在此之后,它将不检查CURL请求的SSL证书...此解决方案对我有用。经过大量研究,我找到了这个解决方案...

答案 12 :(得分:0)

我尝试了它

打开

vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php

并更改此

 $conf[CURLOPT_SSL_VERIFYHOST] = 2;
 `enter code here`$conf[CURLOPT_SSL_VERIFYPEER] = true;

对此

$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = FALSE;

答案 13 :(得分:0)

我收到了类似这样的错误:

failed loading cafile stream: `C:\xamppPhp\apache\bin\curl-ca-bundle.crt`

我正在使用Windows计算机。因此,我按照以下步骤操作。

1. I have downloaded .pem file from " https://curl.haxx.se/docs/caextract.html "

2. Then I kept the downloaded file inside  "C:/xamppPhp/apache/bin/" folder and renamed the same downloaded file to "curl-ca-bundle.crt".

3. I restarted XAMPP and cleared the cache.
4. It's done.

希望它可以对某人有所帮助

答案 14 :(得分:0)

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

update-ca-certificates

如果仍然无法运行,则需要在证书存储中添加远程服务器的根证书和临时证书。您可以下载根证书和中间证书,并将它们添加到 / usr / local / share / ca-certificates 目录中,然后运行命令 update-ca-certificates 。这应该可以解决问题。同样,对于Windows,您可以搜索如何添加根证书和中间证书。

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

答案 15 :(得分:0)

发生此错误的另一个原因是 CA 捆绑包已从您的系统中删除(并且在 ca 证书中不再可用)。

GeoTrust Global CA 目前就是这种情况,它(除其他外)用于签署 Apple 的用于推送通知的 APNS 证书。

可以在此处的错误报告中找到其他详细信息:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=962596

您可以按照 Carlos Alberto Lopez Perez 的建议在您的机器上手动添加 GeoTrust Global CA 证书:

wget --no-check-certificate -c https://www.geotrust.com/resources/root_certificates/certificates/GeoTrust_Global_CA.pem   \
&& mkdir /usr/local/share/ca-certificates/extra                                                                       \
&& mv GeoTrust_Global_CA.pem /usr/local/share/ca-certificates/extra/GeoTrust_Global_CA.crt                            \
&& update-ca-certificates

答案 16 :(得分:-3)

对于狂饮,您可以尝试以下方法:

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

在枪口/枪口3上进行了测试。*