PHP - SSL certificate error: unable to get local issuer certificate

PHP - SSL certificate error: unable to get local issuer certificate

我 运行 PHP 版本 5.6.3 作为 XAMPP 的一部分 Windows 7.

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

Uncaught exception 'Mandrill_HttpError' with message 'API call to messages/send-template failed: SSL certificate problem: unable to get local issuer certificate'

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

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

当然还有从 http://curl.haxx.se/docs/caextract.html

下载的 cacert.pem 文件到那个位置

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

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

任何人都可以建议我还可以尝试什么吗?

Editor's note: disabling SSL verification has security implications. Without verification of the authenticity of SSL/HTTPS connections, a malicious attacker can impersonate a trusted endpoint (such as GitHub or some other remote Git host), and you'll be vulnerable to a Man-in-the-Middle Attack.

Be sure you fully understand the security issues before using this as a solution.

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

添加以下两行:

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

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

当您查看 http://curl.haxx.se/docs/caextract.html 页面时,您会注意到一个名为:

的大写字母部分

RSA-1024 removed

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

这些将与 Mandrill 一起使用。

禁用 SSL 是个坏主意。

终于成功了!

  1. 下载certificate bundle.

  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/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
    
  5. 重新启动 Wamp 服务。

感谢@Mladen Janjetovic,

你的建议对我有用 mac 安装了 ampps。

已复制: 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 为本地主机生成新的 SSL 证书,this post 中的步骤对我来说适用于 Centos 7 / Vagrant / Chrome Browser

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

Note: disabling SSL verification has security implications. Without verification of the authenticity of SSL/HTTPS connections, a malicious attacker can impersonate a trusted endpoint (such as GitHub or some other remote Git host), and you'll be vulnerable to a Man-in-the-Middle Attack.

Be sure you fully understand the security issues before using this as a solution.

我找到了新的解决方案,无需任何认证即可调用 curl 仅添加两行代码。

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

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

  • 下载https://curl.haxx.se/ca/cacert.pemc:\php
  • 启用 openssl echo extension=php_openssl.dll >> c:\php\php.ini
  • 找到证书echo curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini

如果上述 none 解决方案对您有效,请尝试将您的 XAMPP 安装更新到较新的版本。

我是 运行 XAMPP php 5.5.11,完全相同的代码不起作用,我升级到 XAMPP php 5.6.28 和上述解决方案有效。

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

希望对大家有所帮助。

如果您无法访问 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 中指定的位置。

Note: disabling SSL verification has security implications. Without verification of the authenticity of SSL/HTTPS connections, a malicious attacker can impersonate a trusted endpoint (such as GitHub or some other remote Git host), and you'll be vulnerable to a Man-in-the-Middle Attack.

Be sure you fully understand the security issues before using this as a solution.

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

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

在部署时应该在不损害服务器的情况下为开发环境做些事情。

对于 guzzle 你可以试试这个:

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

测试于 guzzle/guzzle 3.*

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

注意此解决方案对本地系统有效而不是客户端服务器生产服务器.

继续 Laravel 根文件夹 -> 供应商 -> guzzlehttp -> guzzle -> src

打开Client.php

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

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

现在的主要工作是更改 verify 键的值 ..

'verify'          => false,

所以在此之后它不会检查 CURL 请求的 SSL 证书...这个解决方案对我有用。经过多次研究,我找到了这个解决方案......

Editor's note: disabling SSL verification has security implications. Without verification of the authenticity of SSL/HTTPS connections, a malicious attacker can impersonate a trusted endpoint (such as GitHub or some other remote Git host), and you'll be vulnerable to a Man-in-the-Middle Attack.

Be sure you fully understand the security issues before using this as a solution.

我试过这个有效

打开

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;

我收到如下错误:

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.

希望对某人有所帮助

我在 本地系统 中遇到过这样的问题,但在实时服务器中没有。我之前还在这个页面上提到了另一个解决方案,但它在 localhost 中不起作用。所以找到一个新的解决方案,它在 localhost-WAMP 中起作用服务器.

cURL Error #:SSL certificate problem: unable to get local issuer certificate

有时系统无法在您的驱动器中找到您的 cacert.pem。所以你可以在你要使用 CURL

的代码中定义它

Note that i am fulfilling all conditions for this like OPEN-SSL library active and other things.

检查 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

的绝对路径

这个问题我有一个妥善的解决方案,让我们尝试了解这个问题的根本原因。当无法使用系统证书存储中的根证书验证远程服务器 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

在 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 命令后,您可以重新启动 Web 服务器 service httpd restart 用于 apache 或 service nginx restart 用于 nginx。

只要在本地多放两行就可以解决这个问题,这对我来说很好。

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);