cURL错误60:SSL证书:无法获得本地颁发者证书

Lov*_*ess 206 php ssl curl wamp stripe-payments

我在本地开发环境中使用WAMP,我正在尝试从信用卡收费,但收到错误消息:

cURL错误60:SSL证书问题:无法获取本地颁发者证书

我在Google上搜索了很多,很多人都建议我下载这个文件:cacert.pem,把它放在某处并在我的php.ini中引用它.这是我的php.ini中的一部分:

curl.cainfo = "C:\Windows\cacert.pem"
Run Code Online (Sandbox Code Playgroud)

然而,即使多次重启我的服务器并更改路径,我也会收到相同的错误消息.

我使用Apache模块中的WAMP并启用了ssl_module.从PGP扩展我启用了php_curl.

仍然是相同的错误消息.为什么会这样?

现在我正在关注此修复程序:如何修复PHP CURL错误60 SSL

这表明我将这些行添加到我的cURL选项中:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);
Run Code Online (Sandbox Code Playgroud)

我在哪里添加选项到我的cURL?显然不是通过命令行,因为我的CLI没有找到命令"curl_setopt"

编辑

这是我正在运行的代码:

public function chargeStripe()
{
    $stripe = new Stripe;
    $stripe = Stripe::make(env('STRIPE_PUBLIC_KEY'));

    $charge = $stripe->charges()->create([
        'amount'   => 2900,
        'customer' => Input::get('stripeEmail'),
        'currency' => 'EUR',
    ]);

    dd($charge);

    // echo $charge[Input::get('stripeToken')];


    return Redirect::route('step1');
}
Run Code Online (Sandbox Code Playgroud)

Dun*_*ung 467

工作方案:

  • 假设在Windows上

XAMPP服务器

类似于其他环境 - 在这里下载和解压缩cacert.pem(一个干净的文件格式/数据)

https://curl.haxx.se/docs/caextract.html

  • 放在这里

C:\ XAMPP\PHP \演员\ SSL\cacert.pem

  • 在你的php.ini中把这一行放在这一部分("c:\ xampp\php\php.ini"):
;;;;;;;;;;;;;;;;;;;;
; php.ini Options  ;
;;;;;;;;;;;;;;;;;;;;

curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
Run Code Online (Sandbox Code Playgroud)
  • 重启你的webserver/apache

问题解决了!

(来源:https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate)

  • 由于您的PHP版本,此消息即将发布.如果它是从PHP 5.5上面然后因为PHP 5.6新功能而出现此错误.如果您使用cURL,PHP 5.6检查证书. (6认同)
  • 谢谢你的回答!虽然我建议使用官方curl页面中的cacert.pem:https://curl.haxx.se/docs/caextract.html (6认同)
  • 只是想指出任何无法让它工作的人 - 我使用正斜杠`curl.cainfo ="C:/cacert.pem"`并且还必须重新启动计算机以使其工作.只是重新启动Web服务器是不够的.希望这有助于:] (4认同)
  • 并且不要忘记取消注释`curl.cainfo`(facepalm) (3认同)
  • 谢谢!我没有运行 XAMPP,但在 Windows 上。这个解决方案对我有用,只是将其停在这里:`“C:\ php \ extras \ ssl \ cacert.pem”`。 (2认同)

Lor*_*ren 42

如果你使用带有Guzzle的PHP 5.6,Guzzle已经转而使用PHP库自动检测证书而不是它的进程(ref).PHP概述了这里的变化.

找出PHP/Guzzle在哪里寻找证书

您可以转储PHP正在使用的位置:

 var_dump(openssl_get_cert_locations());
Run Code Online (Sandbox Code Playgroud)

获得证书包

对于OS X测试,您可以使用homebrew安装openssl brew install openssl,然后openssl.cafile=/usr/local/etc/openssl/cert.pem在php.ini或Zend Server设置中使用(在OpenSSL下).

curl网站上的curl/Mozilla也提供了证书包:https://curl.haxx.se/docs/caextract.html

告诉PHP证书的位置

一旦你有了一个bundle,要么把它放在PHP已经看的地方(你在上面找到)或者openssl.cafile在php.ini中更新.(通常,/etc/php.ini/etc/php/7.0/cli/php.ini/etc/php/php.ini在Unix).

  • 是.在看到太多人提出通过多个版本号降级明显错误的方法之后,这就是正确的方法.我跟随别人对咖啡馆的建议,但没有办法测试为什么它仍然没有加载.这个openssl_get_cert_locations()函数真正完成了识别我的问题的工作.谢谢! (3认同)
  • 感谢您提供 `openssl_get_cert_locations`,它使调试变得更加容易。看起来 WAMP 对 apache php 和控制台 php 使用不同的 ini 文件。就我而言,我必须为基于控制台的 php 添加 `openssl.cafile="c:/_/cacert.pem"`。上次,当通过 apache 使用它时,我需要 `curl.cainfo="c:/_/cacert.pem"` 来使它工作。 (3认同)
  • 您可以运行 `echo "<?php var_dump(openssl_get_cert_locations());" | php` 在你的控制台项目中,你就可以开始了 (3认同)

