云原生中nginx与service mesh协同需明确tls终止点:仅nginx终止时须提供完整证书链;透传时由istio gateway配置servercertificate与cacertificates并确保链完整;双层终止易因信任库不一致、sni错配或证书链缺失导致“不安全”报错。

云原生环境中,Nginx 作为边缘 Ingress 网关,Istio(或其他 Service Mesh)作为服务间通信网关,两者叠加时若都启用 TLS 终止或透传,极易出现证书链校验冲突——浏览器报“不安全”,日志里却显示 Nginx 和 Istio 都“自认为配置正确”。问题核心不是证书本身错,而是两层网关对证书链的处理逻辑重叠、职责不清。
确认 TLS 终止点在哪一层
先明确:谁在做 TLS 解密?谁在做证书验证?这是排查起点。
- 仅 Nginx 终止 HTTPS:客户端 → Nginx(解密)→ 明文 → Istio Sidecar → 后端服务。此时 Nginx 必须提供完整证书链(域名证书 + 中间证书),Istio 不参与证书校验,只管 mTLS 或 plain HTTP 流量。
- Nginx 透传 TLS(passthrough):客户端 → Nginx(不解密,只转发 TCP)→ Istio Ingress Gateway → 后端服务。此时 Nginx 不需要 ssl_certificate,而 Istio 的 Gateway 资源必须配置正确的 serverCertificate + privateKey + caCertificates,并确保其证书链完整且顺序正确。
- 双层终止(错误常见):Nginx 解密后再用 HTTPS 转发给 Istio Ingress Gateway。这时 Nginx 是客户端角色,需用 proxy_ssl_trusted_certificate 校验 Istio 端证书;而 Istio 又要校验上游(即 Nginx)是否可信——若双方信任库不一致、中间证书缺失或 SNI 错配,就会链式失败。
逐层验证证书链是否真正送达
不能只看 Nginx 配置文件,要抓取每层网关实际发出/接收的证书内容。
- 查 Nginx 对外输出链:
openssl s_client -connect your-domain.com:443 -showcerts。正常应看到两段:第一段 CN=your-domain.com,第二段 CN=中间 CA。若只有一段,说明 Nginx 没加载 fullchain.pem,或被 CDN 缓存干扰。 - 查 Istio Ingress Gateway 接收链(如它监听 443):
openssl s_client -connect istio-gw.your-ns.svc.cluster.local:443 -servername your-domain.com -showcerts。注意加 -servername 模拟 SNI。输出中证书块顺序必须是终端→中间,且不能含根证书。 - 若使用 Nginx 代理到 Istio(HTTPS upstream),则在 Nginx 服务器上运行:
openssl s_client -connect istio-gw-ip:443 -servername your-domain.com -showcerts,确认它收到的是完整链——否则 proxy_ssl_verify 会直接失败并报 502。
检查 SNI 和 Host 头是否贯穿始终
双层网关下,SNI 和 Host 头一旦失真,证书匹配就全盘失效。
- Nginx 到 Istio 的 upstream 若写成 IP(如
proxy_pass https://10.0.1.5),默认不发 SNI,Istio 只能返回默认证书。必须配:proxy_ssl_server_name on;<br>proxy_ssl_name $host;
- 若前端有 CDN(如 Cloudflare),$host 可能已被改写为回源域名。此时应改用
proxy_ssl_name $http_x_forwarded_host;,并确保 CDN 开启了 X-Forwarded-Host 透传。 - Istio Gateway 的
hosts字段必须与 $host / $http_x_forwarded_host 完全一致(包括 www.、大小写、通配符格式),否则匹配失败,回落到 default certificate。
避免信任库交叉污染
proxy_ssl_trusted_certificate(Nginx 用)和 caCertificates(Istio 用)是两套独立信任体系,不可混用。
- Nginx 的
proxy_ssl_trusted_certificate文件只能含根证书和中间证书(PEM 格式),不能含域名证书或私钥;它用于验证后端(Istio)证书是否由可信 CA 签发。 - Istio 的
caCertificates字段(在 Gateway 或 DestinationRule 中)是供客户端(Nginx)验证 Istio 证书用的,内容应与 Nginx 的 trusted_certificate 一致,但部署位置不同——一个在 Nginx 服务器上,一个在 Istio 控制平面下发的 Secret 里。 - 常见错误:把 Let’s Encrypt 的 fullchain.pem 当作 trusted_certificate 用——它含终端证书,会导致校验失败;应单独提取中间证书(R3/E1)和根证书(ISRG Root X1)拼成专用 CA bundle。











