我在 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 服务器,但仍然出现相同的错误。
我真的不知道还能尝试什么。
谁能建议我还能尝试什么?
终于让这个工作了!
下载证书包。把它放在某个地方。就我而言,那是 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/cacert.pem" openssl.cafile="C:/wamp/cacert.pem" 重启 Wamp 服务。
编者注:禁用 SSL 验证具有安全隐患。如果不验证 SSL/HTTPS 连接的真实性,恶意攻击者可以冒充受信任的端点(例如 GitHub 或其他一些远程 Git 主机),您将容易受到中间人攻击。在将其用作解决方案之前,请确保您完全了解安全问题。
我在 Mandrill.php 文件的第 65 行之后遇到了同样的问题,它说 $this->ch = curl_init();
添加以下两行:
curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);
这解决了我的问题,并且还使用 localhost 发送了电子邮件,但我建议不要在实时版本中使用它。在您的实时服务器上,该代码应该可以在没有此代码的情况下工作。
CURLOPT_SSL_VERIFYPEER
设置为 false
即可。
谢谢@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"
: 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 证书,this post 上的步骤对我在 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 服务器,这应该可以修复它(只需根据需要停止并启动服务)。
注意:禁用 SSL 验证具有安全隐患。如果不验证 SSL/HTTPS 连接的真实性,恶意攻击者可以冒充受信任的端点(例如 GitHub 或其他一些远程 Git 主机),您将容易受到中间人攻击。在将其用作解决方案之前,请确保您完全了解安全问题。
我发现新的解决方案不需要任何认证来调用 curl 只添加两行代码。
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
如果您无权访问 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
中指定的位置。
编者注:禁用 SSL 验证具有安全隐患。如果不验证 SSL/HTTPS 连接的真实性,恶意攻击者可以冒充受信任的端点(例如 GitHub 或其他一些远程 Git 主机),您将容易受到中间人攻击。在将其用作解决方案之前,请确保您完全了解安全问题。
我试过这个它有效
打开
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;
vendor
目录中编辑文件更愚蠢的事情,那么它不会验证 TLS 主机证书。
注意:禁用 SSL 验证具有安全隐患。如果不验证 SSL/HTTPS 连接的真实性,恶意攻击者可以冒充受信任的端点(例如 GitHub 或其他一些远程 Git 主机),您将容易受到中间人攻击。在将其用作解决方案之前,请确保您完全了解安全问题。
详细说明服务器部署的上述答案。
$hostname = gethostname();
if($hostname=="mydevpc")
{
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}
应该在部署时不损害服务器的情况下为开发环境做点什么。
我在本地系统中遇到了这样的问题,但在实时服务器中却没有。我之前在此页面上还提到了另一个解决方案,但它在 localhost 中不起作用。所以找到一个新的解决方案,它在 localhost-WAMP 服务器中起作用。
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 的绝对路径
在 Amazon Linux(CentOS / Red Hat 等)上,我执行了以下操作来解决此问题。首先复制从 http://curl.haxx.se/ca/cacert.pem 下载的 cacert.pem 并将其放在 /etc/pki/ca-trust/source/anchors/
目录中。然后运行 update-ca-trust
命令。
这是取自 https://serverfault.com/questions/394815/how-to-update-curl-ca-bundle-on-redhat 的单行
curl https://curl.se/ca/cacert.pem -o /etc/pki/ca-trust/source/anchors/curl-cacert-updated.pem && update-ca-trust
然而,由于 curl 被破坏了,我实际上使用这个命令来下载 cacert.pem 文件。
wget --no-check-certificate http://curl.haxx.se/ca/cacert.pem
运行 update-ca-trust
命令后,您可以为 apache 重新启动 Web 服务器 service httpd restart
或为 nginx 重新启动 service nginx restart
。
我有这个问题的非常简单的解决方案。您可以在没有任何证书文件的情况下执行此操作。
请注意,此解决方案适用于本地系统而不是客户端服务器和生产服务器。
继续 Laravel 根文件夹 -> Vender -> guzzlehttp -> guzzle -> src
打开客户端.php
找到 $defaults 数组。看起来像这样..
$defaults = [
'allow_redirects' => RedirectMiddleware::$defaultSettings,
'http_errors' => true,
'decode_content' => true,
'verify' => true,
'cookies' => false
];
现在主要工作是更改验证键的值..
'verify' => false,
所以在此之后它不会检查 CURL 请求的 SSL 证书......这个解决方案对我有用。经过多次研究,我找到了这个解决方案......
在 AppVeyor 中构建我的应用程序时,我遇到了同样的问题。
下载 https://curl.haxx.se/ca/cacert.pem 到 c:\php
启用 openssl echo extension=php_openssl.dll >> c:\php\php.ini
找到certificateecho curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini
我对这个问题有一个适当的解决方案,让我们尝试了解这个问题的根本原因。当无法使用系统证书存储中的根证书验证远程服务器 ssl 或远程 ssl 未与链证书一起安装时,就会出现此问题。如果您有一个具有 root ssh 访问权限的 linux 系统,那么在这种情况下,您可以尝试使用以下命令更新您的证书存储:
update-ca-certificates
如果仍然,它不起作用,那么您需要在您的证书存储中添加远程服务器的根证书和临时证书。您可以下载根证书和中间证书并将它们添加到 /usr/local/share/ca-certificates 目录中,然后运行命令 update-ca-certificates
.这应该可以解决问题。同样,对于 Windows,您可以搜索如何添加根证书和中间证书。
解决此问题的另一种方法是要求远程服务器团队将 ssl 证书添加为域根证书、中间证书和根证书的捆绑包。
发生此错误的另一个原因是,如果 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
如果上述解决方案都不适合您,请尝试将您的 XAMPP 安装更新到较新版本。
我用 php 5.5.11 运行 XAMPP,同样的代码不起作用,我用 php 5.6.28 升级到 XAMPP,上面的解决方案有效。
此外,仅更新 PHP 也不起作用,这似乎是该版本 XAMPP 上 apache 和 php 设置的组合。
希望它可以帮助某人。
我收到如下错误:
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.
希望它可以帮助某人
只需在本地再放两条线来解决问题,这对我来说很好。
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
对于 guzzle 你可以试试这个:
$client = new Client(env('API_HOST'));
$client->setSslVerification(false);
在 guzzle/guzzle 3 上测试。*
;
,我花了几个小时才意识到这意味着它是一个评论。所以对于像我这样的菜鸟,还需要删除;
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\