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

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-Negotiate IDN IPv6 Largefile NTLM SSL libz

Проблема в том, что PayPal отказался от поддержки SSLv3, TLS 1.0 и TLS 1.1 и теперь поддерживает TLS 1.2, но версия OpenSSL cURL построена с ( 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. Обновите версию (1.0+) OpenSSL.
  2. Перекомпилировать завиток
  3. Перекомпилируйте PHP с новым CURL
  4. Убедитесь, что Curl SSL Version – 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, установленных через:

    список yum | grep php

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

  1. yum erase php
  2. yum erase php-curl
  3. yum install php
  4. yum install php-curl

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

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

Однако, если ваши репозитории пакетов устарели или у вас установлена ​​библиотека curl с привязками SSL NSS, вы можете загружать и компилировать библиотеку 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, установленных через:

    список yum | grep php

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

  1. yum erase php
  2. yum erase php-curl
  3. yum install 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> 

Совершенно, я хотел, чтобы 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}*