核心是将TLS行为上收至网关层统一管控:通过ConfigMap或Helm配置ssl_protocols、ssl_ciphers、hsts等参数,指定default-ssl-certificate实现证书集中管理,并用return 308和add_header Strict-Transport-Security确保强制HTTPS与HSTS闭环。

在容器化网关中统一部署 Nginx TLS 策略,核心是把 TLS 行为从应用层“上收”到网关层,避免每个服务重复配置证书、重定向或加密参数。关键不在于给每个容器配证书,而是在入口网关(如 Nginx 容器)集中管控 TLS 终止、协议版本、密码套件和安全头。
用 ConfigMap 或环境变量驱动全局 TLS 配置
当 Nginx 以容器方式运行(如 nginx:alpine 或 ingress-nginx/controller),应通过外部配置源注入 TLS 策略,而非硬编码进镜像:
- 使用 Kubernetes ConfigMap 挂载为
/etc/nginx/nginx.conf或覆盖http块中的 ssl_* 指令(如ssl_protocols TLSv1.2 TLSv1.3、ssl_ciphers) - 若用 Helm 部署 ingress-nginx,可通过
controller.config字段直接传入键值对,例如:ssl-protocols: "TLSv1.2 TLSv1.3"、hsts: "true" - 避免在容器启动命令里拼接
nginx -g参数来覆盖 TLS 设置——这难以审计且不可复现
统一证书管理:默认证书 + 动态加载机制
多个域名共用一套 TLS 策略时,证书不应分散在各 Ingress 或 location 中:
- 在 ingress-nginx 中,通过
default-ssl-certificate参数指定一个 Secret(如kube-system/default-tls-secret),所有未显式声明tls[].secretName的 HTTPS Ingress 自动使用它 - 若用裸 Nginx 容器作网关,可将证书文件挂载为 ConfigMap/Secret,并在 server 块中统一引用:
ssl_certificate /etc/nginx/certs/tls.crt; ssl_certificate_key /etc/nginx/certs/tls.key; - 支持 ACME 自动续期的场景,推荐启用 NGINX 原生
ngx_http_acme_module(2025 年起官方支持),让容器内 Nginx 直接响应/.well-known/acme-challenge/,无需额外 sidecar 或 Cron
强制 HTTPS 与 HSTS 必须在网关层闭环
HTTP → HTTPS 跳转和 HSTS 头不能依赖后端服务实现,否则存在明文传输窗口:
- 在 HTTP server 块中写
return 308 https://$host$request_uri;(308 保留原始 method 和 body,比 301 更严谨) - HSTS 通过
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;设置,always确保连 308 响应也带上该头 - 禁用 TLS 1.0/1.1 必须在
ssl_protocols显式声明,仅靠后端服务禁用无效——握手发生在 Nginx 层
Sidecar 模式下 TLS 策略的轻量落地
若因架构限制无法替换入口网关,可用 Nginx sidecar 实现最小化 TLS 统一:
- 为每个应用 Pod 注入一个 Nginx sidecar,监听 443,终止 TLS 后以 localhost:8080 转发给主容器
- 所有 sidecar 共享同一 ConfigMap,包含统一的
ssl_protocols、ssl_ciphers和证书 Secret 挂载路径 - 注意:sidecar 不适合大规模 TLS 终止(资源开销高),更适合灰度迁移或遗留系统加固


















