Node.js में HTTPS सर्वर कैसे बनाएं?


360

SSL कुंजी और प्रमाणपत्र को देखते हुए, कोई HTTPS सेवा कैसे बनाता है?


2
मैंने एक्सप्रेस.जेएस के बजाय रिस्टिफाई.जेएस का इस्तेमाल किया , लेकिन विचार एक ही है। यहां बताया गया है कि मैं एक HTTP.Js सर्वर कैसे सेट करता हूं जो HTTP और HTTPS दोनों को स्वीकार करता है qugstart.com/blog/node-js/…
इंतजार करें

2
बिना व्यक्त और नोड के नवीनतम संस्करण के साथ - यहाँ देखें: stackoverflow.com/a/21809393/388026
pkyeck

1
इस सवाल का क्या हुआ? जवाब का मतलब है कि यह मूल रूप से एक्सप्रेस.जेएस के बारे में था।
doug65536

यह एक वैध, स्व-हस्ताक्षरित एसएसएल प्रमाणपत्र बनाने और एचटीटीपीएस सर्वर लॉन्च करने के लिए मामूली है, बस कुछ ही कदम
लॉयड

3
इसकी थोड़ी देर हो गई है, लेकिन अगर किसी को पूर्ण नोडज https https की जरूरत है, तो यहां पा सकते हैं: programmerblog.net/nodejs-https-server
Jason W

जवाबों:


150

मुझे निम्नलिखित उदाहरण मिला।

https://web.archive.org/web/20120203022122/http://www.silassewell.com/blog/2010/06/03/node-js-https-ssl-server-example/

यह नोड v0.1.94 - v0.3.1 के लिए काम करता है। server.setSecure()नोड के नए संस्करणों में हटा दिया गया है।

सीधे उस स्रोत से:

const crypto = require('crypto'),
  fs = require("fs"),
  http = require("http");

var privateKey = fs.readFileSync('privatekey.pem').toString();
var certificate = fs.readFileSync('certificate.pem').toString();

var credentials = crypto.createCredentials({key: privateKey, cert: certificate});

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

var server = http.createServer();
server.setSecure(credentials);
server.addListener("request", handler);
server.listen(8000);

3
setSecureपदावनत किया गया है। इसके बजाय बाहर की जाँच करें stackoverflow.com/questions/5136353/node-js-https-secure-error
लैरी बैटल

7
नीचे दिए गए आधिकारिक एक्सप्रेस जवाब को देखें @ जेकब मार्बल।
क्लेज़र्मक 1

21
यह नमूना अब काम नहीं करता है क्योंकि HTTPS कार्यान्वयन नोड.जेएस 0.4 में फिर से किया गया था। नोडjs.org पर संबंधित डॉक्स देखें। stackoverflow.com/questions/5136353/…
scottyab

10
यह उत्तर बहुत पुराना है और अब काम नहीं करता है। कृपया नीचे दिए गए pkyeck द्वारा उत्तर देखें, या पर जाएं: nodejs.org/api/https.html
Jay

2
इसके अलावा लिंक टूट गया है
TlonXP

484

एक्सप्रेस एपीआई दस्तावेज़ बहुत स्पष्ट रूप से यह पता मंत्र।

इसके अतिरिक्त यह उत्तर स्व-हस्ताक्षरित प्रमाण पत्र बनाने के लिए चरण देता है।

मैंने कुछ टिप्पणियाँ और Node.js HTTPS प्रलेखन से एक स्निपेट जोड़ा है :

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

// This line is from the Node.js HTTPS documentation.
var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.cert')
};

// Create a service (the app object is just a callback).
var app = express();

// Create an HTTP service.
http.createServer(app).listen(80);
// Create an HTTPS service identical to the HTTP service.
https.createServer(options, app).listen(443);

49
अच्छा लगा, बस यह खुद पोस्ट करने वाला था। धन्यवाद। इसके अतिरिक्त, मुझे यह लेख स्व-हस्ताक्षरित प्रमाण पत्र बनाने के लिए मददगार लगा।
क्लेज़र्मक 1

1
सुनिश्चित करें कि आप गुप्त त्रुटियों से बचने के लिए optionsपहले डालते https.createServerहैं।
व्यंग

1
मैं लगभग समान https सर्वर पोर्ट 8888 स्थापित कर रहा हूं और यह सुनिश्चित नहीं कर रहा हूं कि मार्गों को कैसे बदलना है। जब मैं कर्ल कर्ल --insecure लोकलहोस्ट चलाता हूं : 8888 कर्ल: (35) अज्ञात एसएसएल प्रोटोकॉल त्रुटि स्थानीयहोस्ट के संबंध में: 8888 क्या त्रुटि आ रही है और इसके चारों ओर कैसे प्राप्त करें। जब मैं ब्राउज़र में लोकलहोस्ट: 8888 टाइप करता हूं, तो यह हैंग हो जाता है और https: / localhost: 8888 SSL त्रुटि देता है
reza

