~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 است. این ماژول امکان ایجاد ارتباطات رمزنگاریشده،
نوشته و پژوهش شده توسط دکتر شاهین صیامی