2016-02-01 17 views
6

Vì 3 ngày tôi không thể kết nối với hộp cát paypal. Tôi phát hiện ra rằng họ có thể vô hiệu hóa sự hỗ trợ cho SSLv3. Vì vậy, tôi đã cố gắng để thay đổi phiên bản SSL trong Yêu cầu curl của tôi bằng cách thiết lập:Php curl set ssl version

curl_setopt($curl, CURLOPT_SSLVERSION,1); # 1 = TLSv1 

Nhưng nó vẫn cho tôi những lỗi tương tự:

error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure 

Bất cứ ý tưởng tại sao kịch bản vẫn sử dụng SSLv3?

Tôi đang sử dụng php 5.5 và các phiên bản curl sau (hiện tại hỏi hoster của tôi [quản lý lưu trữ tại 1 & 1] để nâng cấp lên phiên bản mới hơn)

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 Giao thức: tệp dict ftp ftps http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp Tính năng: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

Trả lời

3

Vấn đề là PayPal đã giảm hỗ trợ SSLv3, TLS 1.0 và TLS 1.1 và hiện chỉ hỗ trợ TLS 1.2 nhưng phiên bản OpenSSL cURL là được xây dựng với (0.9.8o) không hỗ trợ TLS.

Tại thời điểm này, tất cả những gì bạn có thể làm là hy vọng máy chủ có thể cập nhật OpenSSL, cURL và PHP lên phiên bản OpenSSL mới hơn (1.0+).

Hiện tại, máy khách cURL của bạn không nói TLS được yêu cầu bởi PayPal và không có cách nào khác ngoài việc cập nhật OpenSSL.

+0

Giải pháp duy nhất là phải nâng cấp lên một phiên bản mới hơn CURL bao gồm OpenSSL 1.0 trở lên. Cảm ơn vì lời khuyên :) – inf3ction

2

Có cùng vấn đề.

<?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; 

phản ứng:

bool(false) 

và không có lỗi bản ghi!

Vì vậy, tôi đã thực hiện kịch bản nhỏ:

<?php 
error_reporting(E_ALL); 
var_dump(file_get_contents('https://api-3t.sandbox.paypal.com/nvp')); 

và đây là những gì tôi đã có trong nhật ký:

[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 

Giải pháp của tôi là:

  1. Cập nhật (1.0 trở lên) phiên bản OpenSSL.
  2. biên dịch lại Curl
  3. biên dịch PHP với CURL mới
  4. Hãy chắc chắn rằng Curl SSL Phiên bản OpenSSL/(1.0+)

SSL Version OpenSSL/1.0.1e - Tốt

SSL Phiên bản NSS/3.13.6.0 - Bad

Tôi đang chạy trên CentOS.Dưới đây là những gì tôi đã làm để cập nhật:

  1. Cập nhật OpenSSL:

    phiên bản openssl

nếu dưới 1,0 chạy: yum update openssl chắc chắn rằng nó thực sự được cập nhật

  1. Cài đặt lại PHP. Vì vậy, hãy lưu tập tin php.ini
  2. Lưu danh sách tất cả các mô-đun PHP được cài đặt qua:

    Danh sách yum được cài đặt | grep php

lưu đầu ra!

  1. yum erase php
  2. yum xóa php-curl
  3. yum install php
  4. yum install php-curl

  5. restart apache hoặc fpm và nếu bạn may mắn, bạn sẽ có được những điều làm việc

  6. khôi phục cấu hình php.ini và mô-đun PHP: yum install php-pgsql; yum cài đặt php-gd; vv

Tuy nhiên nếu gói lưu trữ của bạn đã lỗi thời hoặc bạn có thư viện curl được cài đặt với các ràng buộc SSL NSS, bạn có thể tải xuống và biên dịch thư viện curl theo cách thủ công. Tôi đã sử dụng công cụ phpize đi kèm với gói php-devel. Vì vậy, vấn đề của tôi Tôi đã có:

cURL Information 7.19.7 
SSL Version  NSS/3.13.6.0 

và đây là cách tôi đã thay đổi nó để:

cURL Information 7.22.0 
SSL Version  OpenSSL/1.0.1e 
  1. Cập nhật OpenSSL:

    phiên bản openssl

nếu chạy dưới 1.0: cập nhật y openssl đảm bảo rằng nó thực sự được cập nhật

  1. Cài đặt lại PHP. Vì vậy, hãy lưu tập tin php.ini
  2. Lưu danh sách tất cả các mô-đun PHP được cài đặt qua:

    Danh sách yum được cài đặt | grep php

lưu đầu ra!

  1. yum erase php
  2. yum xóa php-curl
  3. yum install php-devel
  4. in PHP phiên bản với rpm -qa --queryformat '% { phiên bản}' php và tìm nơi bạn có thể tải về chính xác cùng một nguồn PHP
  5. Tiếp theo kịch bản bash sẽ cài đặt thư viện curl cụ thể:

<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. restart apache hoặc fpm và nếu bạn may mắn, bạn sẽ có được những điều làm việc
  2. khôi phục configs php.ini và các module PHP: yum install php-pgsql ; yum cài đặt php-gd; vv
1

Hoàn hảo, tôi muốn LibCurl sử dụng OpenSSL thay vì NSS, điều này đã giúp tôi sửa lỗi để chỉnh sửa php libcurl sử dụng OpenSSL.

My Centos7 PHP 5.6 là sử dụng

php -r "print_r(curl_version());" | grep ssl_version 
[ssl_version_number] => 0 
[ssl_version] => NSS/3.19.1 Basic ECC 

và sau khi sửa chữa trên, nó cho thấy, đây là những gì tôi muốn.

php -r "print_r(curl_version());" | grep ssl_version 
[ssl_version_number] => 0 
[ssl_version] => OpenSSL/1.0.1f 

Đây là kịch bản sửa đổi mà tôi đã sử dụng trên Centos7 với 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}*