如何修复Stripe错误:网络错误[errno 77]:错误设置证书验证位置

时间:2019-04-05 15:13:50

标签: php ssl stripe-payments tls1.2

我正在尝试在我的网站上使用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搜索和该网站进行大部分学习,因此希望您能从业余编码人员的角度获得帮助。

2 个答案:

答案 0 :(得分:1)

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

t1 <- t[order(as.integer(names(t)))]

依次将我引向this code

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

这使Stripe出于某种原因不想使用系统CA路径。因此,您可以使用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; } } 指向系统CA捆绑软件,或解决Stripe随附的Stripe::setCABundlePath()中的CA捆绑软件上的权限(?)问题。

答案 1 :(得分:1)

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