2012-10-17 16 views
17

के साथ कर्ल का उपयोग करें मैं एक एपीआई पर पोस्ट करने के लिए curl का उपयोग करने की कोशिश कर रहा हूं जो अभी एसएनआई का उपयोग करना शुरू कर दिया है (इसलिए वे 1 आईपी पते पर एकाधिक एसएसएल कर्ट होस्ट कर सकते हैं)।एसएनआई (सर्वर नाम संकेत)

मेरा कर्ल एसएनआई को इस कदम के परिणामस्वरूप काम करना बंद कर दिया। उन्होंने समझाया कि ऐसा इसलिए है क्योंकि curl * .domain-b.com की बजाय * .domain-a.com वापस प्राप्त कर रहा है, इसलिए SSL विफल हो जाता है।

यह कर्ल में एक बग प्रतीत होता है क्योंकि ब्राउज़र से आने पर API URL में कोई त्रुटि नहीं होती है।

इस कोड का उपयोग करना, यह करता है काम:

exec('curl -k -d "parameters=here", https://urlhere.com/', $output); 
print_r($output); 

हालांकि, -k का उपयोग कर बुरा है क्योंकि यह एसएसएल प्रमाणपत्र सत्यापन नहीं करता।

इस कोड का उपयोग करना, काम नहीं करता:

exec('curl -d "parameters=here", https://urlhere.com/', $output); 
print_r($output); 

तो मेरी सवाल है, मैं कैसे SNI साथ कर्ल का उपयोग कर सकते हैं और अभी भी (-k का उपयोग नहीं) एसएसएल सत्यापित करें। PHP या एक curl विकल्प में कोई और सेटिंग है जो मैं इस पर काम करने के लिए सेट कर सकता हूं?

उत्तर

44

SNI उपयोग करने में सक्षम होने के लिए, तीन शर्तों की आवश्यकता है:

  • कि, यह समर्थन करता है, कम से कम 7.18.1 कर्ल के एक संस्करण का उपयोग करना, change logs के अनुसार।
  • एसएनआई का समर्थन करने वाली लाइब्रेरी के विरुद्ध संकलित कर्ल के एक संस्करण का उपयोग करना, उदा। ओपनएसएसएल 0.9.8j (संकलन विकल्पों के आधार पर कुछ पुराने संस्करण)।
  • कम से कम टीएलएस 1.0 का उपयोग (एसएसएलवी 3 नहीं)।

ध्यान दें कि कर्ल के डिबग कोड (-v) केवल मुख्य संस्करण संख्या प्रदर्शित करता है (मुख्य रूप से SSLv2 और SSLv3 संदेशों के + प्रकार के बीच भेद, ssl_tls_trace देखने के लिए), तो यह अभी भी "SSLv3" प्रदर्शित करेगा या जब आप TLS 1.0 का उपयोग ऊपर (क्योंकि वे प्रभावी रूप से एसएसएल v3.1 या ऊपर हैं, 3 एक ही प्रमुख संस्करण संख्या है)।

आप जांच सकते हैं कि कर्ल का आपका स्थापित संस्करण Wireshark का उपयोग कर एसएनआई का उपयोग कर सकता है। यदि आप curl -1 https://something का उपयोग करके कनेक्शन बनाते हैं, तो यदि आप "क्लाइंट हैलो" संदेश का विस्तार करते हैं, तो आपको "server_name" एक्सटेंशन देखने में सक्षम होना चाहिए।

मैं (अपने संकलन विकल्पों के आधार पर) जब आप curl-1 बिना या -3 (SSLv3 के लिए) (TLS 1.0 के लिए) का उपयोग सुनिश्चित करें कि जो SSL/TLS वर्शन डिफ़ॉल्ट रूप से प्रयोग किया जाता है नहीं कर रहा हूँ, लेकिन आप -1 मजबूर करने के लिए कोशिश कर सकते हैं आपके आदेश पर, क्योंकि यह एसएसएलवी 3 के साथ काम नहीं करेगा।

+0

यदि आप libcurl का उपयोग करना चाहते हैं, तो 'CURLOPT_SSLVERSION' से '1' सेट करें (कमांड लाइन पर' -1' के बराबर होने के लिए)। – Bruno

+0

मेरे लिए, यह स्थापित कर्ल का पुराना संस्करण था। इसे अद्यतन करने से इसे ठीक किया गया। – Justin

+3

बीटीडब्ल्यू एसओ पर एक अच्छे जवाब का एक महान उदाहरण है। धन्यवाद –

संबंधित मुद्दे