Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php cURL错误60:SSL证书:无法获取本地颁发者证书_Php_Ssl_Curl_Wamp_Stripe Payments - Fatal编程技术网

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

Php cURL错误60:SSL证书:无法获取本地颁发者证书,php,ssl,curl,wamp,stripe-payments,Php,Ssl,Curl,Wamp,Stripe Payments,我在本地开发环境中使用WAMP,试图向信用卡收费,但收到错误消息: cURL错误60:SSL证书问题:无法获取本地颁发者证书 我在谷歌上搜索了很多,很多人建议我下载这个文件:,把它放在某个地方,并在我的php.ini中引用它。这是my php.ini中的一部分: curl.cainfo = "C:\Windows\cacert.pem" 然而,即使在多次重新启动服务器并更改路径后,我仍会收到相同的错误消息 我使用Apache模块中的WAMP并启用了ssl_模块。从PGP扩展中,我启用了php_

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

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

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

curl.cainfo = "C:\Windows\cacert.pem"
然而,即使在多次重新启动服务器并更改路径后,我仍会收到相同的错误消息

我使用Apache模块中的WAMP并启用了ssl_模块。从PGP扩展中,我启用了php_curl

仍然显示相同的错误消息。为什么会这样

现在,我遵循以下修复方法:

这建议我在卷曲选项中添加以下线条:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);
在哪里向卷曲添加选项?显然不是通过命令行,因为我的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');
}

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

尝试:

编辑:并写入完整路径。我在相对路径方面遇到了一些问题(也许curl是从另一个基本目录执行的?

您是否尝试过

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
如果您使用的是受信任的源,则可以跳过验证。

Guzzle(由使用)将执行以下操作以查找适当的证书存档,以检查服务器证书:

  • 检查php.ini文件中是否设置了
    openssl.cafile
  • 检查php.ini文件中是否设置了
    curl.cainfo
  • 检查
    /etc/pki/tls/certs/ca bundle.crt是否存在(Red Hat、CentOS、Fedora;由ca证书包提供)
  • 检查是否存在
    /etc/ssl/certs/ca certificates.crt
    (Ubuntu、Debian;由ca证书包提供)
  • 检查
    /usr/local/share/certs/ca root nss.crt是否存在(FreeBSD;由ca\u root\u nss包提供)
  • 检查是否
    /usr/local/etc/openssl/cert.pem
    (OS X;由自制软件提供)
  • 检查
    C:\windows\system32\curl ca bundle.crt是否存在(windows)
  • 检查
    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指示的位置。

    我找到了一个适合我的解决方案。我从最新的guzzle版本降级到~4.0版本,它成功了

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


    希望它能帮助别人

    如果您在Guzzle中使用PHP5.6,Guzzle已经转向使用PHP库自动检测证书,而不是它的进程()。PHP概述了这些变化

    找出PHP/Guzzle在哪里寻找证书 您可以使用以下PHP命令转储PHP正在查看的位置:

     var_dump(openssl_get_cert_locations());
    
    获取证书包 对于OS X测试,您可以使用自制软件安装openssl
    brew安装openssl
    ,然后在php.ini或Zend服务器设置(在openssl下)中使用
    openssl.cafile=/usr/local/etc/openssl/cert.pem

    还可以从curl/Mozilla的curl网站上获得证书捆绑包:

    告诉PHP证书在哪里
    一旦你有了一个包,要么把它放在PHP已经在寻找的地方(你在上面找到了),要么在PHP.ini中更新
    openssl.cafile
    。(通常,Unix上的
    /etc/php.ini
    /etc/php/7.0/cli/php.ini
    /etc/php/php.ini

    工作解决方案假设您在Windows上使用XAMPP:

    XAMPP服务器

  • 其他环境也类似
    • 在此处下载并提取cacert.pem(干净的文件格式/数据)
  • 把它放在下面的目录中
  • C:\xampp\php\extras\ssl\cacert.pem

  • 在php.ini中,将这一行放在本节(“c:\xampp\php\php.ini”):
  • 重新启动Web服务器/apache

  • 问题解决了


  • (参考:)

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

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

    openssl s_client -connect example.com:443 
    
    。。。并收到前几行指示:

    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 
    
    。。。在尝试其他目的地(如:google.com等)时,一切正常

    这促使我联系了我一直试图连接的域名,事实上,他们的终端出现了一个问题。问题解决了,我的脚本又开始工作了


    所以。。。如果您正在尝试连接,请尝试一下openssl,看看您尝试连接的位置的响应是否有任何问题。有时,问题可能并不那么“局部”。

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

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

    我所做的是使用
    var_dump(openssl_get_cert_locations());死亡
    在任何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_cafile或ini选项curl.cainfo。但是在我的例子中,curl会尝试使用“default\u cert\u文件”,它并不存在

    我将文件从复制到“默认证书文件”(c:/openssl-1.0.1c/ssl/cert.pem)的位置,并能够使其工作


    这是我唯一的解决方案。

    请确保直接通过窗口资源管理器打开
    php.ini
    文件。(在我的例子中:
    C:\DevPrograms\wamp64\bin\php\p
    
    $http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
    $client = new Google_Client();
    $client->setHttpClient($http);
    
    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)
    
    curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem" 
    
    openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"
    
    [curl]
    curl.cainfo = C:\your_location\cacert.pem
    
    // vendor/guzzlehttp/guzzle/src/Client.php
        $settings = [
            'allow_redirects' => true,
            'exceptions'      => true,
            'decode_content'  => true,
            'verify'          => __DIR__ . '/cacert.pem'
        ];
    
            'verify'          => true
    
            // PHP 5.6 or greater will find the system cert by default. When
            // < 5.6, use the Guzzle bundled cacert.
    
    curl.cainfo ="PATH/cacert.pem"
    
    var_dump(openssl_get_cert_locations()); 
    
      $options = [
        'defaults' => ['verify' => false],
      ];
      new GuzzleClient($options);
    
    ['verify' => '/path/to/cacert.pem']