Https.request के साथ नोड.जेएस में अमान्य स्व-हस्ताक्षरित एसएसएल प्रमाणपत्र को अनदेखा करें?


308

मैं एक छोटे से ऐप पर काम कर रहा हूं जो मेरे स्थानीय वायरलेस राउटर (Linksys) में प्रवेश करता है, लेकिन मैं राउटर के स्व-हस्ताक्षरित एसएसएल प्रमाण पत्र के साथ एक समस्या में चल रहा हूं।

मैं १ ९ २.१६ :.१.१ से दौड़ा और आया:

ERROR: cannot verify 192.168.1.1's certificate, issued by `/C=US/ST=California/L=Irvine/O=Cisco-Linksys, LLC/OU=Division/CN=Linksys/emailAddress=support@linksys.com':
Self-signed certificate encountered.
ERROR: certificate common name `Linksys' doesn't match requested host name `192.168.1.1'.
To connect to 192.168.1.1 insecurely, use `--no-check-certificate'.

नोड में, पकड़ी जा रही त्रुटि है:

{ [Error: socket hang up] code: 'ECONNRESET' }

मेरा वर्तमान नमूना कोड है:

var req = https.request({ 
    host: '192.168.1.1', 
    port: 443,
    path: '/',
    method: 'GET'

}, function(res){

    var body = [];
    res.on('data', function(data){
        body.push(data);
    });

    res.on('end', function(){
        console.log( body.join('') );
    });

});
req.end();

req.on('error', function(err){
    console.log(err);
});

मैं "- चेक-सर्टिफिकेट" के समकक्ष करने के लिए नोड.जेएस प्राप्त करने के बारे में कैसे जा सकता हूं?

जवाबों:


599

सस्ता और असुरक्षित उत्तर:

जोड़ना

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

कॉल करने से पहले कोड में https.request()

इस प्रश्न में एक अधिक सुरक्षित तरीका (उपरोक्त समाधान संपूर्ण नोड प्रक्रिया को असुरक्षित बनाता है) का उत्तर दिया गया है


2
मेरे लिए एक जादू की तरह काम किया! इस कोड को मैंने अपने मुख्य एप्लिकेशन js के बहुत शीर्ष में सब कुछ शामिल करने के ठीक बाद रखा।
Xedecimal

यह NodeJS & SailJS कॉम्बो के लिए भी काम करता है। मैंने इसे local.js के शीर्ष पर जोड़ा
माइकल कॉर्क।

38
यह उत्पादन वातावरण में "या अस्वीकार" का उपयोग न करें, क्योंकि यह सभी प्रकार की सुरक्षा जांच को अक्षम करता है।
जेसन वाल्टन

3
मुझे अपने स्व-हस्ताक्षरित https नोड सर्वर पर मोचा का उपयोग करके परीक्षण चलाने में परेशानी हो रही थी, और किसी भी विवरण ब्लॉक के तुरंत पहले इसे जोड़ने से मेरे परीक्षण पास हो गए।
आर्टिस 3 एन जूल 30'15

यह शायद समस्या को ठीक करने का सबसे सुरक्षित तरीका नहीं है। देखें stackoverflow.com/questions/20433287/...
मैट पेनिंगटन

166

अपने अनुरोध विकल्पों में, निम्नलिखित सहित प्रयास करें:

   var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      method: 'GET',
      rejectUnauthorized: false,
      requestCert: true,
      agent: false
    },

मेरे लिए काम किया। मैं रेस्टलर का उपयोग करता हूं और मैं देखता हूं कि यह डिफ़ॉल्ट रूप से विकल्पों को आगे नहीं बढ़ाता इसलिए मुझे इसे पैच करना पड़ा।
ओलिवियर एमबेल्ट

2
इसके लिए काम करने के लिए आपको कस्टम एजेंट का एक स्पष्ट उदाहरण प्रदान करना होगा। विकल्प ऑब्जेक्ट बनाएं और एजेंट सेट करें: 'options.agent = new https.Agent (विकल्प);) फिर बस 'https.request (विकल्प)'
मैक्स

14
खैर, इसने मेरे लिए सिर्फ rejectUnauthorizedविकल्प के साथ काम किया और कुछ नहीं
mcont

@ मैं केवल पुष्टि करता हूं कि rejectUnauthorizedबाकी सब कुछ बहुत अच्छा था। बनाम कोड एक्सटेंशन का उपयोग करना। बेहतर अभी तक PEM कॉन्फ़िगरेशन की अनुमति दें, मैं इसके
बाद

61

उन सभी पर विश्वास न करें जो आपको गुमराह करने की कोशिश करते हैं।

आपके अनुरोध में, बस जोड़ें:

ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})]

यदि आप अनधिकृत प्रमाणपत्रों को चालू करते हैं, तो आपको बिल्कुल भी संरक्षित नहीं किया जाएगा (पहचान को मान्य नहीं करने के लिए MITM के संपर्क में), और SSL के बिना काम करना बहुत बड़ा अंतर नहीं होगा। इसका समाधान सीए प्रमाणपत्र को निर्दिष्ट करना है जिसे आप अगले स्निपेट में दिखाए गए अनुसार उम्मीद करते हैं। सुनिश्चित करें कि प्रमाणपत्र का सामान्य नाम आपके द्वारा अनुरोध किए गए पते के समान है (जैसा कि होस्ट में निर्दिष्ट है):

फिर आपको जो मिलेगा वह है:

var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})],
      method: 'GET',
      rejectUnauthorized: true,
      requestCert: true,
      agent: false
    },

कृपया इस लेख को पढ़ें (खुलासा: इस उत्तर के लेखक द्वारा लिखा गया ब्लॉग पोस्ट) यहाँ समझने के लिए:

  • सीए प्रमाण पत्र कैसे काम करते हैं
  • उत्पादन वातावरण का अनुकरण करने के लिए आसानी से परीक्षण के लिए CA Certs कैसे उत्पन्न करें

7
यह काम करता है और समस्या को ठीक करने का सही तरीका है "प्रमाणपत्र श्रृंखला में त्रुटि: स्व हस्ताक्षरित प्रमाण पत्र।"
RohanRasane

1
आप इसे स्ट्रिंग के रूप में संग्रहीत करने के बजाय कोष्ठक के अंदर fs.readFileSync क्यों डालते हैं?
लेलो १

लेलो: कोष्ठक इसे एक सरणी में बदल देते हैं। ca: अनाज की एक सरणी की उम्मीद है। यह फ़ाइल एक अल्पविराम से अलग की गई सूची होनी चाहिए, अक्सर लोग PEM फ़ाइल को एक सरणी में बदलने के लिए एक आंतरिक फ़ंक्शन का उपयोग करते हैं। स्वयं हस्ताक्षरित cet के लिए एक एकल "काम" करना चाहिए।
जॉनडेविद

53

निम्नलिखित पर्यावरण चर जोड़ें:

NODE_TLS_REJECT_UNAUTHORIZED=0

जैसे export:

export NODE_TLS_REJECT_UNAUTHORIZED=0

(जुआन्रा के साथ बहुत धन्यवाद)


यह मेरे लिए तब काम आया जब मैं दौड़ने की कोशिश कर रहा थाwebdriver-manager update
एशले

3
NODE_TLS_REJECT_UNAUTHORIZED = 0 को विंडोज़ के लिए सेट करें
फेलिप एसएस

यह मेरे देव पर्यावरण के लिए एक महान समाधान था
डेविड

14

@Armand उत्तर में जोड़ना:

निम्नलिखित पर्यावरण चर जोड़ें:

NODE_TLS_REJECT_UNAUTHORIZED = 0 निर्यात के साथ:

NODE_TLS_REJECT_UNAUTHORIZED = 0 पर निर्यात करें (जुआन के साथ बहुत धन्यवाद)

यदि आप खिड़कियों के उपयोग पर हैं:

set NODE_TLS_REJECT_UNAUTHORIZED=0

आभार: @ wea008


12

आप डिफ़ॉल्ट विकल्पों के साथ एक अनुरोध उदाहरण भी बना सकते हैं:

require('request').defaults({ rejectUnauthorized: false })

3

उल्का के लिए आप npmRequestOptions के साथ सेट कर सकते हैं।

HTTP.post(url, {
    npmRequestOptions: {
        rejectUnauthorized: false // TODO remove when deploy
    },
    timeout: 30000, // 30s
    data: xml
}, function(error, result) {
    console.log('error: ' + error);
    console.log('resultXml: ' + result);
});

1

या आप स्थानीय नाम रिज़ॉल्यूशन ( ज्यादातर ऑपरेटिंग सिस्टमों में hostsडायरेक्टरी etcमें पाई गई फ़ाइल , विवरण अलग-अलग हो) को कुछ इस तरह जोड़ने का प्रयास कर सकते हैं :

192.168.1.1 Linksys 

और अगला

var req = https.request({ 
    host: 'Linksys', 
    port: 443,
    path: '/',
    method: 'GET'
...

काम करेगा।


3
यह सच है कि यह सवाल का जवाब दे सकता है, लेकिन मुझे लगता है कि इस मामले में अगली त्रुटि DEPTH_ZERO_SELF_SIGNED_CERT होगी।
ओलिवियर एमबल्ट

1
तो कैसे एक DEPTH_ZERO_SELF_SIGNED_CERT के आसपास मिलता है? मैं अब उसमें भाग रहा हूं।
रजा

3
@reza: इसे अपने विकल्पों में जोड़ें:rejectUnauthorized: false
Obay

1
मुझे पता है कि यह थोड़ा पुराना है, लेकिन भविष्य में संदर्भ के लिए (इसे सही तरीके से करने के लिए), आपको स्व-हस्ताक्षरित प्रमाण पत्र का एक पीईएम-एन्कोडिंग प्राप्त करने और इसे सीए के रूप में विकल्पों में शामिल करने की आवश्यकता है (आपको स्पष्ट रूप से भी आवश्यकता है) एजेंट मूल्य निर्धारित करने के लिए लेकिन वह गलत हो सकता है)। चूंकि प्रमाणपत्र स्व-हस्ताक्षरित है, इसलिए यह अपने स्वयं के सीए के रूप में कार्य करता है और इसलिए इसका उपयोग स्वयं को सत्यापित करने के लिए किया जा सकता है। हालांकि मैं यह भी सवाल करूंगा कि क्या राउटर पर ऐसा करना वास्तव में इसके लायक होगा क्योंकि फर्मवेयर शायद डाउनलोड किया जा सकता है और इसलिए निजी कुंजी से आसानी से समझौता किया जा सकता है।
जोनाथन ग्रे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.