2
@Costa आप एक्सप्रेस-फोर्स-एसएसएल या हाथ से लिखे मिडलवेयर के साथ http से https तक यूजर्स को रीडायरेक्ट कर सकते हैं - यह बहुत सीधा है
फ्लोटड्रॉप

1
@NathanMcKaskle आप पासवर्ड को निष्क्रिय कर सकते हैं: इस गाइड की जांच करें लेकिन यदि आप macOS का उपयोग कर रहे हैं तो सुनिश्चित करें कि उत्पन्न की लंबाई कम से कम 2048 है:openssl genrsa -out key.pem 2048
sakisk

87

"नोड https" को देखते समय यह प्रश्न मिला, लेकिन स्वीकृत उत्तर में उदाहरण बहुत पुराना है - नोड के वर्तमान (v0.10) संस्करण से डॉक्स से लिया गया है , इसे इस तरह दिखना चाहिए:

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

var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};

https.createServer(options, function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}).listen(8000);

एक जादू की तरह काम किया। यह जानकारी बहुत काम आई क्योंकि मैंने PHP ऐप के ऊपर एक नोड.जेएस टूल (पीडीएफजेएस) चलाया जो हाल ही में https पर चलने के लिए मजबूर किया गया था। Iframe एक वैकल्पिक, गैर- https पोर्ट पर मेरे नोड.जेएस ऐप को लोड करने के लिए बहुत नाखुश था।
lewsid

2
यह अच्छा लग रहा है, लेकिन मैं उन फ़ाइलों को कैसे उत्पन्न कर सकता हूं जिनकी आपको आवश्यकता है ( *.pem)? मैंने इस पृष्ठ का अनुसरण करने की कोशिश की , लेकिन localhost:8000ब्राउज़र में खोलने पर, कोई डेटा प्राप्त नहीं होता है (बस लोड हो रहा है ...)।
आयनों बिज़ुआ

7
@ IonicăBizău, चाबियाँ बनाने के लिए, स्थापित करें openssl, फिर cmd प्रॉम्प्ट में, टाइप करेंopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
mido

2
@ IonicăBizău आपको सीधे जाने की आवश्यकता है https://localhost:8080। HTTP HTTPS नहीं है।
फ्लोरियन वेंडेलबोर्न

क्या फ़ोल्डर के साथ https-server बनाना संभव है? तो आप इसमें फाइल डाल सकते हैं और उस फाइल को लोकलहोस्ट की
FrenkyB

47

उपरोक्त उत्तर अच्छे हैं लेकिन एक्सप्रेस और नोड के साथ यह ठीक काम करेगा।

चूंकि एक्सप्रेस आपके लिए ऐप बनाती है, इसलिए मैं इसे यहाँ छोड़ दूँगा।

var express = require('express')
  , fs = require('fs')
  , routes = require('./routes');

var privateKey = fs.readFileSync('cert/key.pem').toString();
var certificate = fs.readFileSync('cert/certificate.pem').toString();  

// To enable HTTPS
var app = module.exports = express.createServer({key: privateKey, cert: certificate});

यह तकनीकी रूप से अधिक सही उत्तर है, क्योंकि यह सवाल एक्सप्रेस के साथ कैसे करना था। जेएस
काटो

12
ऐसा लगता है कि "आवेदन अब http.Server से विरासत में नहीं मिला है"
मॉर्गन-ग्राहम

2
आप सेटिंग क्यों करते हैं module.exports? इसके लिए कोई ज़रूरत नहीं है
Matej

1
@matejkramny, शायद इसलिए कि यह परीक्षण करना आसान बनाता है।
जस्टिन

21

Node.js में एक HTTPS सर्वर के लिए न्यूनतम सेटअप कुछ इस तरह होगा:

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

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

https.createServer(httpsOptions, app).listen(4433);

यदि आप भी http अनुरोधों का समर्थन करना चाहते हैं, तो आपको बस यह छोटा संशोधन करने की आवश्यकता है:

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

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);

18

अपडेट करें

Greenlock.js के माध्यम से एन्क्रिप्ट करें का उपयोग करें

मूल पोस्ट

मैंने देखा कि इनमें से कोई भी उत्तर यह नहीं दर्शाता है कि श्रृंखला में एक इंटरमीडिएट रूट CA को जोड़ने के लिए, यहां कुछ शून्य-कॉन्फ़िगर उदाहरण हैं जिन्हें देखने के लिए खेलना है:

स्निपेट:

var options = {
  // this is the private key only
  key: fs.readFileSync(path.join('certs', 'my-server.key.pem'))

// this must be the fullchain (cert + intermediates)
, cert: fs.readFileSync(path.join('certs', 'my-server.crt.pem'))

// this stuff is generally only for peer certificates
//, ca: [ fs.readFileSync(path.join('certs', 'my-root-ca.crt.pem'))]
//, requestCert: false
};

