Nginx四层mTLS需同时配置ssl_certificate、ssl_client_certificate和ssl_verify_client,启用stream_ssl_module及stream_ssl_preread_module,并在listen中添加ssl标识;仅ssl_certificate无法触发客户端证书校验。

直接用 ssl_certificate 无法在四层 TCP 代理中实现“终端加密 + 客户端证书验证”——它只负责服务端身份认证(即让客户端验证 Nginx),不触发客户端证书校验。要真正启用双向认证(mTLS),必须额外配置 ssl_client_certificate 和 ssl_verify_client,且需启用 stream_ssl_module 和 stream_ssl_preread_module。
核心配置项说明
ssl_certificate 和 ssl_certificate_key:提供 Nginx 自身的服务端证书与私钥,用于向客户端证明身份。客户端连接时会校验该证书是否由可信 CA 签发、域名/IP 是否匹配、是否过期或被吊销。
ssl_client_certificate:指定受信任的根 CA 证书文件(.pem 格式),Nginx 用它来验证客户端提交的证书是否由该 CA 或其子 CA 签发。
ssl_verify_client:控制校验强度,可选值为 off(默认,不校验)、on(强制校验,失败则拒绝连接)、optional(尝试校验,失败仍放行,但可在日志或变量中获取结果)。
必须启用的模块与监听设置
- Nginx 编译时需包含
--with-stream --with-stream_ssl_module --with-stream_ssl_preread_module - 监听语句必须带
ssl标识,例如:listen 8443 ssl; -
ssl_preread on;要开启(尤其在需基于 SNI 路由时),但它本身不参与证书验证,仅用于提取 TLS 握手信息
典型 mTLS 四层代理配置片段
以下为 stream 块内一个完整 server 块示例:
server {
listen 8443 ssl;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_client_certificate /etc/nginx/ssl/ca.pem;
ssl_verify_client on;
<pre class='brush:php;toolbar:false;'># TLS 协议与密码套件建议(生产环境应严格筛选)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_session_cache shared:SSL:10m;
proxy_pass backend_api:8443;}
注意:proxy_pass 指向的是上游服务地址,它可走明文 TCP,也可再配一套 TLS(即重加密)。若上游也要求 mTLS,则还需在 upstream 中配置 proxy_ssl_certificate 和 proxy_ssl_trusted_certificate 等参数。
证书与权限关键点
- 服务端证书(
ssl_certificate)必须包含客户端访问时使用的域名或 IP(写在 SAN 中),否则客户端(如 curl、openssl s_client)会报Certificate verify failed - 客户端证书无需包含域名,只要由
ssl_client_certificate指定的 CA 签发、未过期、未被吊销即可 - 所有证书和密钥文件需确保 Nginx worker 进程有读取权限(如
chmod 600私钥,chown nginx:nginx) - 防火墙需放行对应端口(如 8443),且 SELinux(如启用)需允许网络绑定和证书读取


















