Node.js HTTPS Module

Node.js HTTPS

HTTPS মডিউল পরিচিতি

HTTPS মডিউল হল Node.js এর একটি মূল মডিউল যা HTTPS প্রোটোকলের একটি বাস্তবায়ন প্রদান করে, যা মূলত TLS/SSL এর উপর HTTP।

এটি HTTP মডিউলের একটি সুরক্ষিত সংস্করণ যা ক্লায়েন্ট এবং সার্ভারের মধ্যে এনক্রিপ্ট করা যোগাযোগ প্রদান করে।

ডেটা এনক্রিপশন

কাঁপুনি চোখ থেকে রক্ষা করে

সার্ভার প্রমাণীকরণ

সার্ভারের পরিচয় যাচাই করা হচ্ছে

ডেটা অখণ্ডতা

ডেটা পরিবর্তন বা দুর্নীতি প্রতিরোধ করে

কেন HTTPS ব্যবহার করবেন?

আধুনিক ওয়েব অ্যাপ্লিকেশনগুলির জন্য HTTPS গুরুত্বপূর্ণ কারণ এটি:

ডেটা এনক্রিপ্ট করে:সংবেদনশীল তথ্য যেমন পাসওয়ার্ড, ক্রেডিট কার্ড নম্বর এবং ব্যক্তিগত ডেটা দেখা থেকে রক্ষা করে
প্রমাণীকরণ সার্ভার:যাচাই করে যে ক্লায়েন্টরা উদ্দিষ্ট সার্ভারের সাথে যোগাযোগ করছে
ডেটা অখণ্ডতা নিশ্চিত করে:ট্রান্সমিশনের সময় ডেটা পরিবর্তন বা দূষিত হতে বাধা দেয়
বিশ্বাস তৈরি করে:ভিজ্যুয়াল মার্কার (যেমন একটি প্যাডলক আইকন) ব্যবহারকারীর আস্থা বাড়ায়
এসইও অপ্টিমাইজ করা:অনুসন্ধান ইঞ্জিনগুলি অনুসন্ধান ফলাফলগুলিতে HTTPS ওয়েবসাইটগুলিকে অগ্রাধিকার দেয়৷
আধুনিক বৈশিষ্ট্য সক্ষম করে:অনেক ওয়েব API-এর (যেমন ভূ-অবস্থান, পরিষেবা কর্মী, ইত্যাদি) HTTPS প্রয়োজন

ℹ️দ্রষ্টব্য:

আধুনিক HTTPS TLS (ট্রান্সপোর্ট লেয়ার সিকিউরিটি) ব্যবহার করে, যা SSL (সিকিউর সকেট লেয়ার) এর উত্তরসূরী। এই পদগুলি প্রায়ই বিনিময়যোগ্যভাবে ব্যবহৃত হয়, কিন্তু SSL এখন অপ্রচলিত বলে বিবেচিত হয়।

⚠️গুরুত্বপূর্ণ:

2023 সাল পর্যন্ত, সমস্ত প্রধান ব্রাউজারে নতুন ওয়েব বৈশিষ্ট্য এবং API-এর জন্য HTTPS প্রয়োজন হবে। অনেক ব্রাউজার HTTPS ছাড়া সাইটকে "অনিরাপদ" হিসেবে চিহ্নিত করে।

কিভাবে HTTPS কাজ করে

ক্লায়েন্ট একটি নিরাপদ সংযোগ শুরু করেসার্ভারে
সার্ভার তার SSL/TLS শংসাপত্র প্রদান করেক্লায়েন্টের কাছে
ক্লায়েন্ট সার্টিফিকেট যাচাই করা হচ্ছেএকটি বিশ্বস্ত শংসাপত্র কর্তৃপক্ষের সাথে
একটি এনক্রিপ্ট করা অধিবেশন প্রতিষ্ঠিত হয়অসমমিতিক এনক্রিপশন ব্যবহার করে
সিমেট্রিক এনক্রিপশন ব্যবহার করা হয়প্রকৃত তথ্য স্থানান্তর জন্য

HTTPS দিয়ে শুরু করা

মডিউল আমদানি করা হচ্ছে

আপনার Node.js অ্যাপ্লিকেশনে HTTPS মডিউল ব্যবহার করতে, আপনি CommonJS বা ES মডিউল ব্যাকরণ ব্যবহার করে এটি আমদানি করতে পারেন:

CommonJS (Node.js default)

// Using require()
const https = require('https');

ES Modules (Node.js 14+)

// Using import (requires "type": "module" in package.json)
import https from 'https';

HTTPS vs HTTP API

HTTPS মডিউলের HTTP মডিউলের মতো একই ইন্টারফেস রয়েছে, প্রধান পার্থক্য হল এটি TLS/SSL ব্যবহার করে সংযোগ স্থাপন করে।

এর মানে হল HTTP মডিউলে উপলব্ধ সমস্ত পদ্ধতি এবং ইভেন্টগুলি HTTPS মডিউলে উপলব্ধ।

💡দ্রষ্টব্য:

ব্যবহারের মধ্যে প্রধান পার্থক্য হল যে HTTPS-এর জন্য SSL/TLS শংসাপত্র প্রয়োজন যখন HTTP-এর প্রয়োজন নেই৷

