构建安全高效的邮件网关ngx_mail_ssl_module
一、快速上手:最小配置示例
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
都能胜任大规模邮件网关的核心角色。赶快动手体验吧!