问答中心分类: PHPcURL错误60:SSL证书:无法获取本地颁发者证书
0
匿名用户 提问 5天 前

我试图使用Stripe发送API请求,但收到错误消息:

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

这是我正在运行的代码:

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',
    ]);

    return Redirect::route('step1');
}

我在谷歌上搜索了很多,很多人建议我下载这个文件:卡塞特。pem公司,把它放在某个地方,并在我的php中引用它。ini。这是我的php中的一部分。ini:

curl.cainfo = "C:\Windows\cacert.pem"

然而,即使在多次重新启动服务器并更改路径后,我也会收到相同的错误消息。
我在Apache中启用了ssl\u模块,在我的php.ini.
我也尝试过这个修复:如何修复PHP CURL错误60 SSL
这表明我将这些线添加到卷曲选项中:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);

在哪里为卷曲添加选项?显然不是通过命令行,因为我的CLI没有找到命令“curl\u setopt”

21 Answers
0
Rami Nour 回答 5天 前

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_ssl在里面httpd.confApache目录内部C:\wamp64\bin\apache\apache2.4.27\conf
使可能php_openssl.dll在里面php.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"
现在保存文件并重新启动服务器,就可以开始了

Fabien Haddadi 回复 5天 前

你不必同时做这两件事。ini比您打算使用的版本更重要:如果您使用apache作为SAPI客户机,那么请修改apache目录中的版本,和/或修改客户机目录中的版本(如果您计划使用php)。exe作为SAPI。

Jaroslav Klimčík 回复 5天 前

“我需要在这两个方面都做到这一点”是关键。非常感谢。

Deepesh Thapa 回复 5天 前

这适用于带有“guzzlehttp/guzzle”:“^6.3”的Laravel 5.5。Wamp服务器3.1.3。Php 7.1*

user4906240 回复 5天 前

这起作用了。谢谢

MalcolmInTheCenter 回复 5天 前

感谢您回答wamp

Alex01 回复 5天 前

你太棒了!这是我花了几个小时解决这个问题后唯一有效的解决方案。非常感谢。

Greg36 回复 5天 前

非常感谢。我为这个问题找到的第一个解决方案不是“如果您使用XAMPP,那么就这样做”

Nasser Albelbeisi 回复 5天 前

你太棒了!

Homayoon Ahmadi 回复 5天 前

重新运行php artisan serv如果使用Laravel

vreedom18 回复 5天 前

做得好,我花了几个小时试图解决这些问题,并仔细阅读了php.ini,我是从apache文件夹中编辑该文件,而不是在PHP文件夹中😅

Amit Kadam 回复 5天 前

⚡ 这对我很有效。谢谢

0
Loren 回答 5天 前

如果您在Guzzle中使用PHP 5.6,Guzzle已经切换到使用PHP库自动检测证书,而不是它的进程(裁判). PHP概述了这些变化在这里.
找出PHP/Guzzle在哪里寻找证书
您可以使用以下PHP命令转储PHP正在查看的位置:

var_dump(openssl_get_cert_locations());

获取证书捆绑包
对于OS X测试,您可以使用自制软件安装opensslbrew install openssl然后使用openssl.cafile=/usr/local/etc/openssl/cert.pem在php中。ini或Zend服务器设置(在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上。)

Web and Flow 回复 5天 前

对。在看到太多人建议采用多版本号降级的明显错误方法后,这就是正确的方法。我听从了其他人关于cafile的建议,但没有办法测试它为什么仍然无法加载。这个openssl\u get\u cert\u locations()函数确实解决了我的问题。谢谢

psycho brm 回复 5天 前

感谢您提供openssl_get_cert_locations,这使调试更加容易。看起来WAMP对apache php和控制台php使用了不同的ini文件。就我而言,我不得不补充openssl.cafile="c:/_/cacert.pem"用于基于控制台的php。上次通过apache使用它时,我需要curl.cainfo="c:/_/cacert.pem"让它发挥作用。

SherylHohman 回复 5天 前

有人对windows机器有什么建议吗?我在Git Bash、cmd和Commander中尝试了建议的命令。他们都不知道var_dump(openssl_get_cert_locations());

Loren 回复 5天 前

var_dump(openssl_get_cert_locations());是一个PHP命令,您需要在PHP文件或解释器中运行它。(为了清楚起见,更新了帖子,它是一个PHP命令。)

DarkteK 回复 5天 前

你可以跑步echo "<?php var_dump(openssl_get_cert_locations());" | php在您的控制台项目中,您就可以开始了

0
Ja͢ck 回答 5天 前

Guzzle,用于催化剂/条纹,将执行以下操作以查找适当的证书存档以检查服务器证书:

  1. 检查是否openssl.cafile在php中设置。ini文件。
  2. 检查是否curl.cainfo在php中设置。ini文件。
  3. 检查是否/etc/pki/tls/certs/ca-bundle.crt存在(Red Hat、CentOS、Fedora;由ca证书包提供)
  4. 检查是否/etc/ssl/certs/ca-certificates.crt存在(Ubuntu、Debian;由ca证书包提供)
  5. 检查是否/usr/local/share/certs/ca-root-nss.crt存在(FreeBSD;由ca\u root\u 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";

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

0
mvandillen 回答 5天 前

如果您无法更改php。你也可以指向cacert。来自以下代码的pem文件:

$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);
0
George Donev 回答 5天 前

我所做的是使用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)

正如您所注意到的,我已经设置了ini\u cafile或ini选项curl。cainfo。但是在我的例子中,curl会尝试使用“default\u cert\u文件”,它并不存在。
我从中复制了文件https://curl.haxx.se/ca/cacert.pem进入“default\u cert\u file”(c:/openssl-1.0.1c/ssl/cert.pem)的位置,我能够让它工作。
这是我唯一的解决办法。

AbdulMueed 回复 5天 前

我也有类似的问题,我的位置类似于c:/usr/local/ssl/cert.pem,但这个位置不存在,你知道它可能是什么吗,而且我的coluge在mac机器上使用了相同的项目。这可能是原因吗,我已经尝试了其他一切,即在中添加cert位置。ini文件,但它不工作,看起来您的解决方案应该工作,因为它有道理,但不能更改该位置,也不能将证书放在不存在的位置。

George Donev 回复 5天 前

您可以尝试创建文件夹并将证书放在您指定的路径?