2016-02-01 9 views
6

3 दिनों से मैं पेपैल सैंडबॉक्स से कनेक्ट नहीं कर सकता। मुझे पता चला कि वे एसएसएलवी 3 के लिए समर्थन को असंतुष्ट कर सकते हैं। तो मैं सेट करके मेरी कर्ल अनुरोध में SSL संसकरण बदलने की कोशिश की:PHP कर्ल सेट एसएसएल संस्करण

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

लेकिन यह अभी भी मुझे एक ही त्रुटि दे:

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

किसी भी विचार क्यों स्क्रिप्ट अभी भी SSLv3 उपयोग कर रहा है?

मैं php 5.5 का उपयोग कर रहा है और निम्नलिखित कर्ल संस्करण (वर्तमान में मेरे होस्टर में पूछ [1 & 1 पर होस्टिंग प्रबंधित] एक नए संस्करण में अपग्रेड करने के लिए)

कर्ल 7.21.0 (i486-पीसी-Linux- gnu) libcurl/7.21.0 ओपनएसएसएल/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 विशेषताएं: जीएसएस-नेगोशिएट आईडीएन आईपीवी 6 लार्जफाइल एनटीएलएम एसएसएल libz

उत्तर

3

समस्या यह है कि पेपैल ने एसएसएलवी 3, टीएलएस 1.0 और टीएलएस 1.1 के लिए समर्थन छोड़ दिया और अब केवल टीएलएस 1.2 का समर्थन करता है लेकिन ओपनएसएसएल संस्करण कर्ल (0.9.8o) के साथ बनाया गया टीएलएस का समर्थन नहीं करता है।

इस बिंदु पर आप उम्मीद कर सकते हैं कि होस्ट ओपनएसएसएल, कर्ल और PHP को ओपनएसएसएल के एक नए (1.0+) संस्करण में अपडेट कर सकता है।

जैसा कि यह अभी खड़ा है, आपका कर्ल क्लाइंट टीएलएस नहीं बोलता है जो पेपैल द्वारा आवश्यक है और ओपनएसएसएल को अपडेट करने के अलावा इसके आसपास कोई रास्ता नहीं है।

+0

एकमात्र समाधान एक नए कर्ल संस्करण वाले OpenSSL शामिल 1.0+ को उन्नत करने के लिए है के साथ Centos7 पर इस्तेमाल किया गया है। सलाह के लिए धन्यवाद :) – inf3ction

2

एक ही समस्या थी।

<?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+) ओपनएसएसएल का संस्करण।
  2. पुन: संयोजित कर्ल
  3. नई कर्ल के साथ
  4. पुन: संयोजित पीएचपी
  5. यकीन कर्ल SSL संसकरण OpenSSL/(1.0+)

SSL संसकरण OpenSSL/1.0.1e है - अच्छा

एसएसएल संस्करण एनएसएस/3.13.6.0 - खराब

मैं सेंटोस पर चल रहा हूं।

  1. अद्यतन OpenSSL:

    openssl संस्करण

अगर नीचे 1.0 रन: यहाँ है कि मैं क्या अद्यतन करने के लिए किया था यम अद्यतन openssl यकीन है कि यह वास्तव में अपडेट किया हुआ है

  1. PHP को पुनर्स्थापित करें। तो php.ini फ़ाइल
  2. बचाने के माध्यम से स्थापित सभी पीएचपी मॉड्यूल की एक सूची रखें:

    यम सूची स्थापित | grep php

आउटपुट सहेजें!

  1. यम मिटा php
  2. यम मिटा php-कर्ल
  3. यम स्थापित php
  4. यम स्थापित php-कर्ल

  5. पुनः आरंभ अपाचे या एफ पी एम और यदि आप भाग्यशाली हैं तो आपको

  6. php.ini कॉन्फ़िगरेशन और PHP मॉड्यूल को पुनर्स्थापित करने वाली चीजें मिलेंगी: yum php-pgsql इंस्टॉल करें; yum स्थापित php-gd; आदि

हालांकि यदि आपके पैकेज रिपॉजिटरीज पुरानी हैं या आपके पास एनएसएस एसएसएल बाइंडिंग के साथ कर्ल लाइब्रेरी स्थापित है तो आप मैन्युअल रूप से कर्ल लाइब्रेरी को डाउनलोड और संकलित कर सकते हैं। मैंने का उपयोग किया है 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 अद्यतन openssl सुनिश्चित करें कि यह वास्तव में

  1. PHP को पुनर्स्थापित करें। तो php.ini फ़ाइल
  2. बचाने के माध्यम से स्थापित सभी पीएचपी मॉड्यूल की एक सूची रखें:

    यम सूची स्थापित | grep php

आउटपुट सहेजें!

  1. यम मिटा php
  2. यम मिटा php-कर्ल
  3. यम स्थापित php-devel
  4. आरपीएम के साथ
  5. प्रिंट PHP संस्करण -qa --queryformat '% { संस्करण} 'php और जहाँ आप ठीक उसी पीएचपी सूत्रों
  6. बैश स्क्रिप्ट के बाद डाउनलोड कर सकते हैं विशिष्ट कर्ल पुस्तकालय स्थापित हो जाएगा लगता है:

<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. पुनः आरंभ अपाचे या एफ पी एम और अगर तुम भाग्यशाली हो आप काम कर
  2. php.ini कॉन्फ़िगरेशन और PHP मॉड्यूल बहाल चीजें मिल जाएगा: यम php-pgsql स्थापित ; yum स्थापित php-gd; आदि
1

बिल्कुल सही, मैं चाहता था कि लिबकर्ल एनएसएस के बजाय ओपनएसएसएल का उपयोग करें, इससे मुझे ओपनएसएसएल का उपयोग करने के लिए php libcurl को ट्विक करने में मदद मिली है।

मेरे Centos7 पीएचपी 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 

यहाँ संशोधित स्क्रिप्ट कि मैं 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}* 
संबंधित मुद्दे