Node.js এ কীভাবে এইচটিটিপিএস সার্ভার তৈরি করবেন?


360

একটি এসএসএল কী এবং শংসাপত্র দেওয়া, কীভাবে একজন এইচটিটিপিএস পরিষেবা তৈরি করে?


2
আমি এক্সপ্রেস.জেসের পরিবর্তে রাইটিফাই.জেএস ব্যবহার করেছি, তবে ধারণাটি একই। এখানে কিভাবে আমি একটি Node.js সার্ভার যা HTTP এবং HTTPS উভয় গ্রহণ কিছু করা হয়ে qugstart.com/blog/node-js/...
awaage

2
দ্রুতগামী ছাড়া নোড এর সবচেয়ে নতুন সংস্করণের সাথে - এখানে দেখুন: stackoverflow.com/a/21809393/388026
pkyeck

1
এই প্রশ্নে কি হয়েছে? উত্তরগুলি বোঝায় যে এটি মূলত এক্সপ্রেস.জেএস সম্পর্কে ছিল।
doug65536

এটি একটি বৈধ, স্ব-স্বাক্ষরিত এসএসএল সার্টিটি তৈরি করা এবং এইচটিটিপিএস সার্ভার আরম্ভ করার জন্য তুচ্ছ, মাত্র কয়েক ধাপ
লয়েড

3
এটি কিছুটা দেরিতে তবে যদি কারও একটি সম্পূর্ণ নোডেজ https টিউটোরিয়াল প্রয়োজন হয় তবে তা এখানে পেতে পারেন: প্রোগ্রামারব্লগ.নাট
জেসন ডব্লু

উত্তর:


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
এই নমুনাটি আর কাজ করে না কারণ এইচটিটিপিএস বাস্তবায়ন নোড.জেএস 0.4-এ পুনরায় করা হয়েছিল। সংশ্লিষ্ট নথিগুলি নোডেজেএস.আর.ওগিতে দেখুন। stackoverflow.com/questions/5136353/...
scottyab

10
এই উত্তরটি খুব পুরানো এবং আর কাজ করে না। অনুগ্রহ করে নীচে পিকিইকের উত্তর দেখুন বা এখানে যান: nodejs.org/api/https.html
জে শেঠ

2
এছাড়াও লিঙ্কটি নষ্ট হয়েছে
TlonXP

484

এক্সপ্রেস এপিআই ডক চমত্কার পরিষ্কারভাবে এই spells আউট।

অতিরিক্তভাবে এই উত্তরটি স্ব-স্বাক্ষরিত শংসাপত্র তৈরির পদক্ষেপ দেয়।

আমি নোড.জেএস এইচটিটিপিএস ডকুমেন্টেশন থেকে কিছু মন্তব্য এবং একটি স্নিপেট যুক্ত করেছি :

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
wobi

1
আমি প্রায় অনুরূপ https সার্ভার পোর্টটি 8888 সেট আপ করছি এবং কীভাবে রুটগুলি পরিবর্তন করা যায় তা নিশ্চিত নই। আমি যখন কার্ল কার্ল চালাচ্ছি - স্থানীয় সুরক্ষা সুরক্ষা: 8888 কার্ল: (35) স্থানীয় হোস্টের সাথে অজানা এসএসএল প্রোটোকল ত্রুটি: 8888 কী থেকে আসছে এবং কীভাবে এটি ঘুরতে হবে। যখন আমি ব্রাউজারে লোকালহোস্ট: 8888 টাইপ করি তখন এটি স্তব্ধ হয়ে যায় এবং https: / লোকালহোস্ট: 8888 এসএসএল ত্রুটি দেয়
রেজা

2
@ কোস্টা আপনি এক্সপ্রেস-ফোর্স-এসএসএল বা হাতের লিখিত মিডওয়্যারের মাধ্যমে HTTP থেকে https এ ব্যবহারকারীদের পুনর্নির্দেশ করতে পারেন - এটি বেশ সোজা
ফ্ল্যাটড্রপ

1
@ নাথানমাসকাস্কলে আপনি পাসওয়ার্ডটি অক্ষম করতে পারেন: এই গাইডটি পরীক্ষা করুন তবে আপনি যদি ম্যাকওএস ব্যবহার করছেন তবে নিশ্চিত হয়ে নিন যে উত্পন্ন কীটির দৈর্ঘ্য কমপক্ষে 2048:openssl genrsa -out key.pem 2048
সাকিস্ক

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);

কবজির মতো কাজ করেছেন। এই তথ্যটি খুব সহজেই কাজে আসল কারণ আমি পিএইচপি অ্যাপের শীর্ষে একটি নোড.জেএস টুল (পিডিএফএস) চালাচ্ছি যা সম্প্রতি https- র মাধ্যমে চালাতে বাধ্য হয়েছিল। বিকল্পটি, নন-https পোর্টে আমার নোড.জেএস অ্যাপ্লিকেশনটি লোড করতে ইফ্রেমে খুব অসন্তুষ্ট হয়েছিল।
লুসিড

2
এটি দেখতে দুর্দান্ত লাগছে তবে আপনি যে ফাইলগুলি সেখানে প্রয়োজন সেগুলি কীভাবে উত্পন্ন করতে পারি *.pem? আমি এই পৃষ্ঠাটি অনুসরণ করার চেষ্টা করেছি , তবে localhost:8000ব্রাউজারে খোলার সময় কোনও ডেটা পাওয়া যায় না (কেবল লোড হচ্ছে ...)।
আয়নিক বিজাউ

