2015-01-06 14 views
5

से मेल नहीं खाता है, मैंने अभी रूबी सीखना शुरू किया और कुछ बुनियादी चीजों के बाद, मैं रूबी में सेवा के लिए आरईएसटी कॉल करने को समझने की कोशिश कर रहा हूं। मैं किसी भी परेशानी के बिना चौकोर एपीआई को अनुरोध प्राप्त कर सकता हूं। दूसरी ओर सिस्को सीएमएक्स एपीआई को कॉल करने में त्रुटि मिलती है। मेरा रूबी संस्करण 2.1.2 है। मैंने वेब पर कई समाधान खोजे लेकिन अभी भी समस्या आई है। यह मेरा खोल कमांड जो मैं चलाता हूं।SSLError: होस्टनाम "W.X.Y.Z" सर्वर प्रमाणपत्र

OpenSSL::SSL::SSLError: hostname "64.103.26.61" does not match the server certificate 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/2.1.0/openssl/ssl.rb:139:in `post_connection_check' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:922:in `connect' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:863:in `do_start' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:852:in `start' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rest-client-1.7.2/lib/restclient/request.rb:413:in `transmit' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rest-client-1.7.2/lib/restclient/request.rb:176:in `execute' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rest-client-1.7.2/lib/restclient/request.rb:41:in `execute' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rest-client-1.7.2/lib/restclient.rb:65:in `get' 
from (irb):3 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rest-client-1.7.2/bin/restclient:93:in `<top (required)>' 
from /Users/apple/.rbenv/versions/2.1.2/bin/restclient:23:in `load' 
from /Users/apple/.rbenv/versions/2.1.2/bin/restclient:23:in `<main>' 

आप कुछ सलाह दे सकता है:

कार्य एक

$resclient 
>> RestClient.get 'https://api.foursquare.com/v2/venues/search?ll=40.7,-74&oauth_token=0ZDO1JMJ0PW2QTCDK50OGZ21UENHZ0Y3KIDQZJLLURTQNRQ2&v=20150106' 

यह त्रुटि

$restclient 
>> RestClient.get 'https://learning:[email protected]/api/contextaware/v1/maps/.json' 

मेरे त्रुटि लॉग देता है? आप एक ब्राउज़र के साथ अपने होस्ट करने के लिए जाना यदि आप

उत्तर

8

Could you please give some advise?

यहां पर विस्तृत जवाब और कैसे दयनीय OpenSSL::SSL::VERIFY_NONE के अलावा कुछ के साथ रूबी में इस समस्या को ठीक करने के लिए है।

$ openssl s_client -connect 64.103.26.61:443 | openssl x509 -text -noout 
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2 
... 
     Subject: C=US, ST=CA, L=San Jose, O=Cisco Systems, Inc., CN=msesandbox.cisco.com 
... 
      X509v3 Subject Alternative Name: 
       DNS:msesandbox.cisco.com 

तो उपकरण में msesandbox.cisco.com का DNS नाम है।

$ nslookup msesandbox.cisco.com 
Server:  192.168.1.1 
Address: 192.168.1.1#53 

Non-authoritative answer: 
Name: msesandbox.cisco.com 
Address: 64.103.26.61 

तो पहली बात अपने DNS नाम हुए इससे जुड़ते है क्या करना है, और नहीं एक आईपी पता: nslookup आप अपने एक अच्छा होस्ट नाम बताता है।

आप cisco.com डोमेन के लिए प्रमाणपत्र जारी (या एक अनुरोध कर सकते हैं), तो आप पूछ सकते हैं कि आईपी पते 64.103.26.61 एक विषय वैकल्पिक नाम (SAN) रूप में जोड़ दिया। तो प्रमाण पत्र में दो SAN होंगे।


अब, अगर आप वापस openssl आदेश पर जाएँ:

$ openssl s_client -connect 64.103.26.61:443 | openssl x509 -text -noout 
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2 
verify error:num=19:self signed certificate in certificate chain 
... 
    Issuer: C=US, O=HydrantID (Avalanche Cloud Corporation), CN=HydrantID SSL ICA G2 
... 
    Subject: C=US, ST=CA, L=San Jose, O=Cisco Systems, Inc., CN=msesandbox.cisco.com 

आप देखेंगे जारीकर्ता और विषय अलग हैं। इसका मतलब है कि यह एक स्वयं हस्ताक्षरित प्रमाणपत्र है। प्रमाणपत्र हाइड्रंटिड (हिमस्खलन बादल निगम) द्वारा जारी किया गया था।

यदि आप आगे देखने के लिए, आप देखेंगे जारीकर्ता की सार्वजनिक कुंजी (प्राधिकरण कुंजी पहचानकर्ता) विषय की सार्वजनिक कुंजी (विषय कुंजी पहचानकर्ता) से अलग है:

X509v3 Authority Key Identifier: 
    keyid:98:6A:B6:2D:2E:BF:A7:AA:9F:F6:F7:D6:09:AF:D5:8B:57:F9:8A:B7 
... 
X509v3 Subject Key Identifier: 
    B5:3D:50:53:0A:A2:06:9E:9A:29:89:7A:AB:96:90:FE:9D:6B:57:A0 

फिर, अपने आत्म पर हस्ताक्षर किए।


आप फिर से openssl आदेश के लिए वापस जाओ, तो आप जारीकर्ता HydrantID SSL ICA G2 है देखेंगे, और उसके जारीकर्ता QuoVadis Root CA2 G3 है:

depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2 
verify return:1 
depth=1 C = US, O = HydrantID (Avalanche Cloud Corporation), CN = HydrantID SSL ICA G2 
verify return:1 
depth=0 C = US, ST = CA, L = San Jose, O = "Cisco Systems, Inc.", CN = msesandbox.cisco.com 
verify return:1 

इसका मतलब है कि QuoVadis Root CA2 G3 जारी HydrantID SSL ICA G2; और HydrantID SSL ICA G2msesandbox.cisco.com जारी किया गया। QuoVadis Root CA2 G3 खाद्य श्रृंखला का शीर्ष है।

आप QuoVadis CA Certificate Download से QuoVadis Root CA2 G3 लाने कर सकते हैं:

$ curl -O -J -L https://www.quovadisglobal.bm/Repository/~/media/Files/Roots/quovadis_rca2g3_der.ashx 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 1380 100 1380 0  0 1808  0 --:--:-- --:--:-- --:--:-- 5726 
curl: Saved to filename 'quovadis_rca2g3_der.cer' 

$ openssl x509 -in quovadis_rca2g3_der.cer -inform DER -out quovadis-ca.pem -outform PEM 
$ cat quovadis-ca.pem 
-----BEGIN CERTIFICATE----- 
MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL 
BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc 
BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 
... 
-----END CERTIFICATE----- 

यदि आप उपकरण को प्रमाणित करने के Quovadis पर भरोसा है, तो:

$ openssl s_client -connect msesandbox.cisco.com:443 -CAfile quovadis-ca.pem 
CONNECTED(00000003) 
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2 
verify return:1 
depth=1 C = US, O = HydrantID (Avalanche Cloud Corporation), CN = HydrantID SSL ICA G2 
verify return:1 
depth=0 C = US, ST = CA, L = San Jose, O = "Cisco Systems, Inc.", CN = msesandbox.cisco.com 
verify return:1 
... 

    Start Time: 1420616960 
    Timeout : 300 (sec) 
    Verify return code: 0 (ok) 

सूचना OpenSSL Verify return code: 0 (ok) साथ समाप्त हो गया। यह आपको बताता है कि आपको अच्छी श्रृंखला मिली है। ओपनएसएसएल होस्टनाम मिलान करने का काम करता है, लेकिन हम पहले ही जानते हैं कि प्रमाणपत्र में होस्टनाम अच्छा है।


अब रूबी कोड के लिए। यहाँ

#!/usr/bin/ruby 

require 'net/http' 
require 'net/https' 
require 'openssl' 

uri = URI('https://msesandbox.cisco.com:443') 

options_mask = OpenSSL::SSL::OP_NO_SSLv2 | OpenSSL::SSL::OP_NO_SSLv3 | OpenSSL::SSL::OP_NO_COMPRESSION 

http = Net::HTTP.new(uri.host, uri.port) 
request = Net::HTTP::Get.new(uri.request_uri) 

if uri.scheme == "https" 
    http.use_ssl = true 
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER 
    http.ca_file = File.join(File.dirname(__FILE__), "quovadis-ca.pem") 
    # http.ssl_options = options_mask 
end 

response = http.request request 

और एक रन है:: तुम सब करने की ज़रूरत है रूबी में सीए प्लग है

$ ./Connect-Test.rb 
$ 

कोई छूट नहीं है, और कोई OpenSSL::SSL::VERIFY_NONE

आपको options_mask का उपयोग करने की कोशिश करनी चाहिए क्योंकि इससे कमजोर/घायल/टूटे हुए प्रोटोकॉल को हटा दिया जाता है। लेकिन कभी-कभी रूबी इतनी टूटी हुई और अनियंत्रित होती है, मैं कभी भी इसे काम करने में सक्षम नहीं हूं।


मैं दोनों HydrantID SSL ICA G2 और OpenSSL साथ QuoVadis Root CA2 G3 (जिसका अर्थ है मैं OpenSSL से एक Verify Result 0 (OK) मिला) में विश्वास जड़ कर रहा था। लेकिन रूबी केवल QuoVadis Root CA2 G3 को संभाल सकता था (यह HydrantID SSL ICA G2 पर एक श्रृंखला नहीं बना सका)। अधिक रूबी टूटी-नेस।

+0

आपके विस्तृत उत्तर के लिए धन्यवाद। अब मैं इस मुद्दे को समझता हूं। ऐसा लगता है कि इस स्व-हस्ताक्षरित प्रमाणपत्र मेरे लोकहोस्ट के लिए उचित नहीं है।मैंने प्रमाणित नामक एक मणि स्थापित किया जो इस समस्या को संभालता है (मुझे नहीं पता कि यह कैसे काम करता है) मैंने अपने कोड से OpenSSL :: SSL :: VERIFY_NONE को हटा दिया। जैसा कि आपने कहा, उत्पादन के लिए मैं QuoVadis सीए प्रमाणपत्र डाउनलोड से प्रमाण पत्र डाउनलोड करने जा रहा हूँ –

1

धन्यवाद, जैसे

> https://64.103.26.61/ 

आप आप एक ही त्रुटि प्राप्त होगी देखेंगे। इस सर्वर पर प्रमाणपत्र मान्य नहीं है, क्योंकि सर्वर प्रमाण पत्र में लिखे गए किसी अन्य होस्टनाम पर प्रतिक्रिया देता है।

यदि आप Digicert Helpcenter पर सर्वर पता दर्ज करते हैं तो आप एक और जटिल विवरण देख सकते हैं। प्रमाणपत्र msesandbox.cisco.com पर जारी किया गया है। यदि यह वह पता है जिसे आप पहुंचने का प्रयास कर रहे हैं, तो आईपी के बजाय इसका इस्तेमाल करें। यदि यह आपका सर्वर है, तो प्रतिक्रिया का नाम बदलें

+0

दुर्भाग्यवश, यह मेरा नहीं है। –

+0

फिर, RestClient.get 'https: // सीखने के माध्यम से अपना कनेक्शन सेट करने का प्रयास करें: [email protected]/api/contextaware/v1/maps/.json' या व्यवस्थापक से संपर्क करने का प्रयास करें – chenino

+0

धन्यवाद दोस्त, समस्या हल किया। मैंने कोड –

-3

ठीक है मुझे समाधान मिला। मैंने बस कोड नीचे जोड़ा और सबकुछ हल हो गया। मुझे लगता है कि समस्या सिस्को सर्वर है।

:verify_ssl => OpenSSL::SSL::VERIFY_NONE 
+2

नहीं, यह कोई समाधान नहीं है। यह * [सार्वजनिक कुंजी पिनिंग] (http://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning) जैसे समाधान का हिस्सा हो सकता है। लेकिन एक स्टैंड अकेले उपाय के रूप में, इसका कोई समाधान नहीं है। – jww

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