Php curl set ssl версия
С 3 дней я не могу подключиться к песочнице paypal. Я узнал, что они, возможно, разделили поддержку SSLv3. Поэтому я попытался изменить версию SSL в моем запросе curl, установив:
curl_setopt($curl, CURLOPT_SSLVERSION,1); # 1 = TLSv1
но это все равно дает мне ту же ошибку:
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
есть идеи, почему скрипт все еще использует SSLv3 ?
Я использую php 5.5 и следующую версию curl ( в настоящее время запрашиваю у моего хостера [ управляемый хостинг в 1&1 ] для обновления до более новой версия)
завиток 7.21.0 (i486-ПК-Линукс-гну) libcurl использует/7.21.0 в OpenSSL/0.9.8 o для работы с zlib/1.2.3.4 этот пакет содержит символы отладки/1.15 libssh2/1.2.6 Протоколы: файл dict ФЦП ФЦП по HTTP протоколу HTTPS, IMAP и imaps LDAP и ldaps с протоколами POP3 pop3s протоколов RTSP протокол SCP и SFTP протоколам SMTP протокола smtps через telnet сервер TFTP Особенности: ГСС-согласование ИДН Largefile протокол IPv6 протокол NTLM протокол SSL сайт libz
3 ответов
проблема в том, что PayPal отказался от поддержки SSLv3, TLS 1.0 и TLS 1.1 и теперь поддерживает только TLS 1.2, но cURL версии OpenSSL построен с (0.9.8o
) не поддерживает TLS.
на данный момент все, что вы можете сделать, это надеяться, что хост может обновить OpenSSL, cURL и PHP до более новой (1.0+) версии OpenSSL.
как сейчас, ваш клиент cURL не говорит TLS, который требуется PayPal, и нет никаких способов обойти его, кроме обновления OpenSSL.
была такая же проблема.
<?php
error_reporting(E_ALL);
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_URL, 'https://api-3t.sandbox.paypal.com/nvp');
$response = curl_exec($curl);
var_dump($response);
exit;
ответ:
bool(false)
и никаких журналов ошибок!
Итак, я сделал небольшой скрипт:
<?php
error_reporting(E_ALL);
var_dump(file_get_contents('https://api-3t.sandbox.paypal.com/nvp'));
а вот что у меня в логах:
[12-Feb-2016 15:56:19] PHP Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure in /xxx/yyy.php on line 3
[12-Feb-2016 15:56:19] PHP Warning: file_get_contents(): Failed to enable crypto in /xxx/yyy.php on line 3
[12-Feb-2016 15:56:19] PHP Warning: file_get_contents(https://api-3t.sandbox.paypal.com/nvp): failed to open stream: operation failed in /xxx/yyy.php on line 3
мое решение было:
- Обновление (1.0+) версии OpenSSL.
- Перекомпилировать Curl
- перекомпилировать PHP с новым CURL
- убедитесь, что версия curl SSL OpenSSL / (1.0+)
SSL версия OpenSSL / 1.0.1 e-Good
SSL версия NSS / 3.13.6.0-Bad
Я бегу на CentOS. Вот что я сделал, чтобы обновить:
-
Обновление OpenSSL:
openssl версия
если ниже 1.0 run: yum update openssl убедитесь, что он действительно обновлен
- переустановить PHP. Так что сохраните php.ini-файл
-
сохранить список всех модулей PHP устанавливается через:
список Yum установлен | grep php
сохранить выход!
- yum стереть php
- Yum стереть php-curl
- yum установить php
yum установить php-curl
перезапустите apache или fpm, и если Вам повезет, вы получите работу
- восстановить php.ini configs и PHP модули: yum install php-pgsql; yum install РНР-Г-сподь; и т. д.
однако, если ваши репозитории пакетов устарели или у вас установлена библиотека curl с привязками NSS SSL, вы можете загрузить и скомпилировать библиотеку curl вручную. Я использовал phpize инструмент в комплекте с пакетом php-devel. Так что моя проблема у меня была:
cURL Information 7.19.7
SSL Version NSS/3.13.6.0
а вот как я изменил его на:
cURL Information 7.22.0
SSL Version OpenSSL/1.0.1e
-
Обновление OpenSSL:
openssl версия
если ниже 1.0 запуск: Yum обновление openssl убедитесь, что он действительно обновлен
- переустановить PHP. Так что сохраните php.ini-файл
-
держите список всех модулей PHP, установленных через:
список Yum установлен | grep php
сохранить выход!
- yum стереть php
- Yum стереть php-curl
- yum установить php-devel
- версия PHP печати с rpm-qa -- queryformat '%{version} ' php и найти, где вы можете скачать точно такие же источники PHP
- следующий скрипт bash установит определенную библиотеку curl:
<pre>
#!/bin/bash
PHP_VERSION=$(rpm -qa --queryformat '%{version}' php)
CURL_VERSION=7.22.0
#echo $CURL_VERSION
#exit
#wget --no-check-certificate http://mirror.cogentco.com/pub/php/php-${PHP_VERSION}.tar.gz -O /tmp/php-${PHP_VERSION}.tar.gz
wget --no-check-certificate http://museum.php.net/php5/php-${PHP_VERSION}.tar.gz -O /tmp/php-${PHP_VERSION}.tar.gz
wget --no-check-certificate http://curl.haxx.se/download/curl-${CURL_VERSION}.tar.gz -O /tmp/curl-${CURL_VERSION}.tar.gz
cd /tmp; tar xzf php-${PHP_VERSION}.tar.gz
cd /tmp; tar xzf curl-${CURL_VERSION}.tar.gz
cd curl-${CURL_VERSION}
./configure
make
make install
cd /tmp; rm -rf curl-${CURL_VERSION}*
sleep 2
cd /tmp/php-${PHP_VERSION}/ext/curl/
phpize
./configure
make
make install
cd /tmp; rm -rf php-${PHP_VERSION}*
</pre>
- перезапустите apache или fpm, и если Вам повезет, вы получите работу
- восстановить php.Ини конфиги и модулей PHP: ням установить PHP-список pgsql; ням установить PHP-Б-г; и т. д.
идеально, я хотел, чтобы LibCurl использовал OpenSSL вместо NSS, это помогло мне исправить его, чтобы настроить php libcurl для использования OpenSSL.
мой Centos7 PHP 5.6 использовал
php -r "print_r(curl_version());" | grep ssl_version
[ssl_version_number] => 0
[ssl_version] => NSS/3.19.1 Basic ECC
и после выше исправить, он показывает, это то, что я хотел.
php -r "print_r(curl_version());" | grep ssl_version
[ssl_version_number] => 0
[ssl_version] => OpenSSL/1.0.1f
вот пересмотренный скрипт, который я использовал на Centos7 с PHP 5.6.17
#!/bin/bash
PHP_VERSION=$(rpm -qa --queryformat '%{version}' php56)
CURL_VERSION=$(curl -V|head -1|awk '{print }')
wget --no-check-certificate http://mirror.cogentco.com/pub/php/php-5.6.17.tar.bz2 -O /tmp/php-${PHP_VERSION}.tar.bz2
wget --no-check-certificate http://curl.haxx.se/download/curl-${CURL_VERSION}.tar.gz -O /tmp/curl-${CURL_VERSION}.tar.gz
cd /tmp; tar xjf php-${PHP_VERSION}.tar.bz2
cd /tmp; tar xzf curl-${CURL_VERSION}.tar.gz
cd curl-${CURL_VERSION}
./configure
make
make install
cd /tmp; rm -rf curl-${CURL_VERSION}*
sleep 2
cd /tmp/php-${PHP_VERSION}/ext/curl/
phpize
./configure
make
make install
cd /tmp; rm -rf php-${PHP_VERSION}*