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


187

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

当我尝试使用Mandrill API时,出现以下错误:

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

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

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

当然,还可以从http://curl.haxx.se/docs/caextract.html将cacert.pem文件下载到该位置。

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

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

谁能建议我还能尝试什么?



3
另外,请通过删除开头的“;”来确保已取消注释该行。它应该是curl.cainfo =“ C:\ xampp \ php \ cacert.pem”而不是; curl.cainfo =“ C:\ xampp \ php \ cacert.pem”
Jon Tan

是否通过HTTP使用HTTPS也会导致此错误?
javiniar.leonard '16

Answers:


363

终于有了这个工作!

  1. 下载证书捆绑包

  2. 放在某处。就我而言,那是c:\wamp\目录(如果您使用的是Wamp 64位,则为c:\wamp64\)。

  3. mod_ssl在Apache和php_openssl.dllin中启用php.ini(通过删除注释取消它们;的开头)。但是要小心,我的问题是我有两个php.ini文件,我需要在两个文件中都这样做。一种是从WAMP任务栏图标中获得的,另一种是(在我的情况下,C:\wamp\bin\php\php5.5.12\

  4. 将以下两行添加到您的证书中php.ini

    curl.cainfo="C:/wamp/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
  5. 重新启动Wamp服务。


3
在我的情况下,这是c:\ xamp \目录及其Windows 7,该解决方案可以完美使用..非常感谢...
Manu RS

1
可以从原始curl网站curl.haxx.se/docs/caextract.html
Paul

1
在我的情况下,该行;的开头是“ a”,我花了几个小时才意识到这是一条评论。所以对于像我这样的菜鸟,需要删除;以及
abhyudayasrinet

1
@SurajNeupane不确定,我花了很多时间来找回它,那时我使用虚拟机,例如Homestead,而我不必处理这个问题。这是特定案例
Mladen Janjetovic

1
这是关键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\
AA

127

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

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

添加以下两行:

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

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


1
有什么我可以尝试使我的开发人员环境在没有这种旁路的情况下工作的?
Dor Dadush

4
对我来说,就可以CURLOPT_SSL_VERIFYPEER开始false工作了。
Francisco Corrales Morales 2015年

29
从技术上来说,禁用SSL是个坏主意。即使在localhost上,也最好按照其他答案中所述正确加载证书。
脊髓

从技术上来说,禁用SSL是个坏主意。即使它极力抵抗以任何其他方式工作,与以不正确的sys-admin方式进行工作相比,丢掉工作也更好。@Spinal

45

感谢@Mladen Janjetovic,

您的建议在安装了ampps的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"

:相同为沼泽。

[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为本地主机生成新的SSL证书,则这篇文章中的步骤对我有效Centos 7 / Vagrant / Chrome Browser


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是一个坏主意。


1
这解决了我整天都在努力的AWS / Guzzle / cURL的问题。谢谢!
voidstate 2015年

使用这种@voidstate我知道这是旧的,但你也可以绕过它在狂饮[“验证” =>假],对完整的doc SSL /卷曲/狂饮去这里guzzle.readthedocs.org/en/latest/...
约翰

@John,但这将禁用SSL验证,这不是您想要执行的操作,因此我不建议您这样做。
Arturo Alvarado

1
对于Windows,您需要将文件保存在服务器上(例如,保存到C:\ curl \ curl-ca-bundle.crt),然后将以下内容添加到php.ini中:[curl] curl.cainfo =“ C:/curl/curl-ca-bundle.crt“ [openssl] openssl.cafile =” C:/curl/curl-ca-bundle.crt“
voidstate

它经过了很长时间的完美工作(即使在服务器更改中幸存下来),我才有了它,但是我很难确切了解这里发生的事情。是curl或openssl已更新并具有它; ca捆绑包更改为与mailchimp不兼容的捆绑包吗?
Sammaye '16

11

上面的步骤虽然有用,但在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服务器,并且应该对其进行修复(只需根据需要停止并启动服务)。

11

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

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

9
尽管这可能有效,但完全不建议这样做。基本上,您说的是,请信任所有证书...并且如果您忘记了并且代码通过此更改使其可以投入生产,它还可以使应用程序容易受到攻击...下载CA捆绑包和向其添加点PHP。
user919426 '04

那是curl的概念,所以每当您使用curl时,请添加上面的代码
Manish sharma

8

如果您无权访问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


3

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

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

打开Client.php

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

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

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

'verify'          => false,

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


2

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

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

应该在开发环境中发挥作用,而在部署时不损害服务器。


在不同环境中运行代码的不同部分听起来不是一个好主意-它使调试更加困难
Nico Haase

2

我试过了

打开

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;

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

0

如果以上解决方案都不适合您,请尝试将XAMPP安装更新为较新的版本。

我在php 5.5.11上运行XAMPP,相同的代码无法正常工作,我在php 5.6.28上升级到了XAMPP,以上解决方案均有效。

另外,仅更新PHP也不起作用,这似乎是该版本XAMPP上的apache和php设置的组合。

希望它能帮助某人。


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.

希望它可以帮助某人


0

我在本地系统中遇到了这样的问题,但在实时服务器中却没有。我在此页面上也提到了以前的另一个解决方案,但是该解决方案在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的绝对路径


0

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

update-ca-certificates

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

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


-4

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

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

在食口/食口3。


1
是否有一个答案回答了一个3年的,有200多个投票的答案的老问题?
treyBake

我的答案比上面的答案简单,您会看到我将在几个月内获得10票赞成票……
fico7489

1
我对此表示高度怀疑,没有在OP中看到任何关于枪口的提法..​​.所以这是一个无关紧要的答案。当有人为JavaScript问题提供jQuery解决方案时,情况相同。没关系
treyBake

不会改变它不在这里使用的事实。您是否会因为Windows服务器使用率最高而建议Windows用户使用Linux解决方案?并非每个人都想使用Guzzle,我个人在使用PHP的那几年从未使用过它。对我来说,HTTP请求实际上不需要那么难。
treyBake

1
完全了解-只是不需要。只是阅读curl的文档,它们都是不言自明的。这不是要变得更聪明……而是要正确回答问题
treyBake
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.