我在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服务器,但仍然遇到了同样的错误。
我真的不知道还有什么可以尝试。
有人可以建议我还能尝试什么吗?
答案 0 :(得分:288)
终于让这个工作了!
把它放在某个地方。在我的情况下,那是sudo node server.js
目录(如果您使用Wamp 64位,那么它是c:\wamp\
)。
在Apache中启用c:\wamp64\
,在mod_ssl
启用php_openssl.dll
(在开头删除php.ini
取消注释)。但要小心,我的问题是我有两个;
文件,我需要在两个文件中都这样做。一个是你从WAMP任务栏图标中获得的一个,另一个是在我的情况下,在php.ini
在C:\wamp\bin\php\php5.5.12\
个文件中将这些行添加到您的证书中:
php.ini
重启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文件中的更改。希望这有助于某人。
答案 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中构建我的应用程序时遇到了同样的问题。
c:\php
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上进行了测试。*