Php curl устанавливает версию ssl

Уже 3 дня не могу подключиться к песочнице PayPal. Я узнал, что они, возможно, отключили поддержку SSLv3. Итак, я попытался изменить версию SSL в моем запросе на завивку, установив:

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] перейти на более новую версию)

curl 7.21.0 (i486-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6 Протоколы: файл dict ftp ftps http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp Возможности: GSS-согласование IDN IPv6 Largefile NTLM SSL libz


person Ephenodrom    schedule 01.02.2016    source источник


Ответы (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.

person drew010    schedule 01.02.2016
comment
Единственное решение — перейти на более новую версию CURL, включающую OpenSSL 1.0+. Спасибо за совет :) - person Ephenodrom; 02.02.2016

Была такая же проблема.

    <?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. Обновить (1.0+) версию OpenSSL.
  2. Перекомпилировать Curl
  3. Перекомпилируйте PHP с новым CURL
  4. Убедитесь, что версия Curl SSL — OpenSSL/(1.0+)

Версия SSL OpenSSL/1.0.1e — Хорошо

Версия SSL NSS/3.13.6.0 — Плохая

Я работаю на CentOS. Вот что я сделал для обновления:

  1. Обновите OpenSSL:

    версия openssl

если ниже 1.0 запустите: yum update openssl убедитесь, что он действительно обновлен

  1. Переустановите PHP. Так что сохраните файл php.ini
  2. Сохраните список всех модулей PHP, установленных через:

    установлен список ням | grep php

сохранить вывод!

  1. ням стереть php
  2. ням стереть php-curl
  3. ням установить php
  4. ням установить php-curl

  5. перезапустите apache или fpm, и если вам повезет, все заработает.

  6. восстановить конфиги php.ini и модули PHP: yum install php-pgsql; ням установить php-gd; и т.д

Однако, если ваши репозитории пакетов устарели или у вас установлена ​​библиотека 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 
  1. Обновите OpenSSL:

    версия openssl

если ниже 1.0 запустите: yum update openssl убедитесь, что он действительно обновлен

  1. Переустановите PHP. Так что сохраните файл php.ini
  2. Сохраните список всех модулей PHP, установленных через:

    установлен список ням | grep php

сохранить вывод!

  1. ням стереть php
  2. ням стереть php-curl
  3. ням установить php-devel
  4. распечатайте версию PHP с помощью rpm -qa --queryformat '%{version}' php и найдите, где вы можете скачать точно такие же исходники PHP
  5. Следующий скрипт 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>

  1. перезапустите apache или fpm, и если вам повезет, все заработает.
  2. восстановить конфиги php.ini и модули PHP: yum install php-pgsql; ням установить php-gd; и т.д
person Alex Shulak    schedule 25.02.2016

Отлично, я хотел, чтобы 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 $2}')
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}*
person Sree    schedule 20.05.2016