2012-03-19 12 views
9

के साथ काम नहीं कर रहा है मुझे अपने विकास सर्वर पर समस्याएं आ रही हैं, जहां curl, कुछ भी HTTP के साथ पूरी तरह से काम करते समय, HTTPS के साथ ठीक से काम नहीं करता है-यहां तक ​​कि विभिन्न प्रोटोकॉल के साथ सटीक समान संसाधन (परीक्षण I के लिए ' http और https दोनों का उपयोग करके google.com का अनुरोध कर रहे हैं)।PHP curl HTTPS

लौटाई गई कर्ल त्रुटि 35 है: "एसएसएल/टीएलएस हैंडशेक में कहीं समस्या आई।"

मैंने समाधान के लिए वेब और एसओ को कॉम्बे किया है, और उनमें से सभी को या तो CURLOPT_SSL_VERIFYPEER को गलत करने के लिए सेट किया गया है, जो कुछ भी नहीं बदलता है, या प्रमाणपत्र फ़ाइल डाउनलोड करने और CURLOPT_CAINFO को अपने पथ पर सेट करने के लिए, जो कुछ भी नहीं बदलता है।

प्रमाण पत्र सेट करते समय, मैंने this tutorial और this tutorial के निर्देशों का पालन किया, दोनों संसाधनों के लिए प्रमाण पत्र डाउनलोड करने और प्रमाण पत्र बंडल डाउनलोड करने का प्रयास करने का प्रयास किया।

मैं भी स्पष्ट रूप से अन्य विकल्प मैं सेट CURLOPT_VERBOSE = सच है, CURLOPT_RETURNTRANSFER = सच है, और CURLOPT_SSL_VERIFYHOST = 2 (मैं 1 के प्रत्येक संयोजन की कोशिश की है, और 2 हैं मेरे सवाल का, की पूर्णता के लिए 443 के CURLOP_PORT स्थापित करने की कोशिश की है VERIFYPEER दोनों सच और झूठी के साथ)। मैंने phpinfo() में भी यह सुनिश्चित किया है कि मेरे पास ओपनएसएसएल है और यह सक्षम है।

मैं अपने पुराने उत्पादन सर्वर पर पूरी तरह से काम करने वाले बहुत पुराने कोड का उपयोग कर रहा हूं, इसलिए इस कोड ने पहले काम किया है। लेकिन उस होस्टिंग को होस्टिंग साझा किया गया था और मुझे वहां अधिकांश कॉन्फ़िगरेशन नहीं पता है।

+0

क्या आप एक ही यूआरएल तक पहुंच रहे हैं? आपने इस मुद्दे में भाग लेने पर किए गए अधिकांश शोधों को मारा है। – Jason

+0

मैंने http: // www.google.com दोनों का उपयोग किया, जो काम करता था; और https: // www.google.com, जो नहीं था। – spezied

+0

@ स्पीज्ड, अगर आपूर्ति किए गए उत्तर आपके प्रश्न का उत्तर देते हैं, तो क्या आप इसे अपने उत्तर के रूप में चुन सकते हैं ताकि प्रश्न बंद किया जा सके? धन्यवाद। –

उत्तर

8

इसके बारे में कैसे। यह मेरे लिए HTTPS Google मुखपृष्ठ लाता है। यह आपके लिए चाल करना चाहिए।

<?PHP 

// connect via SSL, but don't check cert 
$handle=curl_init('https://www.google.com'); 
curl_setopt($handle, CURLOPT_VERBOSE, true); 
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false); 
$content = curl_exec($handle); 

echo $content; // show target page 
?> 
+1

ऊपर मेरा जवाब देखें, प्रमाण पत्र को अनदेखा करना सबसे अच्छा विकल्प नहीं है। – Ray

+3

यह असुरक्षित है। यह मत करो। हमेशा सहकर्मी और मेजबान की पुष्टि करें। अन्य जवाब देखें। –

+5

@ मैट। निर्भर करता है कि आप क्या कर रहे हैं। वित्त के लिए महत्वपूर्ण सामान को स्थानांतरित करना, निश्चित रूप से HTTPS को मान्य करना। एक खुदरा विक्रेता साइट से जूता ब्रांड स्क्रैपिंग ... एमआईटीएम एक समस्या नहीं होनी चाहिए। जाहिर है समस्या संदर्भ पर विचार करें। –

16

कर्ल में अंतर्निहित रूट प्रमाणपत्र नहीं हैं (जैसे अधिकांश आधुनिक ब्राउज़र करते हैं)। आप स्पष्ट रूप से एक cacert.pem फाइल करने के लिए यह इंगित करने के लिए की जरूरत है:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cert/file/cacert.pem'); 

इस के बिना, कर्ल प्रमाणपत्र सत्यापित नहीं कर सकते हैं ssl के माध्यम से वापस भेज दिया। प्रत्येक बार जब आप कर्ल में एसएसएल का उपयोग करते हैं तो यह रूट रूट प्रमाणपत्र फ़ाइल का उपयोग किया जा सकता है।

आप cacert.pem फ़ाइल यहाँ प्राप्त कर सकते: http://curl.haxx.se/docs/caextract.html

+0

क्यों न केवल '--insecure' ध्वज के बराबर उपयोग करें? क्या कोई है? – Pacerier

+1

@ झुकाव सेटिंग 'CURLOPT_SSL_VERIFYPEER' झूठी है, ठीक है '--insecure' ध्वज कमांड लाइन पर है। यदि आप अपने गंतव्य सर्वर – Ray

+0

की प्रामाणिकता की परवाह करते हैं तो आप ऐसा नहीं करना चाहते हैं, यह काम नहीं करता है। जबकि 'CURLOPT_SSL_VERIFYPEER'' false' करने के लिए होता है। – n8bar

2

का पता लगाएं अपने OS प्रमाण पत्र की एक निर्देशिका भी शामिल है। यदि ऐसा है तो आवश्यक सीए certs अक्सर पहले से ही शामिल किया जाएगा। उबंटू पर, उदाहरण के लिए, यह आमतौर पर /etc/ssl/certs है। यदि यह निर्देशिका मौजूद है, तो CA पथ पैरामीटर सेट करें:

curl_setopt($ch, CURLOPT_CAPATH, '/etc/ssl/certs'); 

वैकल्पिक रूप से आप एक एकल CA प्रमाणपत्र फ़ाइल का संदर्भ दे सकते हैं। अपनी प्रोजेक्ट में cacert.pem फ़ाइल शामिल करें या इसे अपने सर्वर पर इंस्टॉल करें। एक विश्वसनीय स्रोत से डाउनलोड करें, उदा। cacert.org। एक एकल फाइल CAPATH सेट और बदले नहीं करते केवल CAINFO सेट:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem'); 

सहकर्मी और मेजबान सत्यापन बंद करना एक त्वरित लेकिन असली समस्या का असुरक्षित समाधान नहीं है। ये सुविधाएं अच्छे कारण के लिए मौजूद हैं: इसलिए आप तीसरे पक्ष के माध्यम से भरोसा कर सकते हैं, कि जिस सिस्टम से आप कनेक्ट कर रहे हैं वह वह है जिसे आप उम्मीद करते हैं।

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);