[node.js] Express.js पर HTTPS को सक्षम करना



Answers

मैं पोर्ट 443 के अलावा किसी अन्य बंदरगाह पर काम करने के लिए एसएसएल प्राप्त करने के साथ एक समान मुद्दे में भाग गया। मेरे मामले में मेरे पास एक बंडल प्रमाणपत्र और प्रमाण पत्र और एक कुंजी थी। बंडल प्रमाणपत्र एक फ़ाइल है जिसमें एकाधिक प्रमाणपत्र होते हैं, नोड के लिए आवश्यक है कि आप उन प्रमाणपत्रों को सरणी के अलग-अलग तत्वों में विभाजित करें।

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

    var options = {
      ca: [fs.readFileSync(PATH_TO_BUNDLE_CERT_1), fs.readFileSync(PATH_TO_BUNDLE_CERT_2)],
      cert: fs.readFileSync(PATH_TO_CERT),
      key: fs.readFileSync(PATH_TO_KEY)
    };

    app = express()

    app.get('/', function(req,res) {
        res.send('hello');
    });

    var server = https.createServer(options, app);

    server.listen(8001, function(){
        console.log("server running at https://IP_ADDRESS:8001/")
    });

App.js में आपको https निर्दिष्ट करने और उसके अनुसार सर्वर बनाने की आवश्यकता है। साथ ही, सुनिश्चित करें कि जिस पोर्ट का आप उपयोग करने का प्रयास कर रहे हैं वह वास्तव में इनबाउंड ट्रैफ़िक की अनुमति दे रहा है।

Question

मैं नोड के लिए express.js पर काम कर रहा HTTPS प्राप्त करने का प्रयास कर रहा हूं, और मैं इसे समझ नहीं सकता।

यह मेरा app.js कोड है।

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

var privateKey = fs.readFileSync('sslcert/server.key');
var certificate = fs.readFileSync('sslcert/server.crt');

var credentials = {key: privateKey, cert: certificate};


var app = express.createServer(credentials);

app.get('/', function(req,res) {
    res.send('hello');
});

app.listen(8000);

जब मैं इसे चलाता हूं, ऐसा लगता है कि केवल HTTP अनुरोधों का जवाब है।

मैंने सरल वेनिला node.js आधारित एचटीटीपीएस ऐप लिखा:

var   fs = require("fs"),
      http = require("https");

var privateKey = fs.readFileSync('sslcert/server.key').toString();
var certificate = fs.readFileSync('sslcert/server.crt').toString();

var credentials = {key: privateKey, cert: certificate};

var server = http.createServer(credentials,function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
});

server.listen(8000);

और जब मैं इस ऐप को चलाता हूं, तो यह HTTPS अनुरोधों का जवाब देता है। ध्यान दें कि मुझे नहीं लगता कि fs परिणाम पर toString () का परिणाम है, क्योंकि मैंने दोनों के संयोजनों का उपयोग किया है और अभी भी कोई es bueno नहीं है।

जोड़ने के लिए संपादित करें:

उत्पादन प्रणालियों के लिए, आप अपने नोडजेस ऐप को प्रॉक्सी अनुरोधों के लिए शायद Nginx या HAProxy का उपयोग करना बंद कर सकते हैं। आप एसएसएल अनुरोधों को संभालने के लिए nginx सेट कर सकते हैं और बस अपने नोड app.js. पर http बोल सकते हैं।

जोड़ने के लिए संपादित करें (4/6/2015)

एडब्ल्यूएस का उपयोग करने के लिए सिस्टम के लिए, आप एसएसएल टर्मिनेशन को संभालने के लिए ईसी 2 लोचदार लोड बैलेंसर्स का उपयोग करना बेहतर कर देते हैं, और अपने ईसी 2 वेब सर्वर पर नियमित HTTP यातायात की अनुमति देते हैं। आगे की सुरक्षा के लिए, अपने सुरक्षा समूह को सेटअप करें कि केवल ईएलबी को ईसी 2 उदाहरणों में HTTP ट्रैफिक भेजने की अनुमति है, जो बाहरी मशीनों को आपके मशीनों को मारने से बाहरी अनएन्क्रिप्टेड HTTP यातायात को रोक देगा।




अंक सहित:

  1. एसएसएल सेटअप
    1. Config / local.js में
    2. विन्यास / env / production.js में

HTTP और डब्ल्यूएस हैंडलिंग

  1. ऐप को एचटीटीपी पर विकास में चलाना चाहिए ताकि हम आसानी से हमारे ऐप को डीबग कर सकें।
  2. सुरक्षा चिंता के लिए ऐप को उत्पादन में एचटीटीपीएस पर चलाना चाहिए।
  3. ऐप उत्पादन HTTP अनुरोध हमेशा https पर रीडायरेक्ट करना चाहिए।

एसएसएल विन्यास

