2013-01-10 14 views
21

मैं कोड:Node.js होस्टनाम/IP प्रमाण पत्र के altnames से मेल नहीं खाता

var r = require('request'); 
r({ 
    method: 'POST', 
    url: 'https://api.dropbox.com'}, 
    function() { console.log(arguments) }) 

जब मैं नोड 0.9.4 के साथ डेस्कटॉप पर चलाने के लिए, मैं इस कंसोल में मिलती है:

{ '0': [Error: Hostname/IP doesn't match certificate's altnames] } 

जब मैं इसे नेटबुक पर नोड 0.6.12 के साथ चलाता हूं, तो यह सब बिना त्रुटि के काम करता है (302 प्रतिक्रिया - मुझे लगता है कि यह सही है)।

प्रश्न में Node.js hostname/IP doesnt match certificates altnames, रोजूनेक्स लिखते हैं: "हाँ, ब्राउज़र समस्या ... क्षमा करें"। "ब्राउज़र समस्या" का क्या अर्थ है?

यूपीडी। नोड v0.8

+0

पहली टिप्पणी के जवाब में था। – SLaks

+0

धन्यवाद, मैं "ब्राउज़र समस्या" के बारे में समझता हूं) – mr0re1

+0

लेकिन मुझे समझ में नहीं आता कि क्यों नोड 0.6.12 पर यह ठीक काम करता है, लेकिन नोड 0.9.4 पर यह त्रुटि फेंक देता है। – mr0re1

उत्तर

38

