Как исправить ошибку Stripe: сетевая ошибка [errno 77]: ошибка установки сертификата, проверка местоположений - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь использовать 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

Недавно я создал новую виртуальную машину в Google Compute Engine, используя развертывание LAMP одним щелчком.Я также использовал 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.cainfo и openssl.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 и на этом сайте, поэтому любая помощь на уровне хобби-программиста будет принята.

1 Ответ

2 голосов
/ 05 апреля 2019

Итак, глядя на код я вижу это:

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

Что, в свою очередь, приводит меня к этому коду :

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 системы, или решить проблему с разрешениями (?) Для комплекта CA в data/ca-certificates.crt, который поставляется с Stripe.

...