首页 文章

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

提问于
浏览
156

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

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

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

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

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

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

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

现在我正在关注此修复程序:How to fix PHP CURL Error 60 SSL

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

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

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

EDIT

这是我正在运行的代码:

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');
}

17 回答

  • 1

    有一天,当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等)

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

    所以...如果你把头发拉出来,给openssl一个镜头,看看你试图连接的位置是否有任何响应 . 也许这个问题毕竟不是那么“本地化” .

  • 5

    确保您的Window Explorer直接打开 php.ini 文件 . (在我的情况下: C:\DevPrograms\wamp64\bin\php\php5.6.25 ) .

    在这种情况下,请勿使用Wamp / Xamp图标's menu in the System Tray. This shortcut doesn'中的 php.ini 快捷方式 .

    然后编辑 php.ini

    curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem"
    

    openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"
    

    保存 php.ini 后,您不需要在Wamp图标中"Restart All Services"或关闭/重新打开CMD .

  • 11

    这可能是一个边缘情况,但在我的情况下问题不是客户端conf(我已经在 php.ini 中配置了 curl.cainfo ),而是远程服务器没有正确配置:

    它没有在链中发送任何中间证书 . 使用Chrome浏览网站没有错误,但是使用PHP我遇到了以下错误 .

    cURL错误60

    在远程Web服务器配置中包含Intermediate Certs之后,它可以正常工作 .

    您可以使用此站点检查服务器的SSL配置:

    https://whatsmychaincert.com/

  • 5

    我所做的是在任何PHP脚本中使用 var_dump(openssl_get_cert_locations()); die; ,它给了我有关我的本地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_cert_file” .

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

    这是我唯一的解决方案 .

  • 0

    工作方案:

    • 假设在Windows上

    XAMPP服务器

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

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

    • 把它放在这里

    C:\ xampp \ php \ extras \ ssl \ cacert.pem

    你的php.ini中的

    • 把这一行放在这一部分("c:\xampp\php\php.ini"):

    ;;;;;;;;;;;;;;;;;;;;
    ; php.ini选项;
    ;;;;;;;;;;;;;;;;;;;;

    curl.cainfo =“C:\ xampp \ php \ extras \ ssl \ cacert.pem”

    • 重启你的webserver / apache

    问题解决了!

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

  • 3

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

    这就是我做的

    下载certificate bundle.

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

    确保文件 mod_ssl.soC:\wamp64\bin\apache\apache(version)\modules

    在Apache目录 C:\wamp64\bin\apache\apache2.4.27\confhttpd.conf 中启用 mod_ssl

    php.ini 中启用 php_openssl.dll . 请注意我的问题是我有两个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"

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

  • 401

    我花了太多时间为我找出这个问题 .

    我有PHP版本5.5,我需要升级到5.6 .

    在版本<5.6中,Guzzle将使用它自己的cacert.pem文件,但是在更高版本的PHP它将使用系统的cacert.pem文件 .

    我也从这里下载文件https://curl.haxx.se/docs/caextract.html并在php.ini中设置它 .

    在Guzzles StreamHandler.php文件中找到答案https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437

    // PHP 5.6或更高版本默认会找到系统证书 . 什么时候
    // <5.6,使用Guzzle捆绑的cacert .

  • 0

    你有没有尝试过..

    curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
    

    如果您正在使用受信任的来源,可以说您不需要验证SSL证书 .

  • 0

    当我运行 'var_dump(php_ini_loaded_file());' 时,我在我的页面上得到此输出 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'

    并获取PHP加载我的证书文件我必须编辑此路径 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' 中的php.ini并添加 openssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem" 我已下载并从https://curl.haxx.se/docs/caextract.html放置我的证书文件

    我在Windows 10上,使用drupal 8,wamp和php7.2.4

  • 10

    如果您使用带有Guzzle的PHP 5.6,Guzzle已经切换到使用PHP库自动检测证书而不是它的进程(ref) . PHP概述了更改here .

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

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

    var_dump(openssl_get_cert_locations());
    

    获取证书包

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

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

    告诉PHP证书的位置

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

  • -1

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

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

    希望它可以帮到某人

  • 32

    我刚刚使用了 guzzlehttp/guzzle composer包的Laravel 4 php框架遇到了同样的问题 . 出于某种原因,邮件枪的SSL证书突然停止验证,我得到了相同的"error 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's environment提供的文件 . 更改此行(至少在Linux上)将Guzzle配置为使用cURL的默认SSL验证逻辑并修复我的问题:

    'verify'          => true
    

    如果你不是一个好的解决方案,你也可以将其设置为 false .

    由于 vendor 中的文件并不意味着被篡改,因此更好的解决方案是使用configure the Guzzle client,但这在Laravel 4中实在太难了 .

    希望这可以节省其他人几个小时的调试时间......

  • -1

    当您使用Windows时,我认为您的路径分隔符是''(在Linux上为'/') . 尝试使用常量 DIRECTORY_SEPARATOR . 您的代码将更加便携 .

    尝试:

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

    编辑:并写出完整的路径 . 我有一些相对路径的问题(也许curl是从另一个基本目录执行的?)

  • 1

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

    • 检查php.ini文件中是否设置了 openssl.cafile .

    • 检查php.ini文件中是否设置了 curl.cainfo .

    • 检查 /etc/pki/tls/certs/ca-bundle.crt 是否存在(Red Hat,CentOS,Fedora;由ca-certificates包提供)

    • 检查是否存在 /etc/ssl/certs/ca-certificates.crt (Ubuntu,Debian;由ca-certificates包提供)

    • 检查 /usr/local/share/certs/ca-root-nss.crt 是否存在(FreeBSD;由ca_root_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指示的位置 .

  • 18

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

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

    所有答案都是正确的; but the most important thing 是你必须找到合适的php.ini文件 . 在cmd " php --ini " is not the right answer 中检查此命令以查找正确的php.ini文件 .

    如果你编辑

    curl.cainfo ="PATH/cacert.pem"
    

    并检查

    var_dump(openssl_get_cert_locations());
    

    然后curl.cainfo应该有一个值 . if not then that's not right php.ini file;

    ***I recommend you to search *.ini in wamp/bin or xxamp/bin or any server you use and change them one by one and check it. ***

  • 0

    如果您使用WAMP,您还应该在php.ini中为Apache添加证书行(除了默认的php.ini文件):

    [curl]
    curl.cainfo = C:\your_location\cacert.pem
    

    适用于php5.3

相关问题