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议我还有什么可以尝试?
终于得到这个工作!
-
下载证书包。 正如Arturo所说,拿到旧的证书,以防万一你有一个新的证书: ca-bundle.crt 。 有一段时间,最新的证书有一些问题,但现在可以解决。 所以如果想试一试,可以在这里find 。
-
把它放在某个地方。 在我的情况下,这是
c:\wamp\
目录(如果您使用Wamp 64位,那么它是c:\wamp64\
)。 -
在Apache中启用
mod_ssl
,在php.ini
启用php_openssl.dll
。 但要小心,我的问题是,我有两个php.ini
文件,我需要在这两个都做到这一点。 一个是从WAMP任务栏图标中获得的,另一个是在我的情况下,在C:\wamp\bin\php\php5.5.12\
-
在这两个
php.ini
文件中将这些行添加到您的证书中:curl.cainfo="C:/wamp/ca-bundle.crt" openssl.cafile="C:/wamp/ca-bundle.crt"
-
重新启动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我的应用程序时,我遇到了同样的问题。
- 将https://curl.haxx.se/ca/cacert.pem下载到;
c:\php
- 启用openssl
echo extension=php_openssl.dll >> c:\php\php.ini
- find证书
echo curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini
如果上述解决scheme都没有为您工作,请尝试将您的XAMPP安装更新到更新的版本。
我运行XAMPP与PHP 5.5.11,相同的确切代码没有工作,我升级到XAMPP与PHP 5.6.28和上述解决scheme工作。
此外,只有更新PHP不起作用,似乎是该版本的XAMPP上的Apache和PHP设置的组合。
希望它可以帮助别人。
如果您知道,从xampp本身已经提供的源代码,请参阅并执行本教程