पर रोल रोल के बाद यह समस्या हल हो गई थी क्योंकि 0.9.2 (0.10.x समेत) node.js अब डिफ़ॉल्ट रूप से प्रमाण पत्र मान्य करता है। यही कारण है कि जब आप पिछले node.js 0.8 को अपग्रेड करते हैं तो आप इसे अधिक सख्त बना सकते हैं। (हिंदुस्तान टाइम्स: https://github.com/mscdex/node-imap/issues/181#issuecomment-14781480)

आप {rejectUnauthorized:false} विकल्प के साथ इस से बच सकते हैं, लेकिन इस गंभीर सुरक्षा निहितार्थ है। जो भी आप सहकर्मी को भेजते हैं, वह अभी भी एन्क्रिप्ट किया जाएगा, लेकिन यह अधिक बन जाता है, जिसमें मैन-इन-द-बीच हमले को माउंट करना आसान होता है, यानी आपका डेटा सहकर्मी को एन्क्रिप्ट किया जाएगा लेकिन सहकर्मी स्वयं वह सर्वर नहीं है जिसे आप सोचते हैं है!

सबसे पहले निदान करना बेहतर होगा कि प्रमाणपत्र क्यों अधिकृत नहीं कर रहा है और देखें कि इसके बजाय इसे ठीक किया जा सकता है या नहीं।

+0

मुझे एक ही त्रुटि आ रही है। मैं नोड v5.4.0 – vinodh

+1

का उपयोग कर रहा हूं नोड v6.5 का उपयोग करके और अस्वीकार करने के लिए इसे अस्वीकार कर दिया गया है: 'tls.connect ({होस्ट: होस्ट, पोर्ट: 443, अस्वीकार अनधिकृत: गलत});' – Adrian

16

एक थोड़ा अद्यतन जवाब (के बाद से मैं विभिन्न परिस्थितियों में यह समस्या हुई थी।)

जब आप एक सर्वर SSL का उपयोग करने के लिए कनेक्ट, पहली बात यह है सर्वर करता है वर्तमान एक प्रमाण पत्र जो कहते हैं, "मैं एपीआई हूँ। dropbox.com। " प्रमाणपत्र में "विषय" है और इस विषय में "सीएन" ("सामान्य नाम" के लिए छोटा है।) प्रमाणपत्र में एक या अधिक "subjectAltNames" हो सकते हैं। जब node.js किसी सर्वर से कनेक्ट होता है, node.js इस प्रमाणपत्र को प्राप्त करता है, और तब सत्यापित करता है कि डोमेन नाम यह सोचता है कि यह कनेक्ट हो रहा है (api.dropbox.com) या तो विषय के सीएन या altnames में से एक से मेल खाता है। ध्यान दें कि, नोड 0.10.x में, यदि आप किसी आईपी का उपयोग कर कनेक्ट करते हैं, तो आईपी पता altnames में होना चाहिए - node.js सीएन के खिलाफ आईपी को सत्यापित करने की कोशिश नहीं करेगा।

rejectUnauthorized झंडे को ध्वजांकित करने के लिए ध्वज को इस चेक के आसपास मिल जाएगा, लेकिन सबसे पहले यदि सर्वर आपको अपेक्षाकृत अलग-अलग प्रमाण-पत्र दे रहा है, तो कुछ ख़राब हो रहा है, और दूसरा यह अन्य चेक को भी बाधित करेगा - यह नहीं है यदि आप इंटरनेट पर कनेक्ट कर रहे हैं तो एक अच्छा विचार।

आप नोड> = 0.11.x का उपयोग कर रहे हैं, तो आप भी टीएलएस मॉड्यूल के लिए एक checkServerIdentity: function(host, cert) समारोह है, जो undefined लौटना चाहिए अगर आप कनेक्शन की अनुमति और यद्यपि मैं नहीं जानता कि अन्यथा एक अपवाद फेंक (करना चाहते हैं निर्दिष्ट कर सकते हैं यदि request इस ध्वज को आपके लिए टीएलएस के माध्यम से प्रॉक्सी करेगा।) यह पता लगाने के लिए कि यह बिल्ली क्या चल रहा है, यह एक समारोह और console.log(host, cert); घोषित करने के लिए आसान हो सकता है।

4

मैं जानता हूँ कि यह पुराना है, लेकिन किसी और की तलाश में:

https निकालें: // होस्ट नाम से और 443 पोर्ट जोड़ने के बजाय।

{ 
    method: 'POST', 
    hostname: 'api.dropbox.com', 
    port: 443 
} 
+1

यह काम नहीं करेगा यदि आप काम नहीं करेंगे एक गैर मानक पोर्ट का उपयोग कर रहे हैं। – Beefster

2

मैं एक ही मुद्दा कहीं और से प्रॉक्सी पोस्ट अनुरोध करने के लिए अनुरोध मॉड्यूल का उपयोग कर था और क्योंकि मैं शीर्षक में मेजबान संपत्ति छोड़ दिया (मैं मूल अनुरोध से शीर्ष लेख को कॉपी किया गया था) था।

2

यदि आप http-proxy पैकेज का उपयोग कर रहे हैं, तो आप changeOrigin को सत्य में सेट कर सकते हैं।

const proxy = httpProxy.createProxyServer(); 

proxy.web(req, res, { 
    changeOrigin: true, 
    target: https://example.com:3000, 
}); 
+0

प्रॉक्सी का उपयोग करते समय यह मेरे लिए हल हो गया।वेब, धन्यवाद। –

0

हम अगर हम localhost गंतव्य पता (host या hostname Node.js पर) और हमारे सर्वर आम नाम के साथ हमारे ग्राहक के अनुरोध के परीक्षण कर रहे हैं इस समस्या नहीं है सर्वर प्रमाणपत्र में CN = localhost है। लेकिन अगर हम 127.0.0.1 या किसी अन्य आईपी के लिए localhost बदलते हैं तो हमें क्यूटी पर node.js या SSL handshake failed पर Hostname/IP doesn't match certificate's altnames त्रुटि मिलेगी।

मेरे क्लाइंट अनुरोध पर मेरे सर्वर प्रमाण पत्र के बारे में मुझे एक ही समस्या थी। मेरे मुवक्किल Node.js एप्लिकेशन पर इसे हल करने के लिए मैं निम्नलिखित मूल्य के साथ मेरी server_extension पर एक subjectAltName डाल करने के लिए की जरूरत:

[ server_extension ] 
     . 
     . 
     . 

subjectAltName   = @alt_names_server 

[alt_names_server] 
IP.1 = x.x.x.x 

और फिर मैं -extension का उपयोग जब मैं बना सकते हैं और प्रमाण पत्र पर हस्ताक्षर।

उदाहरण:

export OPENSSL_CONF=intermed-ca.cnf 

तो मैं बना सकते हैं और अपने सर्वर प्रमाणपत्र पर हस्ताक्षर:

मेरे मामले में, मैं पहली बार प्रदाता ने कॉन्फ़िग फ़ाइल क्योंकि इस फ़ाइल की सामग्री server_extension निर्यात

openssl ca \ 
    -in server.req.pem \ 
    -out server.cert.pem \ 
    -extensions server_extension \ 
    -startdate `date +%y%m%d000000Z -u -d -2day` \ 
    -enddate `date +%y%m%d000000Z -u -d +2years+1day` 

यह node.js पर आधारित ग्राहकों पर ठीक काम करता है https अनुरोध, लेकिन जब हम QSslSocket::VerifyNone का उपयोग नहीं करते हैं, तब तक हम sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyPeer) को परिभाषित करते समय QT QSsl पर आधारित क्लाइंट के साथ काम नहीं करते हैं, यह काम नहीं करेगा। अगर हम VerifyNone का उपयोग करते हैं तो यह हमारे ऐप को सहकर्मी प्रमाणपत्र की जांच नहीं करेगा ताकि वह किसी भी प्रमाण को स्वीकार कर सके। इसलिए, इसे हल करने के लिए मुझे अपने सर्वर पर सामान्य नाम बदलने की आवश्यकता है और आईपी एड्रेस के लिए अपना मान बदलना है जहां मेरा सर्वर चल रहा है।

उदाहरण के लिए

:

CN = 127.0.0.1

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