var server = https.createServer(options);
var app = require('./my-express-or-connect-app').create(server);
server.on('request', app);
server.listen(443, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});

var insecureServer = http.createServer();
server.listen(80, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});

यह उन चीजों में से एक है जो अक्सर आसान होता है यदि आप इसे सीधे कनेक्ट या एक्सप्रेस के माध्यम से करने की कोशिश नहीं करते हैं, लेकिन देशी httpsमॉड्यूल को इसे संभालने दें और फिर कनेक्ट / एक्सप्रेस ऐप का उपयोग करने के लिए इसका उपयोग करें।

इसके अलावा, यदि आप server.on('request', app)सर्वर को बनाते समय ऐप को पास करने के बजाय उपयोग करते हैं, तो यह आपको serverकुछ इनिशिएटिव फंक्शन को पास करने का अवसर देता है जो कनेक्ट / एक्सप्रेस ऐप बनाता है (यदि आप उसी सर्वर पर ssl पर वेबस्कॉक करना चाहते हैं, तो उदाहरण)।


यह एक अच्छी व्याख्या है लेकिन, अपडेट अनुभाग में प्रदान की गई लिंक, टूटी हुई है (500 त्रुटि देता है)
Chucky

8

अपने एप्लिकेशन को दोनों httpऔर httpsपोर्ट पर 80और 443क्रमशः सुनने के लिए सक्षम करने के लिए , निम्न कार्य करें

एक एक्सप्रेस ऐप बनाएं:

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

द्वारा लौटाया गया ऐप express()एक जावास्क्रिप्ट फ़ंक्शन है। यह अनुरोधों को संभालने के लिए कॉलबैक के रूप में नोड के HTTP सर्वरों को पारित किया जा सकता है। यह एक ही कोड आधार का उपयोग करके आपके ऐप के HTTP और HTTPS दोनों संस्करणों को प्रदान करना आसान बनाता है।

आप इस प्रकार कर सकते हैं:

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

var options = {
  key: fs.readFileSync('/path/to/key.pem'),
  cert: fs.readFileSync('/path/to/cert.pem')
};

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

पूर्ण विवरण के लिए डॉक्टर को देखें


0

आप इसे Fastify फ्रेमवर्क के साथ आर्काइव भी कर सकते हैं:

const { readFileSync } = require('fs')
const Fastify = require('fastify')

const fastify = Fastify({
  https: {
    key: readFileSync('./test/asset/server.key'),
    cert: readFileSync('./test/asset/server.cert')
  },
  logger: { level: 'debug' }
})

fastify.listen(8080)

(और openssl req -nodes -new -x509 -keyout server.key -out server.certयदि आपको परीक्षण लिखने की आवश्यकता हो तो फाइलें बनाने के लिए दौड़ें )


-3
  1. यहाँ से सेट अप के लिए आरएसएल फाइल डाउनलोड करें: https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  2. बस अपने फ़ोल्डर को c ड्राइव में कॉपी करें।
  3. Opensl.cnf फ़ाइल बनाएं और उनकी सामग्री को यहां से डाउनलोड करें: http://web.mit.edu/crypto/openssl.cnf opensl.cnf को किसी भी स्थान पर रखा जा सकता है, लेकिन जब हम कमांड प्रॉम्प्ट में देते हैं, तो पथ को सही किया जा सकता है।
  4. ओपन कमांड प्रॉम्प्ट और सेट ओपनएसएल.एनएफएफ पथ C: \ set OPENSSL_CONF = d: /openssl.cnf 5. इस cmd में देखें: C: \ opensl-0.9.8r-i386-win32-rev2> opensl.exe
  5. फिर OpenSSL> genrsa -des3 -out server.enc.key 1024 चलाएं
  6. फिर यह पास वाक्यांशों के लिए पूछेगा: प्रमाणपत्र के लिए पासवर्ड के रूप में 4 से 11 वर्ण दर्ज करें
  7. फिर इस Openssl> req -new -key server.enc.key -out server.csr को रन करें
  8. फिर यह कुछ विवरण मांगेगा जैसे देश कोड राज्य का नाम आदि इसे स्वतंत्र रूप से भरें। १०। फिर Openssl> rsa -in server.enc.key -out server.key को रन करें
  9. इस OpenSSL> x509 -req -days 365 -in server.csr -signkey server.key -out server.crt को चलाएं फिर पिछले कोड का उपयोग करें जो स्टैक ओवरफ्लो पर हैं

यह ओटी है । ओपी का प्रश्न स्पष्ट है। प्रमाण पत्र पहले ही दिए जा चुके हैं।
मार्टिन श्नाइडर

-6
var path = require('path');
var express = require('express');

var app = express();

var staticPath = path.join(__dirname, '/public');
app.use(express.static(staticPath));

app.listen(8070, function() {
  console.log('Server started at port 8070');
});

3
आपको अपने कोड के साथ कुछ और स्पष्टीकरण देना चाहिए।
बेनोइट लेटिनियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.