2013-09-30 15 views
22

मेरे पास एक्सप्रेस में एक एसएसएल सर्वर है, जो सभी ब्राउज़रों पर काम नहीं कर रहा है (जब तक उपयोगकर्ता मैन्युअल रूप से वेबसाइट पर भरोसा नहीं करता) क्योंकि कुछ ब्राउज़रों को चेन प्रमाणपत्र की आवश्यकता होती है (हमारे पास हमारे पास है मध्यवर्ती प्रमाणपत्र)। मैंने अपने इंटरमीडिएट और चेन प्रमाणपत्र को एक .crt फ़ाइल में रखा है। चेन + इंटरमीडिएट सर्टिफिकेट INT_CERT_FILE वैरिएबल में है। यह काम नहीं लग रहा है। मैं http://www.digicert.com/help का उपयोग कर रहा हूं, साथ ही openssl s_client -connect tasker.adnxs.net:443 -showcerts | grep "^ " को जांचने के लिए चला रहा हूं, लेकिन ऐसा लगता है कि यह मध्यवर्ती + श्रृंखला प्रमाण पत्र वापस नहीं कर रहा है।नोड.जेएस/एक्सप्रेस.जेएस चेन सर्टिफिकेट काम नहीं कर रहा है

यहाँ कैसे मैं इसे सेट कर रहा हूं हो रहा है:

var fs = require("fs"); 
var https = require("https"); 
var express = require("express"); 

var KEY_FILE = fs.readFileSync("path/to/key/file.key"); 
var CERT_FILE = fs.readFileSync("path/to/crt/file.crt); 
var INT_CERT_FILE = fs.readFileSync("path/to/intermediate and chain crt.crt"); 

var _app_https = express(); 
var _server_https = null; 

_server_https = https.createServer({ 
    key: KEY_FILE, 
    cert: CERT_FILE, 
    ca: INT_CERT_FILE 
}, _app_https).listen(443); 

Firefox पर जाकर ऐसा करते हैं, तो फ़ायरफ़ॉक्स अपनी पहचान को नहीं पहचानता है और आवश्यकता है इसे मैन्युअल रूप से भरोसा किया जा करने के लिए। मैं इस समस्या को कैसे हल कर सकता हूं?

धन्यवाद,

+0

मैं प्रयोग किया है: थोड़ी देर के व्यय की गई जब नोड पाने की कोशिश की और एसएसएल के साथ काम करने socket.io तो सोचा था कि यह साझा करेंगे (ग्राहक पर शुद्ध :: ERR_INSECURE_RESPONSE त्रुटि हो रही थी)। toString() पढ़ने के बाद FileSync (...) –

+0

अभी भी काम नहीं करता है। http://www.digicert.com/help/ कहता है कि कोई प्रमाण पत्र नहीं मिला है। – darksky

उत्तर

58

अपने मध्यवर्ती प्रमाणपत्र फ़ाइल कई प्रमाण पत्र ब्लॉक शामिल करता है?

यदि ऐसा है तो आपको उन्हें अलग-अलग फाइलों में विभाजित करना चाहिए और उन्हें एक-एक करके पढ़ना चाहिए। आप उन्हें ca पैरामीटर के लिए सरणी के रूप में पास कर सकते हैं। आप "ssl श्रृंखला" फ़ाइल विभाजित कर सकते हैं -

var https = require('https'), 
    read = require('fs').readFileSync, 
    httpsOptions = { 
     key: read('ssl/mycertificate.key', 'utf8'), 
     cert: read('ssl/mycertificate.crt', 'utf8'), 
     ca: [ 
      read('ssl/rapidssl_1.pem', 'utf8'), 
      read('ssl/rapidssl_2.pem', 'utf8') 
     ] 
    }; 

https.createServer(httpsOptions, function (req, res) { 
    // ... 
}); 
+0

आप महोदय, मुझे बहुत समय बचाया। धन्यवाद। – tier1

+0

यह वास्तव में काम करता है? नोडजेक्स दस्तावेज़ कहते हैं कि 'ca' विकल्प का उपयोग कनेक्शन को अधिकृत करने के लिए किया जाता है और ऐसा लगता है कि इसे तब तक कुछ नहीं करना चाहिए जब तक कि' requestCert' और 'अस्वीकार नहीं किया गया 'विकल्प चालू नहीं होते हैं। https://nodejs.org/docs/latest-v0.10.x/api/tls.html#tls_tls_createserver_options_secureconnectionlistener –

+0

मेरी समस्या nginx के साथ करना था और [यह लिंक] (https://cheapsslsecurity.com/blog/install -एसएसएल-प्रमाणपत्र-nginx-http-server /) ने मेरे लिए इसे हल किया। – tsuz

7

हैंडी छोटा-सा स्निपेट यदि आप वास्तव में सर्वर पर किसी भी एसएसएल से संबंधित फाइलों को संशोधित नहीं कर सकते:

मैं इसे नीचे दिए गए कोड के साथ काम कर गया गया है स्वयं।

var read = require('fs').readFileSync; 
 
var privateKey = read(MY_KEY_LOCATION, 'utf8'); 
 
var certificate = read(MY_CERT_LOCATION, 'utf8'); 
 
var chainLines = read(MY_CHAIN_LOCATION, 'utf8').split("\n"); 
 
var cert = []; 
 
var ca = []; 
 
chainLines.forEach(function(line) { 
 
    cert.push(line); 
 
    if (line.match(/-END CERTIFICATE-/)) { 
 
    ca.push(cert.join("\n")); 
 
    cert = []; 
 
    } 
 
}); 
 
var credentials = { 
 
    "key": privateKey, 
 
    "cert": certificate, 
 
    "ca": ca 
 
}; 
 
var httpsServer = https.createServer(credentials, app); 
 
var io = require('socket.io').listen(httpsServer);

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