SSL/TLS শংসাপত্র

নিরাপদ সংযোগ স্থাপন করতে HTTPS-এর প্রয়োজন SSL/TLS শংসাপত্র। বিভিন্ন ধরণের শংসাপত্র রয়েছে:

শংসাপত্রের ধরন আবেদন যাচাই অবস্থা
স্ব-স্বাক্ষরিত শংসাপত্র উন্নয়ন এবং পরীক্ষার জন্য (ব্রাউজার দ্বারা বিশ্বস্ত নয়) কোন ভেরিফিকেশন নেই
ডোমেন যাচাইকৃত (DV) মৌলিক যাচাইকরণ শুধুমাত্র ডোমেনের মালিকানা যাচাই করে ডোমেনের মালিকানা
অর্গানাইজেশন ভ্যালিডেটেড (OV) সিস্টেমের বিবরণ যাচাই করা হচ্ছে সিস্টেমের বিশদ বিবরণ
বর্ধিত বৈধতা (EV) একটি উচ্চ স্তরের বৈধতা ব্রাউজারে কোম্পানির নাম প্রদর্শন করে সম্পূর্ণ আইনি যাচাই
ওয়াইল্ডকার্ড সার্টিফিকেট একটি ডোমেনের সমস্ত সাবডোমেন রক্ষা করে ডোমেইন এবং সমস্ত সাবডোমেন
মাল্টি-ডোমেইন (SAN) সার্টিফিকেট একটি শংসাপত্র সহ একাধিক ডোমেন রক্ষা করে একাধিক ডোমেইন

স্ব-স্বাক্ষরিত শংসাপত্র তৈরি করা

উন্নয়নের জন্য, আপনি OpenSSL ব্যবহার করে স্ব-স্বাক্ষরিত শংসাপত্র তৈরি করতে পারেন:

একটি মৌলিক স্ব-স্বাক্ষরিত শংসাপত্র

# Generate a private key (RSA 2048-bit)
openssl genrsa -out key.pem 2048

# Generate a self-signed certificate (valid for 365 days)
openssl req -new -x509 -key key.pem -out cert.pem -days 365 -nodes

সাবজেক্ট অল্টারনেটিভ নেমস (SAN) সহ।

# Create a config file (san.cnf)
cat > san.cnf << EOF
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = State
L = City
O = Organization
OU = Organizational Unit
CN = localhost
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
IP.1 = 127.0.0.1
EOF

# Generate key and certificate with SAN
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout key.pem -out cert.pem -config san.cnf -extensions 'v3_req'

⚠️নিরাপত্তা নোট:

স্ব-স্বাক্ষরিত শংসাপত্রগুলি ব্রাউজারগুলিতে নিরাপত্তা সতর্কতা ট্রিগার করতে পারে কারণ সেগুলি একটি বিশ্বস্ত শংসাপত্র কর্তৃপক্ষ দ্বারা স্বাক্ষরিত নয়৷

শুধুমাত্র উন্নয়ন এবং পরীক্ষার উদ্দেশ্যে এগুলি ব্যবহার করুন।

বিশ্বস্ত সার্টিফিকেট প্রাপ্তি

উত্পাদনের জন্য, বিশ্বস্ত শংসাপত্র কর্তৃপক্ষের কাছ থেকে শংসাপত্রগুলি পান:

প্রদত্ত CA

DigiCert, GlobalSign, Comodo, ইত্যাদি

বিনামূল্যে CA

Let's Encrypt, ZeroSSL, Cloudflare

🌟 Let's Encrypt:

আসুন এনক্রিপ্ট হল একটি জনপ্রিয় বিনামূল্যে, স্বয়ংক্রিয়, এবং ওপেন সার্টিফিকেট কর্তৃপক্ষ যা বিশ্বস্ত সার্টিফিকেট প্রদান করে।

একটি HTTPS সার্ভার তৈরি করা হচ্ছে

যখন আপনার SSL/TLS সার্টিফিকেট প্রস্তুত থাকে, তখন আপনি Node.js-এ একটি HTTPS সার্ভার তৈরি করতে পারেন।

HTTPS সার্ভার API HTTP সার্ভার API এর অনুরূপ, প্রধান পার্থক্য হল SSL/TLS আর্কিটেকচার।

বেসিক HTTPS সার্ভারের উদাহরণ

const https = require('https');
const fs = require('fs');
const path = require('path');

// Path to your SSL/TLS certificate and key
const sslOptions = {
  key: fs.readFileSync(path.join(__dirname, 'key.pem')),
  cert: fs.readFileSync(path.join(__dirname, 'cert.pem')),
  // Enable all security features
  minVersion: 'TLSv1.2',
  // Recommended security settings
  secureOptions: require('constants').SSL_OP_NO_SSLv3 |
              require('constants').SSL_OP_NO_TLSv1 |
              require('constants').SSL_OP_NO_TLSv1_1
};

