راهنمای جامع TLS/SSL در Node.js

ماژول node:tls پیاده‌سازی پروتکل‌های TLS و SSL را در Node.js فراهم می‌کند. این ماژول بر پایهٔ OpenSSL ساخته شده و امکان ایجاد ارتباطات رمزنگاری‌شده، مدیریت گواهی‌ها، احراز هویت، امنیت پیشرفته، و ویژگی‌هایی مانند ALPN، SNI، PSK، Session Resumption و کنترل Cipher Suite را ارائه می‌دهد. این ماژول برای ساخت سرورهای HTTPS، سرویس‌های امن TCP، و هر نوع ارتباط رمزنگاری‌شده ضروری است.

TLS / SSLOpenSSLCertificates & Private KeysPerfect Forward SecrecyALPN / SNIPSK (Pre‑Shared Keys)Session Resumption

~3 دقیقه مطالعه • بروزرسانی ۹ دی ۱۴۰۴

1. معرفی ماژول TLS


ماژول node:tls امکان ایجاد ارتباطات رمزنگاری‌شده را فراهم می‌کند. این ماژول مشابه مرورگرها از TLS استفاده می‌کند اما پیاده‌سازی آن بر پایهٔ OpenSSL است.


2. بررسی پشتیبانی از crypto


اگر Node.js بدون پشتیبانی از node:crypto ساخته شده باشد، استفاده از node:tls باعث خطا می‌شود. در CommonJS می‌توان با try/catch آن را مدیریت کرد.


3. مفاهیم پایه TLS/SSL


  • TLS/SSL بر پایهٔ PKI کار می‌کند.
  • هر سرور باید یک کلید خصوصی داشته باشد.
  • گواهی‌ها (Certificates) از طریق CA یا به‌صورت Self-Signed تولید می‌شوند.
  • برای ساخت گواهی از OpenSSL استفاده می‌شود (کلید، CSR، گواهی، PFX).

4. Perfect Forward Secrecy


ویژگی‌ای که باعث می‌شود حتی با افشای کلید خصوصی سرور، ارتباطات قبلی قابل رمزگشایی نباشند.


  • ECDHE: فعال به‌صورت پیش‌فرض.
  • DHE: غیرفعال به‌صورت پیش‌فرض، قابل فعال‌سازی.
  • در TLS 1.3 همیشه فعال است.

5. ALPN و SNI


  • ALPN: انتخاب پروتکل (HTTP/1.1، HTTP/2) در TLS handshake.
  • SNI: امکان استفاده از چند گواهی برای چند دامنه روی یک سرور.

6. Pre-Shared Keys (PSK)


روش احراز هویت بدون گواهی، مبتنی بر کلید از پیش‌اشتراک‌گذاری‌شده.


  • غیرفعال به‌صورت پیش‌فرض.
  • نیازمند pskCallback در کلاینت و سرور.
  • برای محیط‌هایی مناسب است که کلید امن قابل توزیع باشد.

7. جلوگیری از حمله Renegotiation


Node.js تعداد renegotiation را محدود می‌کند تا از حملات DoS جلوگیری شود.


  • tls.CLIENT_RENEG_LIMIT: پیش‌فرض ۳ بار.
  • tls.CLIENT_RENEG_WINDOW: پیش‌فرض ۱۰ دقیقه.

8. Session Resumption


برای افزایش سرعت handshake، TLS می‌تواند از Sessionهای قبلی استفاده کند.


8.1 Session Identifiers


  • کلاینت و سرور Session ID ذخیره می‌کنند.
  • سرور باید رویدادهای newSession و resumeSession را مدیریت کند.

8.2 Session Tickets


  • سرور Session را رمز کرده و به کلاینت می‌دهد.
  • نیاز به ذخیره‌سازی سمت سرور ندارد.
  • در TLS 1.3 ممکن است چندین Ticket ارسال شود.

9. مدیریت Cipher Suite


Node.js مجموعه‌ای از Cipherهای امن را به‌صورت پیش‌فرض فعال دارد.


  • قابل مشاهده با: crypto.constants.defaultCoreCipherList
  • قابل تغییر با: --tls-cipher-list
  • یا تنظیم tls.DEFAULT_CIPHERS قبل از ایجاد سرور.

10. سطوح امنیتی OpenSSL


OpenSSL دارای سطوح امنیتی ۰ تا ۵ است. سطح پیش‌فرض ۲ است.


برای فعال‌سازی ویژگی‌های قدیمی (مثل TLSv1) باید سطح امنیتی را کاهش داد:


ciphers: 'DEFAULT@SECLEVEL=0'

11. خطاهای گواهی X509


در صورت بروز خطا در گواهی، OpenSSL کدهای خطا مانند موارد زیر ارائه می‌دهد:


  • UNABLE_TO_VERIFY_LEAF_SIGNATURE
  • CERT_HAS_EXPIRED
  • SELF_SIGNED_CERT_IN_CHAIN
  • HOSTNAME_MISMATCH

12. کلاس tls.Server


سرور TLS از net.Server ارث‌بری می‌کند و رویدادهای زیر را ارائه می‌دهد:


12.1 رویدادهای مهم


  • connection: قبل از handshake.
  • secureConnection: بعد از handshake.
  • newSession: ایجاد Session جدید.
  • resumeSession: تلاش برای بازیابی Session.
  • OCSPRequest: درخواست وضعیت گواهی.
  • keylog: ثبت کلیدهای TLS برای دیباگ.
  • tlsClientError: خطا قبل از handshake.

12.2 متدهای مهم


  • server.addContext(): افزودن گواهی برای SNI.
  • server.setSecureContext(): تغییر گواهی در زمان اجرا.
  • server.getTicketKeys(): دریافت کلیدهای Session Ticket.
  • server.listen(): شروع سرور.
  • server.close(): توقف سرور.

نتیجه‌گیری


ماژول node:tls یکی از مهم‌ترین بخش‌های امنیتی Node.js است. این ماژول امکان ایجاد ارتباطات رمزنگاری‌شده،

نوشته و پژوهش شده توسط دکتر شاهین صیامی