nginx 通过 mtls、证书校验、ip/dns/请求头三重校验及强制 https 等手段构建上游服务间可信通信:启用 proxy_ssl_verify 并配置私有 ca 根证书,结合 map 提取证书 dn 实现细粒度访问控制,辅以内网 ip 限制、可信 dns 解析与响应签名验证,确保全程加密与身份可信。

Nginx 本身不管理集群成员身份,但能作为可信网关,通过证书、网络层和协议控制三重手段,建立上游服务间的信任关系并保障通信加密。关键不是让 Nginx “认证自己”,而是让它严格把关“谁可以连进来”“连出去时是否可信”。
启用双向 TLS(mTLS)验证上游身份
这是最健壮的信任机制:要求每个集群节点(如 API 服务、Minio 实例)在连接 Nginx 时,出示由同一私有 CA 签发的客户端证书。
- 用 OpenSSL 搭建私有 CA,生成
ca.crt(根证书)和ca.key - 为每个节点签发专属证书,例如
node-a.crt+node-a.key,确保 CN 或 SAN 包含唯一标识(如CN=node-a.prod) - 在 upstream 配置中启用强校验:
proxy_ssl_verify on; proxy_ssl_trusted_certificate /etc/nginx/ssl/ca.crt; proxy_ssl_verify_depth 2; proxy_ssl_protocols TLSv1.2 TLSv1.3;
不匹配或过期证书将直接拒绝,返回 502。
基于证书信息做细粒度访问控制
Nginx 可在握手完成后提取证书字段,用于动态鉴权。
- 使用
map指令将证书 DN 映射为允许标记:map $ssl_client_s_dn $allowed_node { "~CN=node-a\.prod" "1"; "~CN=node-b\.prod" "1"; default "0"; } - 在 server 或 location 块中结合判断:
if ($allowed_node = "0") { return 403; }这样即使 IP 或域名被绕过,无有效证书仍无法通行。
补充 IP + DNS + 请求头三重校验(无 mTLS 场景)
当部分节点暂不支持证书时,可分层加固:
- 限制 upstream 只接受来自内网 CIDR 的请求,如
allow 10.10.0.0/16; deny all; - upstream 中使用域名而非 IP,并开启
resolver 10.10.0.1 valid=30s;,配合可信 DNS 防劫持 - 要求上游响应携带签名头(如
X-Cluster-Sign: sha256=xxx),Nginx 用auth_request模块调用本地校验服务验证
强制上游通信全程加密且协议可信
信任的前提是通道本身不可篡改。
- 所有
proxy_pass必须指向https://,禁用http://回源 - 明确限定 TLS 版本:
proxy_ssl_protocols TLSv1.2 TLSv1.3;,彻底关闭 TLSv1.0/1.1 和 SSLv3 - 私钥文件权限必须为
600,CA 证书权限建议644,属主为root
不复杂但容易忽略