// Create the HTTPS server
const server = https.createServer(sslOptions, (req, res) => {
  // Security headers
  res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
  res.setHeader('X-Content-Type-Options', 'nosniff');
  res.setHeader('X-Frame-Options', 'SAMEORIGIN');
  res.setHeader('X-XSS-Protection', '1; mode=block');
  res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');

  // Handle different routes
  if (req.url === '/') {
    res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
    res.end('

Welcome to the Secure Server

Your connection is encrypted!

'); } else if (req.url === '/api/status') { res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ status: 'ok', time: new Date().toISOString() })); } else { res.writeHead(404, { 'Content-Type': 'text/plain' }); res.end('404 Not Found'); } }); // Handle server errors server.on('error', (error) => { console.error('Server error:', error); }); // Start the server on port 3000 (HTTPS default is 443 but requires root) const PORT = process.env.PORT || 3000; server.listen(PORT, '0.0.0.0', () => { console.log(`Server running at https://localhost:${PORT}`); console.log('Press Ctrl+C to stop the server'); });

💡দ্রষ্টব্য:

ইউনিক্স-এর মতো সিস্টেমে, 1024-এর কম পোর্টের রুট অনুমতি প্রয়োজন। উত্পাদনের জন্য, উচ্চ পোর্টে (3000, 8080, ইত্যাদি) Node.js চালানো এবং SSL সমাপ্তির জন্য Nginx বা Apache এর মতো বিপরীত প্রক্সি ব্যবহার করা সাধারণ।

উন্নত সার্ভার কনফিগারেশন

উৎপাদন পরিবেশের জন্য, আপনার একটি উন্নত SSL/TLS কনফিগারেশনের প্রয়োজন হতে পারে:

OCSP স্ট্যাপলিং এবং সেশন পুনঃসূচনা সহ উন্নত HTTPS সার্ভার

const https = require('https');
const fs = require('fs');
const path = require('path');
const tls = require('tls');

// Path to your SSL/TLS files
const sslOptions = {
  // Certificate and key
  key: fs.readFileSync(path.join(__dirname, 'privkey.pem')),
  cert: fs.readFileSync(path.join(__dirname, 'cert.pem')),
  ca: [
    fs.readFileSync(path.join(__dirname, 'chain.pem'))
  ],

  // Recommended security settings
  minVersion: 'TLSv1.2',
  maxVersion: 'TLSv1.3',
  ciphers: [
    'TLS_AES_256_GCM_SHA384',
    'TLS_CHACHA20_POLY1305_SHA256',
    'TLS_AES_128_GCM_SHA256',
    'ECDHE-ECDSA-AES256-GCM-SHA384',
    'ECDHE-RSA-AES256-GCM-SHA384',
    'ECDHE-ECDSA-CHACHA20-POLY1305',
    'ECDHE-RSA-CHACHA20-POLY1305',
    'ECDHE-ECDSA-AES128-GCM-SHA256',
    'ECDHE-RSA-AES128-GCM-SHA256'
  ].join(':'),
  honorCipherOrder: true,
 
  // Enable OCSP Stapling
  requestCert: true,
  rejectUnauthorized: true,
 
  // Enable session resumption
  sessionTimeout: 300, // 5 minutes
  sessionIdContext: 'my-secure-app'
};

// Create the HTTPS server
const server = https.createServer(sslOptions, (req, res) => {
  // Security headers
  const securityHeaders = {
    'Strict-Transport-Security': 'max-age=63072000; includeSubDomains; preload',
    'X-Content-Type-Options': 'nosniff',
    'X-Frame-Options': 'DENY',
    'X-XSS-Protection': '1; mode=block',
    'Content-Security-Policy': "default-src 'self'",
    'Referrer-Policy': 'strict-origin-when-cross-origin',
    'Permissions-Policy': 'geolocation=(), microphone=(), camera=()',
  };
 
  Object.entries(securityHeaders).forEach(([key, value]) => {
    res.setHeader(key, value);
  });

  // Handle requests
  if (req.url === '/') {
    res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
    res.end('

Secure Node.js Server

Your connection is secure!

'); } else { res.writeHead(404, { 'Content-Type': 'text/plain' }); res.end('404 Not Found'); } }); // Handle server errors server.on('error', (error) => { console.error('Server error:', error); }); // Handle uncaught exceptions process.on('uncaughtException', (error) => { console.error('Uncaught exception:', error); // Perform graceful shutdown server.close(() => process.exit(1)); }); // Handle unhandled promise rejections process.on('unhandledRejection', (reason, promise) => { console.error('Unhandled Rejection at:', promise, 'reason:', reason); }); // Handle graceful shutdown const gracefulShutdown = () => { console.log('Shutting down gracefully...'); server.close(() => { console.log('Server closed'); process.exit(0); }); // Force close server after 10 seconds setTimeout(() => { console.error('Forcing shutdown...'); process.exit(1); }, 10000); }; // Listen for shutdown signals process.on('SIGTERM', gracefulShutdown); process.on('SIGINT', gracefulShutdown); // Start the server const PORT = process.env.PORT || 3000; const HOST = process.env.HOST || '0.0.0.0'; server.listen(PORT, HOST, () => { const { address, port } = server.address(); console.log(`Server running at https://${address}:${port}`); // Output server information console.log('Node.js version:', process.version); console.log('Environment:', process.env.NODE_ENV || 'development'); console.log('PID:', process.pid); });

🔒নিরাপত্তার সর্বোত্তম অভ্যাস:

  • নিরাপত্তা আপডেটের জন্য সর্বদা Node.js এর সর্বশেষ স্থিতিশীল সংস্করণ ব্যবহার করুন
  • npm auditএবংnpm updateব্যবহার করে আপনার নির্ভরতা আপডেট রাখুন
  • সংবেদনশীল কনফিগারেশনের জন্য এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করুন (কখনও ভার্সন কন্ট্রোলে গোপনীয়তা করবেন না)
  • অপব্যবহার রোধ করতে রেট ক্যাপিং প্রয়োগ করুন
  • আপনার SSL/TLS সার্টিফিকেট নিয়মিত ঘোরান
  • নিরাপত্তা দুর্বলতা জন্য আপনার সার্ভার নিরীক্ষণ
  • অতিরিক্ত নিরাপত্তা বৈশিষ্ট্যের জন্য উৎপাদনে Nginx বা Apache এর মত একটি বিপরীত প্রক্সি ব্যবহার করুন

আপনার HTTPS সার্ভার পরীক্ষা করা হচ্ছে

আপনি আপনার HTTPS সার্ভার পরীক্ষা করতে কার্ল বা একটি ওয়েব ব্রাউজার ব্যবহার করতে পারেন:

কার্ল ব্যবহার করে

# Skip certificate verification (for self-signed certs)
curl -k https://localhost:3000

# With certificate verification (for trusted certs)
curl --cacert /path/to/ca.pem https://yourdomain.com

একটি ওয়েব ব্রাউজার ব্যবহার করে

# আপনার ওয়েব ব্রাউজার খুলুন এবং https://localhost:3000-এ নেভিগেট করুন # একটি স্ব-স্বাক্ষরিত শংসাপত্র ব্যবহার করলে নিরাপত্তা সতর্কতা গ্রহণ করুন # উন্নত করার জন্য, আপনি বিশ্বস্ত রুট শংসাপত্রগুলিতে আপনার স্ব-স্বাক্ষরিত শংসাপত্র যোগ করতে পারেন

HTTPS অনুরোধ করা

HTTPS মডিউল আপনাকে অন্যান্য সার্ভারে নিরাপদ HTTP অনুরোধ করতে দেয়।

নিরাপদ API এবং ওয়েব পরিষেবাগুলির সাথে যোগাযোগের জন্য এটি অপরিহার্য৷

একটি মৌলিক GET অনুরোধ

const https = require('https');
const { URL } = require('url');

// Parse the target URL
const apiUrl = new URL('https://api.example.com/data');

// Request options
const options = {
  hostname: apiUrl.hostname,
  port: 443,
  path: apiUrl.pathname + apiUrl.search,
  method: 'GET',
  headers: {
    'User-Agent': 'MySecureApp/1.0',
    'Accept': 'application/json',
    'Cache-Control': 'no-cache'
  },
  // Security settings
  rejectUnauthorized: true, // Verify the server certificate (default: true)
  // Timeout in milliseconds
  timeout: 10000, // 10 seconds
};

console.log(`Making request to: https://${options.hostname}${options.path}`);

// Make the HTTPS request
const req = https.request(options, (res) => {
  const { statusCode, statusMessage, headers } = res;
  const contentType = headers['content-type'] || '';

  console.log(`Status: ${statusCode} ${statusMessage}`);
  console.log('Headers:', headers);

  // Handle redirects
  if (statusCode >= 300 && statusCode < 400 && headers.location) {
    console.log(`Redirecting to: ${headers.location}`);
    // In a real app, you'd handle the redirect
    res.resume(); // Discard the response body
    return;
  }

  // Check for successful response
  let error;
  if (statusCode !== 200) {
    error = new Error(`Request Failed.\nStatus Code: ${statusCode}`);
  } else if (!/^application\/json/.test(contentType)) {
    error = new Error(`Invalid content-type.\nExpected application/json but received ${contentType}`);
  }
  if (error) {
    console.error(error.message);
    res.resume(); // Consume response data to free up memory
    return;
  }

  // Process the response
  let rawData = '';
  res.setEncoding('utf8');

  // Collect chunks of data
  res.on('data', (chunk) => {
    rawData += chunk;
  });

  // Process the complete response
  res.on('end', () => {
    try {
      const parsedData = JSON.parse(rawData);
      console.log('Response data:', parsedData);
    } catch (e) {
      console.error('Error parsing JSON:', e.message);
    }
  });
});

// Handle request errors
req.on('error', (e) => {
  console.error(`Request error: ${e.message}`);
});

// End the request (required to send it)
req.end();

সহজ অনুরোধের জন্য https.get() ব্যবহার করে

const https = require('https');
const { URL } = require('url');

// Parse the URL
const url = new URL('https://jsonplaceholder.typicode.com/posts/1');

// Request options
const options = {
  hostname: url.hostname,
  path: url.pathname,
  method: 'GET',
  headers: {
    'Accept': 'application/json',
    'User-Agent': 'MySecureApp/1.0'
  }
};

console.log(`Fetching data from: ${url}`);

// Make the GET request
const req = https.get(options, (res) => {
  const { statusCode } = res;
  const contentType = res.headers['content-type'];

  if (statusCode !== 200) {
    console.error(`Request failed with status code: ${statusCode}`);
    res.resume(); // Consume response data to free up memory
    return;
  }

  if (!/^application\/json/.test(contentType)) {
    console.error(`Expected JSON but got ${contentType}`);
    res.resume();
    return;
  }

  let rawData = '';
  res.setEncoding('utf8');

  // Collect data chunks
  res.on('data', (chunk) => {
    rawData += chunk;
  });

  // Process complete response
  res.on('end', () => {
    try {
      const parsedData = JSON.parse(rawData);
      console.log('Received data:', parsedData);
    } catch (e) {
      console.error('Error parsing JSON:', e.message);
    }
  });
});

// Handle errors
req.on('error', (e) => {
  console.error(`Error: ${e.message}`);
});

// Set a timeout
req.setTimeout(10000, () => {
  console.error('Request timeout');
  req.destroy();
});

উদাহরণ আউটপুট:

Response: {
  userId: 1,
  id: 1,
  title: "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  body: "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}

POST অনুরোধ করা

const https = require('https');
const { URL } = require('url');

// Request data
const postData = JSON.stringify({
  title: 'foo',
  body: 'bar',
  userId: 1
});

// Parse the URL
const url = new URL('https://jsonplaceholder.typicode.com/posts');

// Request options
const options = {
  hostname: url.hostname,
  port: 443,
  path: url.pathname,
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Content-Length': Buffer.byteLength(postData),
    'User-Agent': 'MySecureApp/1.0',
    'Accept': 'application/json'
  },
  timeout: 10000 // 10 seconds
};

console.log('Sending POST request to:', url.toString());

// Create the request
const req = https.request(options, (res) => {
  console.log(`Status Code: ${res.statusCode}`);
  console.log('Headers:', res.headers);

  let responseData = '';
  res.setEncoding('utf8');

  // Collect response data
  res.on('data', (chunk) => {
    responseData += chunk;
  });

  // Process complete response
  res.on('end', () => {
    try {
      const parsedData = JSON.parse(responseData);
      console.log('Response:', parsedData);
    } catch (e) {
      console.error('Error parsing response:', e.message);
    }
  });
});

// Handle errors
req.on('error', (e) => {
  console.error(`Request error: ${e.message}`);
});

// Set a timeout
req.setTimeout(15000, () => {
  req.destroy(new Error('Request timeout after 15 seconds'));
});

// Write data to request body
req.write(postData);

// End the request
req.end();

🔧HTTPS অনুরোধের জন্য সর্বোত্তম অনুশীলন:

  • একটি অনুরোধ পাঠানোর আগে সর্বদা ইনপুট ডেটা যাচাই এবং পরিমার্জন করুন৷
  • এপিআই কী-এর মতো সংবেদনশীল তথ্যের জন্য পরিবেশ ভেরিয়েবল ব্যবহার করুন
  • সঠিক ত্রুটি হ্যান্ডলিং এবং সময় সিদ্ধান্ত বাস্তবায়ন
  • উপযুক্ত শিরোনাম সেট করুন (কন্টেন্ট-টাইপ, অ্যাকসেপ্ট, ইউজার-এজেন্ট)
  • সঠিকভাবে পুনঃনির্দেশ পরিচালনা করুন (3xx স্ট্যাটাস কোড)
  • সাময়িক ব্যর্থতার জন্য পুনরায় চেষ্টা করার যুক্তি প্রয়োগ করুন
  • আরও জটিল পরিস্থিতির জন্য অ্যাক্সিওস বা নোড-ফেচের মতো একটি লাইব্রেরি ব্যবহার করুন

Express.js সহ HTTPS সার্ভার

আপনি প্রধান HTTPS মডিউল সরাসরি ব্যবহার করতে পারেন, কিন্তু বেশিরভাগ Node.js অ্যাপ্লিকেশন HTTP/HTTPS অনুরোধগুলি পরিচালনা করতে Express.js এর মতো একটি ওয়েব ফ্রেমওয়ার্ক ব্যবহার করে।

Express.js সহ একটি মৌলিক HTTPS সার্ভার

const express = require('express');
const https = require('https');
const fs = require('fs');
const path = require('path');
const helmet = require('helmet'); // Security middleware

// Create Express app
const app = express();

// Security middleware
app.use(helmet());

// Parse JSON and URL-encoded bodies
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Serve static files from 'public' directory
app.use(express.static(path.join(__dirname, 'public'), {
  dotfiles: 'ignore',
  etag: true,
  extensions: ['html', 'htm'],
  index: 'index.html',
  maxAge: '1d',
  redirect: true
}));

// Routes
app.get('/', (req, res) => {
  res.send('

Welcome to Secure Express Server

'); }); app.get('/api/status', (req, res) => { res.json({ status: 'operational', timestamp: new Date().toISOString(), environment: process.env.NODE_ENV || 'development', nodeVersion: process.version }); }); // Error handling middleware app.use((err, req, res, next) => { console.error(err.stack); res.status(500).json({ error: 'Something went wrong!' }); }); // 404 handler app.use((req, res) => { res.status(404).json({ error: 'Not Found' }); }); // SSL/TLS options const sslOptions = { key: fs.readFileSync(path.join(__dirname, 'key.pem')), cert: fs.readFileSync(path.join(__dirname, 'cert.pem')), // Enable HTTP/2 if available allowHTTP1: true, // Recommended security options minVersion: 'TLSv1.2', ciphers: [ 'TLS_AES_256_GCM_SHA384', 'TLS_CHACHA20_POLY1305_SHA256', 'TLS_AES_128_GCM_SHA256', 'ECDHE-RSA-AES128-GCM-SHA256', '!DSS', '!aNULL', '!eNULL', '!EXPORT', '!DES', '!RC4', '!3DES', '!MD5', '!PSK' ].join(':'), honorCipherOrder: true }; // Create HTTPS server const PORT = process.env.PORT || 3000; const server = https.createServer(sslOptions, app); // Handle unhandled promise rejections process.on('unhandledRejection', (reason, promise) => { console.error('Unhandled Rejection at:', promise, 'reason:', reason); }); // Handle uncaught exceptions process.on('uncaughtException', (error) => { console.error('Uncaught Exception:', error); // Perform cleanup and exit if needed process.exit(1); }); // Graceful shutdown const gracefulShutdown = (signal) => { console.log(`\nReceived ${signal}. Shutting down gracefully...`); server.close(() => { console.log('HTTP server closed.'); // Close database connections, etc. process.exit(0); }); // Force close server after 10 seconds setTimeout(() => { console.error('Forcing shutdown...'); process.exit(1); }, 10000); }; // Listen for shutdown signals process.on('SIGTERM', gracefulShutdown); process.on('SIGINT', gracefulShutdown); // Start the server const HOST = process.env.HOST || '0.0.0.0'; server.listen(PORT, HOST, () => { console.log(`Express server running at https://${HOST}:${PORT}`); console.log('Environment:', process.env.NODE_ENV || 'development'); console.log('Press Ctrl+C to stop the server'); });

পরিবেশ ভেরিয়েবল ব্যবহার করে

.env ফাইল

NODE_ENV=development
PORT=3000
HOST=0.0.0.0
SSL_KEY_PATH=./key.pem
SSL_CERT_PATH=./cert.pem

পরিবেশ ভেরিয়েবল লোড হচ্ছে

require('dotenv').config();

// Access environment variables
const PORT = process.env.PORT || 3000;
const HOST = process.env.HOST || '0.0.0.0';
const sslOptions = {
  key: fs.readFileSync(process.env.SSL_KEY_PATH),
  cert: fs.readFileSync(process.env.SSL_CERT_PATH)
  // ... other options
};

উৎপাদন সম্প্রসারণ

উৎপাদনে, আপনার Node.js অ্যাপ্লিকেশনের সামনে Nginx বা Apache-এর মতো একটি বিপরীত প্রক্সি ব্যবহার করার পরামর্শ দেওয়া হয়। এটি প্রদান করে:

SSL/TLS সমাপ্তি
লোড ব্যালেন্সিং
স্ট্যান্ডার্ড ফাইল পরিষেবা
ডিমান্ড কেসিং
হার সীমা
সেরা নিরাপত্তা বিষয়

Nginx কনফিগারেশনের উদাহরণ

server {
  listen 443 ssl http2;
  server_name yourdomain.com;

  # SSL configuration
  ssl_certificate /path/to/your/cert.pem;
  ssl_certificate_key /path/to/your/key.pem;

  # Security headers
  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
  add_header X-Content-Type-Options "nosniff" always;
  add_header X-Frame-Options "SAMEORIGIN" always;
  add_header X-XSS-Protection "1; mode=block" always;

  # Proxy to Node.js app
  location / {
    proxy_pass http://localhost:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }

  # Serve static files directly
  location /static/ {
    root /path/to/your/app/public;
    expires 30d;
    access_log off;
  }
}

# Redirect HTTP to HTTPS
server {
  listen 80;
  server_name yourdomain.com;
  return 301 https://$host$request_uri;
}

🚀 Express.js HTTPS :

  • নিরাপত্তা শিরোনামের জন্য সর্বদা হেলমেট মিডলওয়্যার ব্যবহার করুন
  • নিরাপদ সেশন অপশন সেট করুন (যদি সেশন ব্যবহার করেন)
  • কনফিগারেশনের জন্য পরিবেশ ভেরিয়েবল ব্যবহার করুন
  • সঠিক ত্রুটি হ্যান্ডলিং এবং লগিং বাস্তবায়ন
  • উৎপাদনে একটি বিপরীত প্রক্সি ব্যবহার করুন
  • আপনার পক্ষপাতগুলি দীর্ঘস্থায়ী রাখুন
  • সেরা পারফরম্যান্সের জন্য HTTP/2 ব্যবহার করুন
  • অপব্যবহার রোধ করতে রেট ক্যাপিং প্রয়োগ করুন
  • আপনার API বিভিন্ন ডোমেন থেকে অ্যাক্সেস করা হলে CORS মিডলওয়্যার ব্যবহার করুন

Node.js সহ HTTP/2

HTTP/2 হল HTTP প্রোটোকলের একটি প্রধান সংশোধন যা HTTP/1.1 এর তুলনায় উল্লেখযোগ্য কর্মক্ষমতা উন্নতি প্রদান করে। HTTPS-এর সাথে মিলিত, এটি আধুনিক ওয়েব অ্যাপ্লিকেশনগুলির জন্য নিরাপত্তা এবং কর্মক্ষমতা সুবিধা প্রদান করে।

HTTP/2 এর সুবিধা

মাল্টিপ্লেক্সিং:একাধিক অনুরোধ/প্রতিক্রিয়া একটি একক সংযোগে সমান্তরালভাবে পাঠানো যেতে পারে, হেড-অফ-লাইন বাধা দূর করে।
বিষয়ের সারাংশ:HTTP হেডার (HPACK অ্যালগরিদম) সংকুচিত করে ওভারহেড হ্রাস করে
সার্ভার পুশ:ক্লায়েন্টকে অনুরোধ করার আগে সার্ভার সক্রিয়ভাবে সম্পদ পাঠাতে পারে
বাইনারি প্রোটোকল:HTTP/1.1 এর পাঠ্য-ভিত্তিক বিন্যাসের চেয়ে পার্স করার জন্য আরও দক্ষ
স্ট্রিম অগ্রাধিকার:সমালোচনামূলক সংস্থানগুলি প্রথমে লোড করা যেতে পারে
লিঙ্ক মাল্টিপ্লেক্সিং:একাধিক স্ট্রীম একটি একক TCP সংযোগ ভাগ করতে পারে

HTTP/2 সার্ভারের উদাহরণ

const http2 = require('http2');
const fs = require('fs');
const path = require('path');

// SSL/TLS options
const serverOptions = {
  key: fs.readFileSync(path.join(__dirname, 'key.pem')),
  cert: fs.readFileSync(path.join(__dirname, 'cert.pem')),
  allowHTTP1: true, // Fallback to HTTP/1.1 if needed

  // Recommended security settings
  minVersion: 'TLSv1.2',
  ciphers: [
    'TLS_AES_256_GCM_SHA384',
    'TLS_CHACHA20_POLY1305_SHA256',
    'TLS_AES_128_GCM_SHA256',
    'ECDHE-ECDSA-AES256-GCM-SHA384',
    '!aNULL',
    '!eNULL',
    '!EXPORT',
    '!DES',
    '!RC4',
    '!3DES',
    '!MD5',
    '!PSK'
  ].join(':'),
  honorCipherOrder: true
};

// Create HTTP/2 server
const server = http2.createSecureServer(serverOptions);

// Handle incoming requests
server.on('stream', (stream, headers) => {
  const method = headers[':method'];
  const path = headers[':path'];
  const scheme = headers[':scheme'];
  const authority = headers[':authority'];

  console.log(`${method} ${path} (HTTP/2)`);

  // Handle different routes
  if (path === '/') {
    // Set response headers
    stream.respond({
      'content-type': 'text/html; charset=utf-8',
      ':status': 200,
      'x-powered-by': 'Node.js HTTP/2',
      'cache-control': 'public, max-age=3600'
    });

    // Send HTML response
    stream.end(`
      









      
      
        HTTP/2 Server
        
      
      
        

Hello from HTTP/2 Server!

This page is served over HTTP/2.

Loading data...
`); } // API endpoint else if (path === '/api/data' && method === 'GET') { stream.respond({ 'content-type': 'application/json', ':status': 200, 'cache-control': 'no-cache' }); stream.end(JSON.stringify({ message: 'Data from HTTP/2 API', timestamp: new Date().toISOString(), protocol: 'HTTP/2', server: 'Node.js HTTP/2 Server' })); } // Server Push example else if (path === '/push') { // Push additional resources stream.pushStream({ ':path': '/styles.css' }, (err, pushStream) => { if (err) { console.error('Push stream error:', err); return; } pushStream.respond({ 'content-type': 'text/css', ':status': 200 }); pushStream.end('body { font-family: Arial, sans-serif; margin: 2em; }'); }); stream.respond({ 'content-type': 'text/html; charset=utf-8', ':status': 200 }); stream.end('

Server Push Example

'); } // 404 Not Found else { stream.respond({ 'content-type': 'text/plain', ':status': 404 }); stream.end('404 - Not Found'); } }); // Handle errors server.on('error', (err) => { console.error('Server error:', err); process.exit(1); }); // Start the server const PORT = process.env.PORT || 8443; server.listen(PORT, '0.0.0.0', () => { console.log(`HTTP/2 server running at https://localhost:${PORT}`); console.log('Environment:', process.env.NODE_ENV || 'development'); console.log('Press Ctrl+C to stop the server'); }); // Graceful shutdown const gracefulShutdown = (signal) => { console.log(`\nReceived ${signal}. Shutting down gracefully...`); server.close(() => { console.log('HTTP/2 server closed.'); process.exit(0); }); // Force close server after 10 seconds setTimeout(() => { console.error('Forcing shutdown...'); process.exit(1); }, 10000); }; // Listen for shutdown signals process.on('SIGTERM', gracefulShutdown); process.on('SIGINT', gracefulShutdown);

ℹ️দ্রষ্টব্য:

HTTP/2 ব্রাউজারগুলিতে HTTPS প্রয়োজন, প্রোটোকলের নিজেই এনক্রিপশন প্রয়োজন হয় না। সমস্ত প্রধান ব্রাউজার TLS (HTTPS) এর উপর শুধুমাত্র HTTP/2 সমর্থন করে।

HTTP এবং HTTPS তুলনা করা

বৈশিষ্ট্য HTTP HTTPS
ডেটা এনক্রিপশন না (সাধারণ পাঠ্য) হ্যাঁ (এনক্রিপ্ট করা)
সার্ভার প্রমাণীকরণ না হ্যাঁ (শংসাপত্রের মাধ্যমে)
ডেটা অখণ্ডতা নিরাপত্তা নেই সুরক্ষিত (সংশোধন সনাক্ত করা হয়েছে)
ডিফল্ট পোর্ট 80 443
কর্মক্ষমতা দ্রুত একটি ওভারভিউ একটি বিট (কিন্তু HTTP/2 এর সাথে উন্নত)
এসইও র‌্যাঙ্কিং কম আরও (Google HTTPS পছন্দ করে)
সিস্টেমটি জটিল সরল আরও জটিল (শংসাপত্রের প্রয়োজন)

সারাংশ এবং সর্বোত্তম অনুশীলন

এই ব্যাপক গাইডে, আমরা নিরাপদ ওয়েব অ্যাপ্লিকেশন তৈরির জন্য Node.js HTTPS মডিউল এবং এর ক্ষমতাগুলি অন্বেষণ করেছি। এখানে মূল পয়েন্ট এবং সর্বোত্তম অনুশীলনের একটি সারসংক্ষেপ রয়েছে:

মূল গ্রহণ

HTTPS অপরিহার্য:আধুনিক ওয়েব ডেভেলপমেন্টের জন্য ডেটা নিরাপত্তা, ব্যবহারকারীর গোপনীয়তা এবং ওয়েব স্ট্যান্ডার্ডের সাথে সম্মতি নিশ্চিত করতে HTTPS প্রয়োজন
শংসাপত্র ব্যবস্থাপনা:সঠিকভাবে উন্নয়নের জন্য স্ব-স্বাক্ষরিত শংসাপত্র বা উত্পাদনের জন্য CA থেকে বিশ্বস্ত শংসাপত্রগুলি পরিচালনা করুন
নিরাপত্তা প্রথম:যথাযথ TLS কনফিগারেশন, সুরক্ষিত শিরোনাম এবং ইনপুট বৈধতা সহ সর্বদা নিরাপত্তার সর্বোত্তম অনুশীলনগুলি প্রয়োগ করুন
কর্মক্ষমতা বিষয়:মাল্টিপ্লেক্সিং, হেডার কম্প্রেশন এবং সার্ভার পুশের মতো বৈশিষ্ট্য সহ উন্নত কর্মক্ষমতার জন্য HTTP/2 ব্যবহার করুন
উত্পাদন প্রস্তুতি:উন্নত নিরাপত্তা, কর্মক্ষমতা এবং নির্ভরযোগ্যতার জন্য উৎপাদনে বিপরীত প্রক্সি (যেমন Nginx) ব্যবহার করুন

নিরাপত্তা চেকলিস্ট

উৎপাদনে আপনার HTTPS-সক্ষম অ্যাপ্লিকেশন প্রসারিত করার আগে, পরীক্ষা করুন:

TLS 1.2 বা উচ্চতর ব্যবহার করুন (1.3 প্রস্তাবিত)।
HSTS সক্ষম করুন (HTTP কঠোর ট্রাফিক নিরাপত্তা)।
নিরাপদ সাইবার স্যুটগুলি ব্যবহার করুন এবং দুর্বলগুলি অক্ষম করুন৷
আপনার Node.js এবং নির্ভরতা আপ টু ডেট রাখুন
সঠিক ত্রুটি হ্যান্ডলিং এবং লগিং বাস্তবায়ন
সুরক্ষিত কুকি পতাকা সেট করুন (নিরাপদ, HttpOnly, SameSite)
কন্টেন্ট প্রোটেকশন পলিসি (CSP) হেডার ব্যবহার করুন
হার সীমিত এবং চাহিদা যাচাই সক্ষম করুন

🔔মনে রাখবেন:

নিরাপত্তা একটি ধারাবাহিক প্রক্রিয়া। আপনার আবেদন নিয়মিত অডিট করুন, নির্ভরতা আপ টু ডেট রাখুন, এবং সর্বশেষ নিরাপত্তা সর্বোত্তম অনুশীলন এবং দুর্বলতা সম্পর্কে অবগত থাকুন।

অনুশীলন করুন

HTTPS এর জন্য ডিফল্ট পোর্ট নম্বর কি?

80
✗ ভুল! 80 হল HTTP এর জন্য ডিফল্ট পোর্ট
8080
✗ ভুল! 8080 হল বিকল্প HTTP পোর্ট
443
✓ ঠিক আছে! 443 হল HTTPS-এর জন্য ডিফল্ট পোর্ট
8443
✗ ভুল! 8443 হল বিকল্প HTTPS পোর্ট