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 是个坏主意。
终于成功了!
把它放在某个地方。就我而言,那是 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 服务。
感谢@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.pem到
c:\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);
我 运行 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 是个坏主意。
终于成功了!
把它放在某个地方。就我而言,那是
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 服务。
感谢@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.pem到
c:\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);