Sailsjs में सभी चीजों को कॉन्फ़िगर करने के दो तरीके हैं, सबसे पहले कॉन्फ़िगरेशन फ़ोल्डर में कॉन्फ़िगर करना है, प्रत्येक के साथ उनकी अलग-अलग फ़ाइलें होती हैं (जैसे सेटिंग्स के संबंध में डेटाबेस कनेक्शन कनेक्शन.जेएस के भीतर होता है)। और दूसरा पर्यावरण आधार फ़ाइल संरचना पर कॉन्फ़िगर किया गया है, प्रत्येक पर्यावरण फ़ाइलें config/env फ़ोल्डर में प्रस्तुत करती हैं और प्रत्येक फ़ाइल में विशेष env के लिए सेटिंग्स होती हैं।

सेल पहले कॉन्फ़िगर / एनवी फ़ोल्डर में दिखता है और फिर कॉन्फ़िगर / * .js के लिए तत्पर हैं

अब config/local.js में ssl सेटअप सेट करने देता है।

var local = {
   port: process.env.PORT || 1337,
   environment: process.env.NODE_ENV || 'development'
};

if (process.env.NODE_ENV == 'production') {
    local.ssl = {
        secureProtocol: 'SSLv23_method',
        secureOptions: require('constants').SSL_OP_NO_SSLv3,
        ca: require('fs').readFileSync(__dirname + '/path/to/ca.crt','ascii'),
        key: require('fs').readFileSync(__dirname + '/path/to/jsbot.key','ascii'),
        cert: require('fs').readFileSync(__dirname + '/path/to/jsbot.crt','ascii')
    };
    local.port = 443; // This port should be different than your default port
}

module.exports = local;

वैकल्पिक आप इसे config / env / production.js में भी जोड़ सकते हैं। (यह स्निपेट यह भी दिखाता है कि एकाधिक कैरेट प्रमाणपत्र को कैसे संभाला जाए)

या उत्पादन.जेएस में

module.exports = {
    port: 443,
    ssl: {
        secureProtocol: 'SSLv23_method',
        secureOptions: require('constants').SSL_OP_NO_SSLv3,
        ca: [
            require('fs').readFileSync(__dirname + '/path/to/AddTrustExternalCARoot.crt', 'ascii'),
            require('fs').readFileSync(__dirname + '/path/to/COMODORSAAddTrustCA.crt', 'ascii'),
            require('fs').readFileSync(__dirname + '/path/to/COMODORSADomainValidationSecureServerCA.crt', 'ascii')
        ],
        key: require('fs').readFileSync(__dirname + '/path/to/jsbot.key', 'ascii'),
        cert: require('fs').readFileSync(__dirname + '/path/to/jsbot.crt', 'ascii')
    }
};

http / https और ws / wss पुनर्निर्देशन

यहां ws वेब सॉकेट है और Wss सुरक्षित वेब सॉकेट का प्रतिनिधित्व करता है, क्योंकि हम एसएसएल सेट करते हैं, फिर http और ws दोनों अनुरोध सुरक्षित हो जाते हैं और क्रमशः https और wss में बदल जाते हैं।

हमारे ऐप से कई स्रोतों को किसी भी ब्लॉग पोस्ट, सोशल मीडिया पोस्ट जैसे अनुरोध प्राप्त होंगे, लेकिन हमारा सर्वर केवल https पर चलता है, इसलिए जब कोई अनुरोध http से आता है तो यह क्लाइंट ब्राउज़र में "यह साइट तक नहीं पहुंचा जा सकता" त्रुटि देता है। और हम अपनी वेबसाइट यातायात को नुकसान पहुंचाते हैं। तो हमें http अनुरोध को https पर रीडायरेक्ट करना होगा, समान नियम वेबसाकेट के लिए अनुमति देते हैं अन्यथा सॉकेट विफल हो जाएगा।

इसलिए हमें पोर्ट 80 (http) पर एक ही सर्वर चलाने की आवश्यकता है, और पोर्ट 443 (https) पर सभी अनुरोधों को हटा दें। सेल पहले सर्वर उठाने से पहले विन्यास / bootstrap.js फ़ाइल संकलित करें। यहां हम पोर्ट 80 पर अपना एक्सप्रेस सर्वर शुरू कर सकते हैं।

Config / bootstrap.js में (http सर्वर बनाएं और सभी अनुरोध https पर रीडायरेक्ट करें)

module.exports.bootstrap = function(cb) {
    var express = require("express"),
        app = express();

    app.get('*', function(req, res) {  
        if (req.isSocket) 
            return res.redirect('wss://' + req.headers.host + req.url)  

        return res.redirect('https://' + req.headers.host + req.url)  
    }).listen(80);
    cb();
};

अब आप http://www.yourdomain.com पर जा सकते हैं, यह https://www.yourdomain.com पर रीडायरेक्ट करेगा




Links