Ram*_*our 41

注意Wamp/Wordpress/windows用户.我有这个问题好几个小时,甚至没有正确的答案是为我做的,因为我正在编辑错误的php.ini文件,因为问题是回答XAMPP而不是WAMP用户,即使问题是针对WAMP.

这就是我做的

下载证书包.

把它放在里面 C:\wamp64\bin\php\your php version\extras\ssl

确保文件mod_ssl.so在里面C:\wamp64\bin\apache\apache(version)\modules

mod_sslhttpd.confApache目录内启用C:\wamp64\bin\apache\apache2.4.27\conf

启用php_openssl.dllphp.ini.请注意我的问题是我有两个php.ini文件,我需要在这两个文件中执行此操作.第一个可以位于您的WAMP任务栏图标内.

在此输入图像描述

而另一个位于 C:\wamp64\bin\php\php(Version)

找到两个php.ini文件的位置并找到该行,curl.cainfo =并给它一个这样的路径

curl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"

现在保存文件并重新启动服务器,你应该好好去

  • “我需要在他们两个中都这样做”是关键。谢谢 (5认同)
  • 如果您使用 Laravel,请重新运行 `php artisan serv` (3认同)
  • 你太棒了!在花了几个小时寻找解决问题后,这是唯一对我有用的解决方案。谢谢你! (2认同)

Ja͢*_*͢ck 15

bualyst/stripe使用的Guzzle将执行以下操作以查找适当的证书存档以检查服务器证书:

  1. 检查是否openssl.cafile在php.ini文件中设置了.
  2. 检查是否curl.cainfo在php.ini文件中设置了.
  3. 检查是否/etc/pki/tls/certs/ca-bundle.crt存在(Red Hat,CentOS,Fedora;由ca-certificates包提供)
  4. 检查是否/etc/ssl/certs/ca-certificates.crt存在(Ubuntu,Debian;由ca-certificates包提供)
  5. 检查是否/usr/local/share/certs/ca-root-nss.crt存在(FreeBSD;由ca_root_nss包提供)
  6. 检查是否/usr/local/etc/openssl/cert.pem(OS X;由自制软件提供)
  7. 检查是否C:\windows\system32\curl-ca-bundle.crt存在(Windows)
  8. 检查是否C:\windows\curl-ca-bundle.crt存在(Windows)

您需要通过执行简单测试来确保正确定义前两个设置的值:

echo "openssl.cafile: ", ini_get('openssl.cafile'), "\n";
echo "curl.cainfo: ", ini_get('curl.cainfo'), "\n";
Run Code Online (Sandbox Code Playgroud)

或者,尝试将文件写入#7或#8指示的位置.


mva*_*len 12

如果您无法更改php.ini,您还可以从以下代码中指向cacert.pem文件:

$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);
Run Code Online (Sandbox Code Playgroud)


小智 7

我所做的是var_dump(openssl_get_cert_locations()); die;在任何PHP脚本中使用,它给了我本地php使用的默认信息:

array (size=8)
  'default_cert_file' => string 'c:/openssl-1.0.1c/ssl/cert.pem' (length=30)
  'default_cert_file_env' => string 'SSL_CERT_FILE' (length=13)
  'default_cert_dir' => string 'c:/openssl-1.0.1c/ssl/certs' (length=27)
  'default_cert_dir_env' => string 'SSL_CERT_DIR' (length=12)
  'default_private_dir' => string 'c:/openssl-1.0.1c/ssl/private' (length=29)
  'default_default_cert_area' => string 'c:/openssl-1.0.1c/ssl' (length=21)
  'ini_cafile' => string 'E:\xampp\php\extras\ssl\cacert.pem' (length=34)
  'ini_capath' => string '' (length=0)
Run Code Online (Sandbox Code Playgroud)

您可以注意到,我已经设置了ini_cafile或ini选项curl.cainfo.但在我的情况下,curl会尝试使用不存在的"default_cert_file".

我将文件从https://curl.haxx.se/ca/cacert.pem复制到"default_cert_file"(c:/openssl-1.0.1c/ssl/cert.pem)的位置,我能够得到它上班.

这是我唯一的解决方案.


Iru*_*ika 6

我找到了一个适合我的解决方案.我从最新的guzzle降级到版本~4.0并且它有效.

在composer.json中添加"guzzlehttp/guzzle":"~4.0"

希望它可以帮助某人


Day*_*ion 6

