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

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

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

没有捕获exception'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服务器,但仍然得到相同的错误。

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

任何人都可以build议我还有什么可以尝试?

终于得到这个工作!

  1. 下载证书包。 正如Arturo所说,拿到旧的证书,以防万一你有一个新的证书: ca-bundle.crt 。 有一段时间,最新的证书有一些问题,但现在可以解决。 所以如果想试一试,可以在这里find 。

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

  3. 在Apache中启用mod_ssl ,在php.ini启用php_openssl.dll 。 但要小心,我的问题是,我有两个php.ini文件,我需要在这两个都做到这一点。 一个是从WAMP任务栏图标中获得的,另一个是在我的情况下,在C:\wamp\bin\php\php5.5.12\

  4. 在这两个php.ini文件中将这些行添加到您的证书中:

     curl.cainfo="C:/wamp/ca-bundle.crt" openssl.cafile="C:/wamp/ca-bundle.crt" 
  5. 重新启动Wamp服务。

在第65行之后的Mandrill.php文件中,它有$ this-> ch = curl_init();

添加以下两行:

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

这解决了我的问题,也使用本地主机发送电子邮件,但我build议不要在现场直播使用它。 在你的服务器上,代码应该没有这个代码。 此代码使您的服务器不安全。

谢谢@Mladen Janjetovic,

您的build议在安装了ampps的mac中为我工作。

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

要: /Applications/AMPPS/extra/etc/openssl/certs/cacert.pem

并用该path更新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生成新的SSL证书,本文中的步骤在Centos 7 / Vagrant / Chrome Browser上为我工作。

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

删除了RSA-1024

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

那些将与Mandrill合作。

禁用SSL是一个坏主意。

上述步骤,虽然有帮助,但没有为我在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服务器,并修复它(只需停止并根据需要启动服务)。

我发现新的解决scheme没有任何所需的authentication调用curl只添加两行代码。

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

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

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

应该为开发环境做好准备,而不会在部署时危及服务器的安全。

如果你没有访问php.ini ,添加这个代码(在你的$ch = curl_init();行)之后对我$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指定的位置。

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

如果上述解决scheme都没有为您工作,请尝试将您的XAMPP安装更新到更新的版本。

我运行XAMPP与PHP 5.5.11,相同的确切代码没有工作,我升级到XAMPP与PHP 5.6.28和上述解决scheme工作。

此外,只有更新PHP不起作用,似乎是该版本的XAMPP上的Apache和PHP设置的组合。

希望它可以帮助别人。

如果您知道,从xampp本身已经提供的源代码,请参阅并执行本教程