2012-02-25 22 views
7

मैं एक नोड.जेएस ऐप लिख रहा हूं जिसे हमारे आंतरिक एपीआई में से किसी एक डेटा से अनुरोध करना है। मुश्किल हिस्सा सर्वर मैं से डेटा का अनुरोध कर रहा हूँ कुछ सीमाएँ हैं कि:Node.js HTTPS 400 त्रुटि - 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'

  • अनुरोध, HTTPS प्रोटोकॉल (HTTP नहीं)
  • अनुरोध एक लैन IP पते का उपयोग किया जाना चाहिए पर किया जाना चाहिए क्योंकि डोमेन नाम आंतरिक रूप से काम नहीं करेगा
  • अनुरोध बाहरी डोमेन नाम से अनुरोध करने के लिए प्रतीत होता है, क्योंकि वर्चुअल होस्ट के लिए यही सेटअप है।

ऐसा करने में, मैं कोड का एक सा है कि इस तरह दिखता है चल रहा हूँ:

var headers = { 
    Host: externalHostname, 
    Hostname: externalHostname, 
}; 

var options = { 
    host: InternalIP, 
    path: path, 
    method: 'GET', 
    headers: headers 
}; 

var req = https.request(options, function(res) { 
    res.setEncoding('utf8'); 

    var data = ""; 

    res.on('data', function(chunk) { 
     data += chunk; 
    }); 

    res.on('end', function() { 
     //Do something with that data 
    }); 

    res.on('error', function(err) { 
      console.log("Error during HTTP request"); 
      console.log(err); 
    }); 
}); 

req.end(); 

दुर्भाग्य से, मैं एक 400 (आपका ब्राउज़र हो रही है एक अनुरोध भेजा है कि इस सर्वर सका समझ में नहीं आता) प्रतिक्रिया के रूप में त्रुटि। मैंने डबल और ट्रिपल चेक किया है कि होस्टनाम, आईपी पता, और पथ का नाम बिल्कुल सही है (मैं उन्हें अपने ब्राउज़र के भीतर से जांच सकता हूं, और सब अच्छा है)।

मैंने अपने प्रतिक्रिया चर (res) का आउटपुट किया, और UNABLE_TO_VERIFY_LEAF_SIGNATURE का प्रमाणीकरण मान प्राप्त कर रहा हूं। मुझे यकीन नहीं है कि यह क्या है, या यदि यह मेरी समस्या है, लेकिन यह जानकारी का एकमात्र उपयोगी बिट है जो मुझे मिल सकता है।

मैंने अपने प्रतिक्रिया चर here का पूरा आउटपुट डाला।

इस पर कोई विचार क्या हो सकता है?

अपडेट: मैंने इसे समझ लिया! मैं ?PHPSESSID=asdadGET चर पारित करके सर्वर के साथ प्रमाणित करने का प्रयास कर रहा था, लेकिन वे अक्षम हैं। मैं कुकी हेडर में PHPSESSID सेट करके इसे काम करने में सक्षम था। नवीनतम Node.js में tls.js स्रोत से

+0

क्या आपके पास इस तरह की रेखा है कि 'var https = requ (' https '); '? –

+0

@ माइकल। हाँ। https एक वैश्विक चर है, और मुझे पता है कि यह काम कर रहा है क्योंकि वास्तविक HTTPS अनुरोध आग लग रहा है - यह केवल 400 त्रुटि के साथ जवाब दिया गया है। – jwegner

+0

आपके विकल्पों में भी आपकी अनुपलब्ध 'विधि: ['get', 'post']' है ... दस्तावेज़ों को प्रबंधित करता है http://nodejs.org/docs/v0.4.0/api/https.html#https.request –

उत्तर

0

जाँच इस बाहर (वहाँ बहुत अधिक है यह है कि क्या मुझे तुम्हारी जरूरत है लगता है) अपने विकल्पों में गलत पर rejectUnauthorized

 
// AUTHENTICATION MODES 
// 
// There are several levels of authentication that TLS/SSL supports. 
// Read more about this in "man SSL_set_verify". 
// 
// 1. The server sends a certificate to the client but does not request a 
// cert from the client. This is common for most HTTPS servers. The browser 
// can verify the identity of the server, but the server does not know who 
// the client is. Authenticating the client is usually done over HTTP using 
// login boxes and cookies and stuff. 
// 
// 2. The server sends a cert to the client and requests that the client 
// also send it a cert. The client knows who the server is and the server is 
// requesting the client also identify themselves. There are several 
// outcomes: 
// 
// A) verifyError returns null meaning the client's certificate is signed 
// by one of the server's CAs. The server know's the client idenity now 
// and the client is authorized. 
// 
// B) For some reason the client's certificate is not acceptable - 
// verifyError returns a string indicating the problem. The server can 
// either (i) reject the client or (ii) allow the client to connect as an 
// unauthorized connection. 
// 
// The mode is controlled by two boolean variables. 
// 
// requestCert 
// If true the server requests a certificate from client connections. For 
// the common HTTPS case, users will want this to be false, which is what 
// it defaults to. 
// 
// rejectUnauthorized 
// If true clients whose certificates are invalid for any reason will not 
// be allowed to make connections. If false, they will simply be marked as 
// unauthorized but secure communication will continue. By default this is 
// false. 
// 

