我试图用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');
}

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

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

然而,即使在重新启动服务器几次并更改路径之后,我仍然得到相同的错误消息。

我在Apache中启用了ssl_module,在我的php.ini中启用了php_curl。

我还尝试了这个修复:如何修复PHP CURL错误60 SSL

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

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

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


当前回答

对于那些试图在本地机器上使用Wordpress应用程序密码功能的人。您需要更新wp-includes\certificates\ca-bundle.crt

在文本编辑器中打开此文件并附加服务器证书。

打开自签名证书(.crt)文件 复制所有之间和包括

——开始证书

——结束证书

粘贴到wp-includes\certificates\ca-bundle.crt文件的末尾

其他回答

我刚刚在使用guzzlehttp/guzzle composer包的Laravel 4 php框架中遇到了同样的问题。出于某种原因,mailgun的SSL证书突然停止验证,我收到了同样的“错误60”消息。

如果像我一样,您在一个共享主机上,没有访问php.ini的权限,那么其他解决方案是不可能的。在任何情况下,Guzzle有这样的客户端初始化代码,很可能会使php.ini效果无效:

// vendor/guzzlehttp/guzzle/src/Client.php
    $settings = [
        'allow_redirects' => true,
        'exceptions'      => true,
        'decode_content'  => true,
        'verify'          => __DIR__ . '/cacert.pem'
    ];

在这里,Guzzle强制使用自己的内部cacert。pem文件,这个文件现在可能已经过时了,而不是使用cURL环境提供的文件。修改这一行(至少在Linux上)配置Guzzle使用cURL的默认SSL验证逻辑,并解决了我的问题:

由于vendor中的文件并不意味着被篡改,一个更好的解决方案是在使用时配置Guzzle客户端,但这在Laravel 4中太难做到了。

希望这为其他人节省了几个小时的调试时间……

狂饮版5

这个默认配置对我的工作很好。它将禁用https要求。

  $options = [
    'defaults' => ['verify' => false],
  ];
  new GuzzleClient($options);

在其他情况下,您要设置ca的路径,更改为:

['verify' => '/path/to/cacert.pem']

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

以下是我所做的:

Download the certificate bundle. Put it inside of C:\wamp64\bin\php\your php version\extras\ssl Inside of C:\wamp64\bin\apache\apache(version)\modules, make sure the file mod_ssl.so is there Inside of Apache directory C:\wamp64\bin\apache\apache2.4.27\conf, enable mod_ssl in httpd.conf Enable php_openssl.dll in php.ini. Be aware my problem was that I had two php.ini files and I need to do this in both of them. First one can be located inside of your WAMP taskbar icon here. And the other one is located in C:\wamp64\bin\php\php(Version) Find the location for both of the php.ini files and find the line curl.cainfo = and give it a path like this curl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem" Now save the files and restart your server and you should be good to go

当你在使用Windows时,我认为你的路径分隔符是'\'(在Linux上是'/')。 尝试使用常量DIRECTORY_SEPARATOR。您的代码将更易于移植。

Try:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem');

EDIT:并写入完整路径。我有一些相对路径的问题(也许curl是从另一个基目录执行的?)

你试过…

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

如果你想冒着被中间人攻击的风险,你可以跳过验证。