【问题标题】:How to fix Stripe Error: Network error [errno 77]: error setting certificate verify locations如何修复 Stripe 错误:网络错误 [errno 77]:错误设置证书验证位置
【发布时间】:2019-08-27 13:03:58
【问题描述】:

我尝试在我的网站上使用 Stripe,但出现以下错误:

Fatal error:
    Uncaught Stripe\Error\ApiConnection: Unexpected error communicating with Stripe. If this problem persists, let us know at support@stripe.com.
    (Network error [errno 77]: error setting certificate verify locations: CAfile: CApath: /etc/ssl/certs) in /var/www/html/assets/vendor/stripe/lib/HttpClient/CurlClient.php:284
Stack trace:
    #0 /var/www/html/assets/vendor/stripe/lib/HttpClient/CurlClient.php(241): Stripe\HttpClient\CurlClient->handleCurlError('https://api.str...', 77, 'error setting c...', 0) 
    #1 /var/www/html/assets/vendor/stripe/lib/HttpClient/CurlClient.php(203): Stripe\HttpClient\CurlClient->executeRequestWithRetries(Array, 'https://api.str...') 
    #2 /var/www/html/assets/vendor/stripe/lib/ApiRequestor.php(364): Stripe\HttpClient\CurlClient->request('post', 'https://api.str...', Array, Array, false) 
    #3 /var/www/html/assets/vendor/stripe/lib/ApiRequestor.php(96): Stripe\ApiRequestor->_requestRaw('post', '/v1/charges', Array, Array)
    #4 /var/www/html/assets/vendor/stripe/lib/ApiOperations/Request.php(5 in /var/www/html/assets/vendor/stripe/lib/HttpClient/CurlClient.php on line 284

我最近使用一键式 LAMP 部署在 Google Compute Engine 上创建了一个新 VM。我还使用 Lets Encrypt 来允许 https。此外,我已经下载了最新的 cacert.pem 文件并将其放在 /etc/ssl/certs 文件夹中。

certs 文件夹有以下权限:

drwxr-xr-x 2 root root     20480 Apr  5 14:31 certs

该文件具有以下权限:

-rw-r--r-- 1 root root 219596 Apr  5 14:29 cacert.pem

我还编辑了php.ini 文件以将curl.cainfoopenssl.cafile 指向pem 文件并重新启动Apache。

在查看 Stripe 的网站时,它提到现在需要 TLS 1.2。我已经确认我的网站正在使用它。但是 Stripe 网站上的一些示例测试代码似乎表明它没有看到 TLS 1.2。

根据 ssllabs.com,我的网站被识别为具有 TLS 1.2 协议。

我添加到我的网站以验证的 Stripe 示例代码是:

\Stripe\Stripe::setApiKey("sk_test_BQokikJOvBiI2HlWgH4olfQ2");
    try {
        \Stripe\Charge::all();
        echo "TLS 1.2 supported, no action required.";
    } catch (\Stripe\Error\ApiConnection $e) {
        echo "TLS 1.2 is not supported. You will need to upgrade your integration.";
    }

我还添加了以下内容以获取更多版本信息:

echo 'PHP version: ' . phpversion() . PHP_EOL . '<br/>';
    echo 'cURL version: ' . curl_version()['version'] . PHP_EOL . '<br/>';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://www.howsmyssl.com/a/check");
    curl_setopt($ch, CURLOPT_SSLVERSION, 6);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);

    echo 'TLS version: ' . json_decode($response)->tls_version . PHP_EOL;

我运行的结果是:

============= Stripe Suggested Test Code ============
TLS 1.2 is not supported. You will need to upgrade your integration.
================================================
==================== Version Code ===================
PHP version: 7.0.33-0+deb9u3 
cURL version: 7.52.1 
TLS version: TLS 1.2 
================================================

在这一点上,我的想法已经不多了。为了全面披露,我的大部分学习都是通过 Google 搜索和这个网站完成的,因此我们将不胜感激任何业余编码员级别的帮助。

【问题讨论】:

  • 在本地主机上运行???或现场?有 SSL 吗?
  • PHP 7.0 生命周期结束,您可能需要升级
  • 我有同样的问题,因为我手动安装了库,并且在自己修复了一些依赖项之后。最后把这个错误扔给我。但在\Stripe\HttpClient\CurlClient.php中引用方法handleCurlError($url, $errno, $message, $numRetries)

标签: php ssl stripe-payments tls1.2


【解决方案1】:

所以,看着the code 我看到了这个:

class CurlClient implements ClientInterface
{
    public function request($method, $absUrl, $headers, $params, $hasFile)
    {
        ...
        $opts[CURLOPT_CAINFO] = Stripe::getCABundlePath();
        ...
    }
}

这又将我引向this code

class Stripe
{
    // @var string Path to the CA bundle used to verify SSL certificates
    public static $caBundlePath = null;

    /**
     * @return string
     */
    private static function getDefaultCABundlePath()
    {
        return realpath(dirname(__FILE__) . '/../data/ca-certificates.crt');
    }
    /**
     * @return string
     */
    public static function getCABundlePath()
    {
        return self::$caBundlePath ?: self::getDefaultCABundlePath();
    }
    /**
     * @param string $caBundlePath
     */
    public static function setCABundlePath($caBundlePath)
    {
        self::$caBundlePath = $caBundlePath;
    }
}

这使得 Stripe 看起来出于某种原因不想使用系统 CA 路径。所以你可以:

  • 使用Stripe::setCABundlePath() 指向系统CA 包

  • 确保data/ca-certificates.crt 的 CA 包(随 Stripe 一起提供)存在并具有适当的权限。

【讨论】:

  • 是的。 github.com/stripe/stripe-php#configuring-ca-bundles 通常最好的选择是确保在安装库时包含 data/ 目录。
  • 非常感谢大家的帮助!我为此苦苦挣扎了几个星期。虽然答案并没有直接解决问题,但它揭示了我显然使用的是旧版本的代码,它没有引用数据目录中的 ca-certificates 文件[实际上没有数据目录]。在使用 Composer 从 Github 获取最新信息并清理我的自动加载指向的位置后,它又可以工作了。再次感谢!
  • use Stripe::setCABundlePath() to point to the system CA bundle你能解释一下怎么做吗?
  • 大概像Stripe::setCABundlePath("/path/to/your/system/CA/bundle")@vincentthorpe
  • 在 RHEL 系统上,系统捆绑包位于 /etc/pki/tls/certs/ca-bundle.crt。不知道其他人。
【解决方案2】:

我收到此错误消息。我通过重新安装 Stripe 库解决了这个问题。根本原因是 /data 目录丢失或损坏。

【讨论】:

    猜你喜欢
    • 2015-08-24
    • 2018-10-25
    • 2015-07-26
    • 2018-04-06
    • 2017-06-08
    • 1970-01-01
    • 2013-11-10
    • 2011-10-22
    • 2015-11-17
    相关资源
    最近更新 更多