सेट और उम्मीद बाँध ... अगर आउटपुट बदलता है तो मुझे बताएं।

+0

http://devel.dyne.org/jmx/tree/jsapi /node/tls.js?id=c3cf7e8d0000baf0af7e2c236fb5dd6ccde14439 यहां स्रोत है, लाइन 755 –

+2

के आसपास देखो मुझे लगता है कि आपकी स्थिति थोड़ा पीछे हो सकती है। यह (मुझे विश्वास है) अगर मैं एक एसएसएल सर्वर बना रहा हूं - उस दस्तावेज़ में वर्बेज यह सुझाव देता है कि अनुरोध करें और अस्वीकार करें सर्वर पर सेट किया गया है। हालांकि, मैं एक अलग (अपाचे) सर्वर से एक HTTPS अनुरोध करने की कोशिश कर रहा हूं। – jwegner

+0

यदि ऐसा है, तो 'UNABLE_TO_VERIFY_LEAF_SIGNATURE' ऐसा कुछ है जो आपका सर्वर आपके पास लौट रहा है, उस त्रुटि में node.js –

14

सेट इस process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';

+1

धन्यवाद! इसने मेरे मुद्दे को node.js और ज़ोंबी के साथ तय किया और फिडलर में HTTP ट्रैफ़िक देखने में सक्षम होने के साथ-साथ ज़िम्बी ब्राउज़र विकल्प को फिडलर प्रॉक्सी में सेट करने के लिए) – Ron

+2

यह एक लुभावनी विचार है। अगर सिस्टम में उचित सीए रूट (एकेए एंकर) प्रमाण पत्र हैं, तो 'सख्त-एसएसएल' को बंद करने के बजाय उनके बारे में नोड को बताने का एक तरीका होना चाहिए। –

-1

सेट इस process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; फिक्स्ड superagent के लिए UNABLE_TO_VERIFY_LEAF_SIGNATURE समस्या।

-3

आदेश पंक्ति में इस प्रयास करें:

npm config set strict-ssl false 

यह मैक पर मेरे लिए काम किया।

+0

यह एक लुभावनी विचार है। अगर सिस्टम में उचित सीए रूट (एकेए एंकर) प्रमाण पत्र हैं, तो 'सख्त-एसएसएल' को बंद करने के बजाय उनके बारे में नोड को बताने का एक तरीका होना चाहिए। –

1

मैंने अपने नोडजेस सर्वर से बाहरी एपीआई कॉल में UNABLE_TO_VERIFY_LEAF_SIGNATURE त्रुटि को डीबग करते समय यहां मारा।

यह त्रुटि तब होती है जब सर्वर प्रमाणपत्र के सत्यापन के दौरान त्रुटि होती है। हालांकि निम्नलिखित कोड (जो किसी अन्य उत्तर के रूप में भी उपलब्ध है) द्वारा सुरक्षा को अक्षम करने की अनुशंसा नहीं की जाती है, यह सत्यापित करने में सहायता करता है कि आप सही बग का पीछा कर रहे हैं या नहीं। दूसरे शब्दों में, यदि इसे डालने से यह ठीक नहीं होता है, तो कोड के साथ कुछ और गलत है।

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; 

मेरे मामले में, वहाँ मूर्ख बग & अनुरोध ही स्थानीय होस्ट करने के लिए जा रहा था। उपरोक्त डालने के बाद भी, अनुरोध विफल रहा और इससे मुझे बग को उजागर करने में मदद मिली।

ऐसा कहकर, इसे समाधान के रूप में उपयोग करने की अनुशंसा नहीं की जाती है। इसके बजाय यह पता लगाएं कि आप agent:false & ca:[fs.readFileSync('root-cert.pem')] विकल्पों को सेट करके अतिरिक्त प्रमाणपत्र कैसे प्रदान कर सकते हैं। https.request दस्तावेज़ीकरण विवरण प्रदान करता है। कुछ जबकि मेरे बग का पीछा करते हुए, मैंने यह भी पाया और अधिक उपयोगी संसाधन:

  1. ssl-tools.net साइट रूट & मध्यवर्ती प्रमाणपत्र प्रदान करता है। उदाहरण के लिए: Baltimore CyberTrust Root लाइफ द्वारा उपयोग किया जाता है .api.net
  2. ssl-root-cas module लोकप्रिय ब्राउज़रों द्वारा उपयोग किए जाने वाले अतिरिक्त सीए प्रमाण पत्र प्रदान करने का दावा करता है। मैंने दावा सत्यापित नहीं किया है।
  3. openssl s_client -connect apis.live.net:443 - प्रमाणपत्र श्रृंखला मुद्रित करता है। आप जो भी कनेक्ट कर रहे हैं उसके साथ आपको अंतिम पैरामीटर (url & पोर्ट) को प्रतिस्थापित करने की आवश्यकता है।
संबंधित मुद्दे