一、快速上手:最小配置示例
worker_processes auto;mail {server {# 監聽 IMAP over TLSlisten 993 ssl;protocol imap;# TLS 協議與密碼套件ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;# 證書與私鑰ssl_certificate /etc/nginx/ssl/mail.crt;ssl_certificate_key /etc/nginx/ssl/mail.key;# 會話緩存:共享 10MB,禁用內建ssl_session_cache shared:mail_ssl:10m;ssl_session_timeout 10m;# 可選:client 證書驗證ssl_verify_client optional;ssl_trusted_certificate /etc/nginx/ssl/ca.pem;ssl_verify_depth 2;# 支持 STARTTLS(SMTP/IMAP/POP3)starttls on;}
}
要點:
- 用
listen … ssl
取代過時的ssl on
;- 開啟 TLS1.2+1.3,禁用舊版協議;
- 啟用 共享會話緩存,避免重復握手;
- 必要時做 客戶端證書驗證 和 CRL/OCSP 校驗。
二、核心指令全覽
指令 | 作用說明 | |||
---|---|---|---|---|
ssl_certificate | 主機證書文件(PEM),可多次指定 RSA/ECDSA | |||
ssl_certificate_key | 私鑰文件(PEM 或 engine:…),支持 data: 從變量加載 | |||
ssl_ciphers | OpenSSL 密碼套件列表 | |||
ssl_protocols | 啟用 TLS 協議版本(建議 TLSv1.2 TLSv1.3 ) | |||
ssl_session_cache | 緩存類型:none 、builtin:size 、shared:name:size ,推薦僅用 shared | |||
ssl_session_timeout | 會話票據有效期(默認 5 分鐘,可延長至 10–30 分鐘) | |||
ssl_session_tickets | 啟用/禁用 TLS Session Ticket | |||
ssl_session_ticket_key | 會話票據加密密鑰,用于多節點共享 | |||
ssl_ecdh_curve | ECDHE 曲線列表(auto 或 prime256v1:secp384r1 ) | |||
ssl_dhparam | DHE 參數文件(啟用 DHE 密碼套件時必設) | |||
ssl_prefer_server_ciphers | 優先服務器密碼套件排序 | |||
ssl_client_certificate | 客戶端 CA 列表(用于雙向認證) | |||
ssl_trusted_certificate | 僅用于驗證,不發送給客戶端 | |||
ssl_crl | 客戶端證書吊銷列表(CRL) | |||
ssl_verify_client | 客戶端證書驗證模式:`off | on | optional | optional_no_ca` |
ssl_verify_depth | 證書鏈最大驗證深度 | |||
ssl_conf_command | 直通 OpenSSL 配置命令(Options … 、Ciphersuites … ) | |||
ssl_password_file | 私鑰解密口令文件(支持管道),可按 server 復寫 | |||
starttls | 啟用 SMTP/IMAP/POP3 明文連接升級 TLS:`off | on | only` |
三、生產級調優與最佳實踐
-
多證書加載
ssl_certificate example.rsa.crt; ssl_certificate_key example.rsa.key; ssl_certificate example.ecdsa.crt; ssl_certificate_key example.ecdsa.key;
- ECDSA 性能優越;多證書保障兼容性。
-
會話票據與緩存
ssl_session_cache shared:mail_ssl:20m; ssl_session_tickets on; ssl_session_ticket_key /etc/nginx/ssl/ticket.key; ssl_session_timeout 30m;
shared:20m
≈ 80k 個會話;- 統一
ticket.key
實現多實例水平擴展。
-
Cipher 與性能
- 推薦:
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
; - 禁用 RC4、3DES、NULL、SHA1;
- 如需兼容舊客戶端再額外加
ECDHE-RSA-AES128-GCM-SHA256
。
- 推薦:
-
客戶端證書校驗
ssl_verify_client optional; # 或 on ssl_client_certificate /etc/nginx/ssl/ca.pem; ssl_crl /etc/nginx/ssl/crl.pem; ssl_verify_depth 3;
optional
下既可雙向,又可無證書登錄;- 啟用 CRL 阻止已吊銷證書。
-
DH 參數與曲線
ssl_dhparam /etc/nginx/ssl/dhparam.pem; ssl_ecdh_curve prime256v1:secp384r1;
openssl dhparam -out dhparam.pem 2048
;- 確保 DHE 安全,兼顧性能。
-
STARTTLS 控制
# 只允許 TLS 握手前升級,禁止明文登錄 starttls only;
on
:支持明文后升級;only
:強制必須先 STARTTLS 才繼續協議。
四、日志與監控
- TLS 握手失敗:
error_log
中可見SSL_do_handshake
、ssl_renegotiate
等錯誤。 - 會話緩存命中率:通過 Nginx
status
或外部監控指標查看ssl_session_lookup
vsssl_session_reuse
。 - 握手延遲:可在日志中記錄
$ssl_handshake_time
(1.21.4+)輔助分析。
五、總結
ngx_mail_ssl_module
將 Nginx 打造成功能完備的郵件 TLS 終端,兼備:
- 多協議 & 多實例:IMAP/POP3/SMTP 一網打盡;
- 性能與安全兼顧:現代密碼套件、會話復用、曲線優化;
- 靈活的雙向認證:可選或強制客戶端證書;
- 運維友好:日志、狀態、在線熱升級均可無縫集成。
在“零中斷升級”、多節點水平擴展,以及滿足 PCI/DKIM/DMARC 等合規要求時,Nginx 和 ngx_mail_ssl_module
都能勝任大規模郵件網關的核心角色。趕快動手體驗吧!