2012-08-31 7 views
23

मैं अपने नोडजेएस एप्लिकेशन में गतिशील रूप से एक एसएसएल प्रमाणपत्र जानकारी वापस करना चाहता हूं। मेरे पास एक ही नोड एप्लिकेशन से जुड़े दो डोमेन नाम हैं। मैं केवल यह देखता हूं कि जब सर्वर बनाया जाता है तो एसएसएल सेटिंग्स निर्दिष्ट की जा सकती हैं। क्या अनुरोधित यूआरएल के आधार पर गतिशील रूप से एसएसएल प्रमाण पत्र वापस करना संभव है?क्या यह गतिशील रूप से NodeJS में एक SSL प्रमाणपत्र लौटा सकता है?

अन्यथा, अगर मुझे किसी अन्य बंदरगाह पर दूसरा सेवर उदाहरण बनाना होगा, तो क्या मैं पारदर्शी रूप से मूल अनुरोध पर प्रत्येक अनुरोध को पाइप कर पाऊंगा? क्या मैं इसे दूसरे पोर्ट पर नहीं चल रहा हूं जैसे दिख सकता हूं?

धन्यवाद, जेफ

+1

मुझे इसका उत्तर भी चाहिए। मैं एक नोड.जेएस ऐप बनाने की योजना बना रहा हूं जो प्रत्येक के लिए एक एसएसएल प्रमाण पत्र के साथ एकाधिक डोमेन होस्ट कर सकता है। उपयोगी होगा अगर हम डीबी में एसएसएल प्रमाणपत्र जानकारी स्टोर कर सकते हैं। तो एक बार जब हम डोमेन का पता लगाते हैं तो वे आ रहे हैं, हम उनकी साइट विषय और सामग्री की सेवा कर सकते हैं। मुझे पता है कि Node.js के पास एसएसएल प्रमाण को परिभाषित करने का एक तरीका है, लेकिन यह उस डोमेन के आधार पर गतिशील रूप से करने के तरीके के बारे में नहीं जानता है। – Keverw

+1

यकीन नहीं है, लेकिन https://github.com/nodejitsu/node-http-proxy सहायक नहीं होगा? –

उत्तर

41

हाँ, यह एक सर्वर के साथ यह करने के लिए संभव है। लेकिन चेतावनी यह है कि यह उन ग्राहकों पर काम करता है जो SNI का समर्थन करते हैं - जो कि अधिकांश आधुनिक ब्राउज़र हैं।

यह तुम कैसे करते है:

//function to pick out the key + certs dynamically based on the domain name 
function getSecureContext (domain) { 
    return crypto.createCredentials({ 
     key: fs.readFileSync('/path/to/domain.key'), 
     cert: fs.readFileSync('/path/to/domain.crt'), 
     ca: [fs.readFileSync('/path/to/CA_cert_1.crt'), fs.readFileSync('/path/to/CA_cert_2.crt'), <include all CA certs that you have to> ... ] 
     }).context; 
} 

//read them into memory 
var secureContext = { 
    'domain1': getSecureContext('domain1'), 
    'domain2': getSecureContext('domain2'), 
    . 
    . 
} 

//provide a SNICallback when you create the options for the https server 
var options = { 
    SNICallback: function (domain) { 
     return secureContext[domain]; 
    }, //SNICallback is passed the domain name, see NodeJS docs on TLS 
    cert: fs.readFileSync('/path/to/server.crt'), 
    key: fs.readFileSync('/path/to/server.key'),     
    } 
} 

//create your https server 
var server = require('https').createServer(options, [requestListener]); 
//using Express 
var server = require('https').createServer(options, require('express')()); 
server.listen(<someport>); 

यह काम करता है क्योंकि the options for https tls.createServer के समान है()। सुनिश्चित करें कि आप crypto.createCredentials कॉल में सभी आवश्यक सीए इंटरमीडिएट और रूट प्रमाणपत्र शामिल हैं। इसके अलावा यदि आपके पास सीए बंडल है, तो उन्हें 'सीए' के ​​रूप में उपयोग करने से पहले उन्हें एकाधिक एकल क्रेट फ़ाइलों में विभाजित करें, प्रमाणपत्रों की एक सरणी स्वीकार करता है।

+0

अच्छा! क्या प्रत्येक एसएसएल प्रमाण पत्र में एक समर्पित आईपी होना चाहिए? मैं एक ही सर्वर पर एसएसएल के साथ कई डोमेन होस्ट करना चाहता हूं। जब वे अपनी साइट खरीदते हैं, तो वे एपीआई का उपयोग करके स्वचालित रूप से एक SSL प्रमाणपत्र और डोमेन खरीद लेंगे। यदि मैं एक ही आईपी के साथ एक ही सर्वर पर एकाधिक डोमेन चला सकता हूं, तो यह बहुत अच्छा होगा लेकिन मुझे लगता है कि प्रत्येक प्रमाणपत्र को एक समर्पित आईपी की आवश्यकता होगी लेकिन यह भी सुनिश्चित नहीं है। – Keverw

