2011-08-12 13 views
14

के साथ HTTPS अनुरोध मैं अपने C++ एप्लिकेशन से https://mtgox.com/api/0/data/ticker.php पर टिकर प्रतीक पढ़ने की कोशिश कर रहा हूं। मैं Boost.Asio और OpenSSL का उपयोग करता हूं क्योंकि सेवा को HTTPS की आवश्यकता होती है।Boost.Asio और OpenSSL

बूस्ट संस्करण: 1.47.0

OpenSSL: 1.0.0d [8 फ़र, 2011] Win32

आवेदन के लिए; मैं से http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/example/ssl/client.cpp आरंभ करने के लिए उदाहरण ले लिया और इसे संशोधित इस प्रकार है:

यह वह जगह है जहाँ मैं से कनेक्ट करना चाहते:

boost::asio::ip::tcp::resolver::query query("mtgox.com", "443"); 

मैं किसी से सत्यापन सेट क्योंकि हाथ मिलाना अन्यथा विफल रहता है। मुझे यकीन नहीं है कि यह mtgox के साथ एक समस्या है या यह कार्यान्वयन वास्तव में सख्त है क्योंकि जब मैं स्क्रीन पर प्रमाणपत्र मुद्रित करता हूं तो यह कानूनी लगता है (और टिकर पेज पर जाकर क्रोम में कोई समस्या नहीं है)।

std::stringstream request_; 

request_ << "GET /api/0/data/ticker.php HTTP/1.1\r\n"; 
request_ << "Host: mtgox.com\r\n"; 
request_ << "Accept-Encoding: *\r\n"; 
request_ << "\r\n"; 

boost::asio::async_write(socket_, boost::asio::buffer(request_.str()), boost::bind(&client::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); 

(पूर्ण कोड: http://pastebin.com/zRTTqZVe)

मैं निम्न त्रुटि प्राप्त:

Connection OK! 
Verifying: 
/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority 
Sending request: 
GET /api/0/data/ticker.php HTTP 1.1 
Host: mtgox.com 
Accept-Encoding: * 

Sending request OK! 

Read failed: An existing connection was forcibly closed by the remote host 

मैं में जा रहा हूँ

socket_.set_verify_mode(boost::asio::ssl::context::verify_none); 

यह अनुरोध मैं भेज है इसके साथ सही दिशा? त्रुटि संदेश समस्या का वास्तव में वर्णनात्मक नहीं है और मुझे नहीं पता कि मैंने कौन सा कदम गलत किया है।

अद्यतन:

curl --trace-ascii out.txt https://mtgox.com/api/0/data/ticker.php 

(पूर्ण उत्पादन: http://pastebin.com/Rzp0RnAK) सत्यापन के दौरान विफल रहता है मैं देखना क्या गलत हुआ cURL इस्तेमाल किया। जब मैं "असुरक्षित" पैरामीटर

curl --trace-ascii out.txt -k https://mtgox.com/api/0/data/ticker.php 

(पूर्ण उत्पादन: http://pastebin.com/JR43A7ux) के साथ कनेक्ट

सब कुछ ठीक काम करता है।

फिक्स:

  1. मैं HTTP हेडर
  2. में टाइपो तय मैं मूल प्रमाणपत्र जोड़ा गया है और पीठ पर एसएसएल सत्यापन बदल गया।
+2

आपने कुंजी क्यों उत्पन्न की? आप कुछ भी हस्ताक्षर नहीं कर रहे हैं, सर्वर है। हालांकि आपको सर्वर के रूट प्रमाण पर भरोसा करना होगा। –

+1

क्या आपने उस अनुरोध को भेजने का प्रयास किया है उदाहरण के लिए कर्ल के माध्यम से यह देखने के लिए कि सर्वर इसे स्वीकार करता है या नहीं? –

+0

अच्छा विचार! मैंने सवाल अपडेट किया है। – Maarten

उत्तर

10

संक्षेप में:

  1. आप "HTTP 1.1" "HTTP/1.1" के बजाय भेज सकते हैं। सर्वर निश्चित रूप से आपके अनुरोध को अस्वीकार करने के लिए पर्याप्त है। आपके अनुरोध और कर्ल के बीच अन्य अंतर हैं, आपको उन पैरा को भी बदलने की आवश्यकता हो सकती है - भले ही वे मेरे लिए मान्य हों।

  2. हो सकता है कि ओपनएसएसएल में क्रोम के विपरीत सर्वर द्वारा उपयोग किए जाने वाले रूट प्रमाणपत्र नहीं हैं, और यही कारण है कि सत्यापन विफल हो रहा है।

विवरण:

  1. एक काम और गैर काम कर रहे उपकरण, आप हमेशा की तुलना करनी चाहिए क्या हो रहा है यह देखते हुए। यहां आपके पास कर्ल का आउटपुट और आपका अनुरोध है - उन्हें तुलना करने से कई मतभेद दिखाई दिए; आमतौर पर, एन्क्रिप्टेड कनेक्शन के साथ भी, आप एक शक्तिशाली पैकेट स्निफर का उपयोग कर सकते हैं जैसे कि वायरशर्क, जो पैकेट से जितना संभव हो उतना जानकारी डीकोड करता है। यहां यह देखने की अनुमति होगी कि सर्वर वास्तव में कम पैकेट भेज रहा है (मुझे उम्मीद है); एक और संभावना यह थी कि आपके क्लाइंट को सर्वर द्वारा भेजा गया डेटा नहीं मिल रहा था (कहें क्योंकि क्लाइंट में कुछ बग था)।

  2. यदि मैं सही ढंग से समझता हूं, तो कर्ल केवल दिखाता है कि आपको सत्यापन अक्षम करने की आवश्यकता क्यों है, है ना? सर्टिफिकेट क्रोम पर भी मेरे लिए मान्य दिखता है, लेकिन रूट प्रमाणन प्राधिकरण काफी अज्ञात है; कर्ल "सीए प्रमाण" का उल्लेख करता है, यानी प्रमाणन प्राधिकरण का प्रमाण पत्र। रूट प्रमाणपत्र विश्वसनीय है क्योंकि यह क्लाइंट पर प्रमाणपत्र डीबी में पहले से मौजूद है - मुझे लगता है कि क्रोम ओपनएसएसएल की तुलना में अधिक पूर्ण डीबी हो सकता है (जिसका उपयोग कर्ल और आपके प्रोग्राम दोनों द्वारा किया जाता है)।

+0

धन्यवाद! मैंने टाइपो को ठीक किया और एसएसएल "संदर्भ" के रूप में हालिया रूट प्रमाण पत्र जोड़ा, सब कुछ ठीक काम करता है :)। – Maarten