7
@ আয়নিকবিজাউ, কী তৈরির জন্য, ইনস্টল করুন openssl, তারপরে openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
সেমিডি

2
@ আয়নিকবিজাউ আপনার সরাসরি যেতে হবে https://localhost:8080। এইচটিটিপি এইচটিটিপিএস নয়।
ফ্লোরিয়ান ওয়েনডেলবোন

ফোল্ডার সহ https- সার্ভার তৈরি করা কি সম্ভব? সুতরাং আপনি এতে ফাইল রাখতে পারেন এবং সেই ফাইলটি লোকালহোস্টের
ফ্রেনকিবি

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? এর জন্য কোনও প্রয়োজন নেই
মতেজ

1
@ ম্যাটজক্রামনি, সম্ভবত এটি পরীক্ষা করা সহজ করে তোলে।
জাস্টিন

21

নোড.জেএসসে এইচটিটিপিএস সার্ভারের জন্য ন্যূনতম সেটআপটি এরকম হবে:

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

হালনাগাদ

গ্রিনলক.জেএস এর মাধ্যমে লেটস এনক্রিপ্ট ব্যবহার করুন

আসল পোস্ট

আমি লক্ষ্য করেছি যে এই উত্তরগুলির কোনওটিই দেখায় না যে চেইনে একটি ইন্টারমিডিয়েট রুট সিএ যুক্ত করা হচ্ছে, এটি দেখার জন্য এখানে খেলতে শূন্যের কয়েকটি উদাহরণ রয়েছে :

স্নিপেট:

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কিছু প্রাথমিক সূচনা ফাংশনটিতে পাস করার সুযোগ দেয় যা সংযোগ / এক্সপ্রেস অ্যাপ্লিকেশন তৈরি করে (যদি আপনি একই সার্ভারে এসএসএল এর মাধ্যমে ওয়েবসকেট করতে চান , উদাহরণস্বরূপ)।


এটি একটি দুর্দান্ত ব্যাখ্যা তবে, আপডেট বিভাগে প্রদত্ত লিঙ্কটি নষ্ট হয়ে গেছে (500 ত্রুটি দেয়)
চকি

8

উভয় শোনার জন্য আপনার app সক্ষম করতে httpএবং httpsপোর্ট 80এবং 443যথাক্রমে নিম্নোক্ত কাজ

একটি এক্সপ্রেস অ্যাপ তৈরি করুন:

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

ফিরিয়ে দেওয়া অ্যাপ্লিকেশনটি express()একটি জাভাস্ক্রিপ্ট ফাংশন। অনুরোধগুলি পরিচালনা করার জন্য এটি নোডের এইচটিটিপি সার্ভারগুলিতে কলব্যাক হিসাবে দেওয়া যেতে পারে। এটি একই কোড বেস ব্যবহার করে আপনার অ্যাপ্লিকেশনটির এইচটিটিপি এবং এইচটিটিপিএস উভয় সংস্করণ সরবরাহ করা সহজ করে তোলে।

আপনি নিম্নলিখিত হিসাবে এটি করতে পারেন:

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

আপনি এটি ফ্যাসিফাই কাঠামোর সাহায্যে সংরক্ষণাগারও ব্যবহার করতে পারেন:

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. কেবলমাত্র আপনার ফোল্ডারটি সি ড্রাইভে অনুলিপি করুন।
  3. ওপেনএসএল সিএনএফ ফাইল তৈরি করুন এবং তাদের সামগ্রীগুলি ডাউনলোড করুন : http://web.mit.edu/crypto/openssl.cnf ওপেনএসএল.সিএনএফকে যে কোনও জায়গায় রাখা যেতে পারে তবে আমরা কমান্ড প্রম্পট দেওয়ার সময় পথের শব্দটি সঠিক হতে পারে।
  4. ওপেন কমান্ড প্রম্পট এবং সেট করুন ওপেনএসএল.এনএফ পাথ সি: OP সেট করুন ওপেনএসএল_সিএনএফ = ডি: / ওপেনসেল.সিএনএফ 5. এটি সেন্টিমিডিতে চালান: সি: \ ওপেনসেল-0.9.8r-i386-win32-rev2> openssl.exe
  5. তারপরে ওপেনএসএসএল> জেনার্সা -ডেস 3-আউট সার্ভার.এনসি.কি 1024 চালান
  6. তারপরে এটি পাস বাক্যাংশগুলির জন্য জিজ্ঞাসা করবে: শংসাপত্রের জন্য আপনার পাসওয়ার্ড হিসাবে 4 থেকে 11 অক্ষর লিখুন
  7. তারপরে এই ওপেনসেল> রেকিউ-নতুন -কি সার্ভার.এনসি.কি-আউট সার্ভার সিএসএসআরটি চালান
  8. তারপরে এটি কিছু বিশদ জানতে চাইবে যেমন দেশের কোড রাষ্ট্রের নাম ইত্যাদি এটিকে নিখরচায় পূরণ করুন। 10। তারপরে ওপেনএসএল> আরএসএ-ইন সার্ভার.এনসি.কি-আউট সার্ভার.কি চালান
  9. এই ওপেনএসএসএল> 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
আপনার কোড সহ আপনার আরও কিছু ব্যাখ্যা সরবরাহ করা উচিত।
বেনোত ল্যাটিনিয়র
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.