+0

और मैं गतिशील रूप से वेबसाइटों को हटाने/जोड़ने के लिए उपलब्ध होना चाहता हूं। एक सास ऐप बनाना या कम से कम करना चाहते हैं और यह हिस्सा कुछ ऐसा होगा जो हमें जल्दी पता लगाने की आवश्यकता है। विकिपीडिया पेज पढ़ने के बाद ऐसा लगता है कि हमें समर्पित आईपी की आवश्यकता नहीं है। तो यह एक प्लस है लेकिन अनुरोध समय पर या सर्वर शुरू होने पर SecureContext प्राप्त होता है? चूंकि getSecureContext तब भी डेटाबेस में देख सकता है जब साइट को SSL प्रमाणपत्र के लिए अनुरोध मिलता है। हम्म।इस बारे में सोचने की कोशिश कर रहा है कि यह कैसे काम करना चाहिए। – Keverw

+0

और आश्चर्य है कि पुराने ब्राउज़र पर यह क्या करेगा जो इसका समर्थन नहीं करते हैं। मुझे प्रमाण पत्र त्रुटियां दें जो मुझे लगता है? – Keverw

15

crypto.createCredentials() बहिष्कृत है, इसलिए इसके बजाय tls.createSecureContext() का उपयोग करें।

tls.createServer() विकल्पों में key और cert होना चाहिए, क्योंकि उन्हें मैन्युअल में आवश्यक है। शायद tls.createServer()SNICallback के मामले में डिफ़ॉल्ट के रूप में इन पैरामीटर का उपयोग करता है।

var secureContext = { 
    'mydomain.com': tls.createSecureContext({ 
     key: fs.readFileSync('../path_to_key1.pem', 'utf8'), 
     cert: fs.readFileSync('../path_to_cert1.crt', 'utf8'), 
     ca: fs.readFileSync('../path_to_certificate_authority_bundle.ca-bundle1', 'utf8'), // this ca property is optional 
    }), 
    'myotherdomain.com': tls.createSecureContext({ 
     key: fs.readFileSync('../path_to_key2.pem', 'utf8'), 
     cert: fs.readFileSync('../path_to_cert2.crt', 'utf8'), 
     ca: fs.readFileSync('../path_to_certificate_authority_bundle.ca-bundle2', 'utf8'), // this ca property is optional 
    }), 
} 
try { 
    var options = { 
     SNICallback: function (domain, cb) { 
      if (secureContext[domain]) { 
       if (cb) { 
        cb(null, secureContext[domain]); 
       } else { 
        // compatibility for older versions of node 
        return secureContext[domain]; 
       } 
      } else { 
       throw new Error('No keys/certificates for domain requested'); 
      } 
     }, 
     // must list a default key and cert because required by tls.createServer() 
     key: fs.readFileSync('../path_to_key.pem'), 
     cert: fs.readFileSync('../path_to_cert.crt'), 
    } 
    https.createServer(options, function (req, res) { 
     res.end('Your dynamic SSL server worked!') 
     // Here you can put proxy server routing here to send the request 
     // to the application of your choosing, running on another port. 
     // node-http-proxy is a great npm package for this 
    }).listen(443); 
} catch (err){ 
    console.error(err.message); 
    console.error(err.stack); 
} 

सर्वर के अंदर आप मार्ग अपने https अपने विभिन्न अनुप्रयोगों के लिए अनुरोध करने के लिए पैकेज http-proxy NodeJS उपयोग कर सकते हैं।

-1

मैं बस इंगित करना चाहता था, @clusterfork मेरे लिए बिल्कुल सही था, लेकिन एक सिस्टम अपडेट ने मेरा पूरा समाधान दुर्घटनाग्रस्त कर दिया क्योंकि अब SNICallback 2 पैरामीटर के साथ काम कर रहा है, और सिस्टम के एक साधारण अपडेट ने इसे अचानक दुर्घटनाग्रस्त कर दिया। तो अब यह वापस काम कर रहा है, क्योंकि एसएनआईसीएलबैक अब 2 पैरामीटर, डोमेन & कॉलबैक के साथ आता है, और एक साधारण कोड अनुकूलन ने इसे काम किया है, क्योंकि @risyasin ने टिप्पणियों में यह कहा था।

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