2012-04-13 23 views
6

पर ध्यान दिए बिना काम करता है यह परीक्षण प्रोग्राम किसी https सर्वर से कनेक्ट होता है और कुछ सामग्री प्राप्त करता है। मैंने ब्राउज़र में और कर्ल के साथ अपना सर्वर चेक किया है और प्रमाणपत्र सही तरीके से काम कर रहा है। यदि मैं सर्वर से डेटा को पकड़ने के लिए कर्ल चलाता हूं तो यह प्रमाण पत्र अज्ञात होने के बारे में सही तरीके से शिकायत करता है जब तक कि मैं इसे --cacert के साथ पास नहीं करता या सुरक्षा को बंद कर देता हूं।मेरा node.js https क्लाइंट हमेशा प्रमाणपत्र वैधता

तो मेरी समस्या यह है कि हालांकि मुझे लगता है कि मेरा ग्राहक प्रमाण पत्र प्रमाणीकरण कर रहा है और मैं यह कह रहा हूं कि सार्वजनिक प्रमाणपत्र कहां है, यह हमेशा काम करता है। अगर मैं ca: विकल्प को हटा देता हूं तो उसे पता नहीं है कि प्रमाणपत्र सर्वर से क्या है, तो यह चुपचाप काम करता है। मैं प्रमाणीकरण त्रुटि पकड़ना चाहता हूं लेकिन मुझे ऐसा नहीं लगता है।

var https = require('https'); 
var fs = require('fs'); 

function main() { 

     var data = ''; 

     var get = https.get({ 
     path: '/', 
     host: 'localhost', 
     port: 8000, 
     agent: false, 
     ca: [ fs.readFileSync('https_simple/cacert.pem') ] 

     }, function(x) { 

     x.setEncoding('utf8'); 
     x.on('data', function(c) {data += c}); 
     x.on('error', function(e) { 
      throw e; 
     }); 
     x.on('end', function() { 
      console.log('Hai!. Here is the response:'); 
      console.log(data); 
     }); 

     }); 

     get.on('error', function(e) {throw e}); 

     get.end(); 

    } 

main(); 

उत्तर

10

आदेश में इस काम मैं v0.7.8 को उन्नत करने के लिए (हालांकि किसी भी v0.7 नहीं करना चाहिए) जहां rejectUnauthorized कार्यक्षमता https.get को

विकल्पों में से इस संयोजन जोड़ दिया गया है की जरूरत बनाने के लिए की जरूरत है:

agent: false, // or you can supply your own agent, but if you don't you must set to false 
rejectUnauthorized: true, 
ca: [ fs.readFileSync('https_simple/cacert.pem') ] 

अब अगर प्रमाणीकरण विफल आप एक 'त्रुटि' घटना मिलेगा और अनुरोध आगे नहीं जाएगी।

बनाने पर जानकारी के लिए https.request documentation देखें अपने स्वयं के एजेंट

बग फ़िक्स इस परिवर्तन में हामी भर दी थी: https://github.com/joyent/node/commit/f8c335d0

+1

अस्वीकारअनुक्रमित संस्करण 0.7.0 –

+2

में जोड़ा गया था दस्तावेज़ों को देखकर: http://nodejs.org/api/tls.html, इस बात का कोई संकेत नहीं है कि क्लाइंट के लिए 'अस्वीकार अज्ञात' जोड़ा गया था ... सर्वर के लिए हाँ, लेकिन क्लाइंट नहीं। .. क्या आप कृपया मुझे सही रास्ते पर सेट कर सकते हैं? क्या मैं यहां डेट डॉक्स देख रहा हूं? – pulkitsinghal

+0

परिवर्तन सूची उपरोक्त उत्तर में है। इस मुद्दे को यहां ट्रैक किया गया था https://github.com/joyent/node/issues/2247 मैंने यह नहीं देखा है कि दस्तावेज अद्यतन किया गया था, क्षमा करें। – justinhj

4

https.request के लिए documentation के अनुसार, दोनों https.get और https.request की ca विकल्प tls.connect से एक विकल्प है। tls.connect मॉड्यूल कार्य करने के लिए विकल्प के लिए प्रलेखन राज्यों:

ca: तार या विश्वसनीय प्रमाण पत्र की बफ़र की एक सरणी। यदि यह छोड़ा गया है तो कई प्रसिद्ध "रूट" सीए का उपयोग किया जाएगा, जैसे वेरीसिगन। इन कनेक्शनों को अधिकृत करने के लिए उपयोग किया जाता है।

Node.js स्रोत में खुदाई, रूट का इस्तेमाल किया प्रमाणपत्र यहां पाया जा सकता: https://github.com/joyent/node/blob/master/src/node_root_certs.h

संक्षेप में

तो, tls मॉड्यूल https.get के लिए एक विकल्प के रूप में प्रदान नहीं अधिकार प्रमाणपत्र के साथ प्रमाणित करने का प्रयास करेंगे वैसे भी रूट कर्ट की सूची का उपयोग कर कनेक्शन।

+1

यह अच्छी जानकारी धन्यवाद। यह मेरी मदद नहीं करता है, क्योंकि मैं अपने स्वयं के हस्ताक्षरित प्रमाण पत्र का उपयोग कर रहा हूं। मैं अपेक्षा करता हूं कि कनेक्शन केवल तभी काम करे जब मैं अपना प्रमाणपत्र पास करता हूं, लेकिन यह किसी भी तरह से काम करता है। – justinhj

+0

@ Перо सर्वर प्रमाण को गठबंधन करने और रूट सीए खोने का कोई तरीका नहीं है? पूर्व: 'सीए: [fs.readFileSync ('myServerCert।पेम '), node_root_certs.h]' हेडर फ़ाइल में निरंतर उपयोग करने के लिए वाक्यविन्यास क्या होगा? – pulkitsinghal

1

वी 0.6.15 में आपको explicitly check की आवश्यकता है कि प्रमाण पत्र सत्यापन पास हो गया है या विफल रहा है या नहीं।

if (x.connection.authorized === false) {  
    console.log('SSL Authentication failed'); 
} else if (x.connection.authorized === true) {  
    console.log('SSL Authentication succeeded'); 
} 
+0

ऐसा प्रतीत होता है लेकिन x.authorized अपरिभाषित – justinhj

+0

@justinhj है, मैंने जवाब में कोड तय किया है। –

+0

संभवतः, यह कॉलबैक फ़ंक्शन में रखा जाना है। दुर्भाग्यवश, यह प्रमाण पत्र विश्वसनीय नहीं होने पर अनुरोध को रोकने से नहीं रोकता है, यह केवल एक बार ऐसा करने के बाद आपको बताता है (उदाहरण के लिए, तब तक आपने प्रमाणीकरण प्रमाण-पत्र लीक हो सकते हैं)। – Bruno

2

मैं NPM में ऐसा करते हैं, request मॉड्यूल का उपयोग कर। यह इस प्रकार है:

var cacert = ... // in npm, this is a config setting 
var request = require("request") 
request.get({ url: "https://...", 
       ca: cacert, 
       strictSSL: true }) 
    .on("response", function (resp) { ... }) 
    .on("error", function (er) { ... }) 

एसएसएल वैध नहीं है तो त्रुटि घटना उठाई जाएगी।

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