有一天,当一个Guzzle(5)脚本试图通过SSL连接到主机时,我出现了这个问题.当然,我可以在Guzzle/Curl中禁用VERIFY选项,但这显然不是正确的方法.

我尝试了这里列出的所有内容以及类似的线程,然后最终使用openssl进入终端来测试我尝试连接的域:

openssl s_client -connect example.com:443 
Run Code Online (Sandbox Code Playgroud)

......并收到前几行表示:

CONNECTED(00000003)
depth=0 CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1 
Run Code Online (Sandbox Code Playgroud)

...当尝试其他目的地时一切正常(例如:google.com等)

这促使我联系了我一直试图连接的域名,事实上,他们在THEIR END上遇到了问题.它解决了,我的脚本又恢复了工作.

所以...如果你要拔掉头发,请给openssl一个镜头,看看你试图连接的位置是否有任何响应.也许问题毕竟不是那么"本地化".


She*_*man 6

对于 WAMP,这最终对我有用。
虽然它与其他解决方案类似,但此页面和网络上其他位置提到的解决方案不起作用。一些“次要”细节有所不同。
保存 PEM 文件的位置很重要,但指定得不够明确。
或者php.ini要编辑的哪个文件不正确。或两者。
我在 Windows 10 计算机上运行 2020 年安装的 WAMP 3.2.0。

获取pem文件的链接:

http://curl.haxx.se/ca/cacert.pem
复制整个页面并将其另存为:cacert.pem,位于下面提到的位置。

将 PEM 文件保存在此位置

<wamp install directory>\bin\php\php<version>\extras\ssl
例如保存的文件和路径:“T:\wamp64\bin\php\php7.3.12\extras\ssl\cacert.pem”

* (我最初将其保存在其他位置(并在 php.ini 文件中指示了保存位置,但这不起作用)。其他位置可能也可能不起作用。这是推荐的位置 - 我不这样做知道为什么。)

WHERE
<wamp install directory>= WAMP 安装路径。
例如: T:\wamp64\

<php version>WAMP 正在运行的 php 的:(要查找,请转到:WAMP icon tray -> PHP <version number>
如果显示的版本号是 7.3.12,则目录将为:php7.3.12)
例如:php7.3.12

要编辑哪个 php.ini 文件

要打开正确的php.ini文件进行编辑,请转到:WAMP icon tray -> PHP -> php.ini
例如:T:\wamp64\bin\apache\apache2.4.41\bin\php.ini
注意:它不是 php 目录中的文件!

更新:
虽然看起来我正在编辑 file: T:\wamp64\bin\apache\apache2.4.41\bin\php.ini,但
实际上正在编辑该文件的符号链接目标: T:/wamp64/bin/php/php7.3.12/phpForApache.ini

请注意,如果您按照上述说明操作,则不会php.ini直接编辑文件。您实际上正在编辑一个phpForApache.ini文件。(包含有关符号链接信息的帖子)

如果您阅读各个 WAMP 目录中某些文件顶部的注释php.ini,它会明确指出不要编辑该特定文件。
确保您打开进行编辑的文件不包含此警告。

安装扩展 Link Shell Extension允许我通过添加的选项卡在文件 Properites 窗口中查看符号链接的目标。这是我的一个答案,其中包含有关此扩展的更多信息。

如果您在不同时间运行不同版本的 php,则可能需要将 PEM 文件保存在每个相关的 php 目录中。

在 php.ini 文件中进行的编辑:

将 PEM 文件的路径粘贴到以下位置。

  • 取消注释;curl.cainfo =并粘贴到 PEM 文件的路径。
    例如:curl.cainfo = "T:\wamp64\bin\php\php7.3.12\extras\ssl\cacert.pem"

  • 取消注释;openssl.cafile=并粘贴到 PEM 文件的路径。
    例如:openssl.cafile="T:\wamp64\bin\php\php7.3.12\extras\ssl\cacert.pem"

学分:

虽然不是官方资源,但这里有一个返回 YouTube 视频的链接,该视频为我理清了最后的细节:https://www.youtube.com/watch? v=Fn1V4yQNgLs 。


Mik*_*ler 5

你有没有尝试过..

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
Run Code Online (Sandbox Code Playgroud)

如果您使用的是可信来源,则可以跳过验证。


Qua*_*Tri 5

确保您php.ini直接通过窗口资源管理器打开文件。(在我的情况下:)C:\DevPrograms\wamp64\bin\php\php5.6.25

不要使用php.ini系统托盘中 Wamp/Xamp 图标菜单中的快捷方式。在这种情况下,此快捷方式不起作用。

然后编辑php.ini

curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem" 
Run Code Online (Sandbox Code Playgroud)

openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"
Run Code Online (Sandbox Code Playgroud)

保存后,php.ini您无需在 Wamp 图标中“重新启动所有服务”或关闭/重新打开 CMD。