#php #ssl #stripe-payments #tls1.2
#php #ssl #stripe-платежи #tls1.2
Вопрос:
Я пытаюсь использовать Stripe на своем сайте, но получаю следующую ошибку:
Fatal error:
Uncaught StripeErrorApiConnection: 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): StripeHttpClientCurlClient->handleCurlError('https://api.str...', 77, 'error setting c...', 0)
#1 /var/www/html/assets/vendor/stripe/lib/HttpClient/CurlClient.php(203): StripeHttpClientCurlClient->executeRequestWithRetries(Array, 'https://api.str...')
#2 /var/www/html/assets/vendor/stripe/lib/ApiRequestor.php(364): StripeHttpClientCurlClient->request('post', 'https://api.str...', Array, Array, false)
#3 /var/www/html/assets/vendor/stripe/lib/ApiRequestor.php(96): StripeApiRequestor->_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, который я добавил на свой сайт для проверки, является:
StripeStripe::setApiKey("sk_test_BQokikJOvBiI2HlWgH4olfQ2");
try {
StripeCharge::all();
echo "TLS 1.2 supported, no action required.";
} catch (StripeErrorApiConnection $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. запуск на localhost??? или в реальном времени? наличие SSL?
2. Срок службы PHP 7.0 истек, возможно, вы захотите посмотреть на обновление
3. У меня такая же проблема, потому что я установил библиотеки вручную и после исправления некоторых зависимостей самостоятельно. Наконец, выдайте мне эту ошибку. Но ссылается на
StripeHttpClientCurlClient.php
методhandleCurlError($url, $errno, $message, $numRetries)
Ответ №1:
Итак, глядя на код, я вижу это:
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 по какой-то причине не хочет использовать путь к системному центру сертификации. Таким образом, вы можете:
- используйте
Stripe::setCABundlePath()
, чтобы указать на системный пакет CA
или
- убедитесь, что пакет CA в
data/ca-certificates.crt
(который поставляется с Stripe) присутствует и имеет соответствующие разрешения.
Комментарии:
1. Да. github.com/stripe/stripe-php#configuring-ca-bundles Обычно лучший вариант — обязательно включить этот
data/
каталог при установке библиотеки.2. Большое вам всем спасибо за помощь! Я боролся с этим пару недель. Хотя ответы напрямую не устранили проблему, это пролило свет на тот факт, что я, по-видимому, использовал более старую версию кода, в которой не было ссылки на файл ca-certificates в каталоге данных [на самом деле каталога данных не было]. После получения последней версии с Github с помощью Composer и очистки того места, где была указана моя автозагрузка, он снова работает. Еще раз спасибо!
3.
use Stripe::setCABundlePath() to point to the system CA bundle
можете ли вы объяснить, как это сделать?4. Предположительно что-то вроде
Stripe::setCABundlePath("/path/to/your/system/CA/bundle")
@vincentthorpe5. В системах RHEL системный пакет находится в
/etc/pki/tls/certs/ca-bundle.crt
. Понятия не имею о других.
Ответ №2:
У меня было это сообщение об ошибке. Я решил это, переустановив библиотеку Stripe. Основной причиной был отсутствующий или поврежденный каталог /data.