You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kubernetes Nginx-Ingress TLS证书配置异常问题咨询

当然可以让Nginx用上你配置的正确证书!咱们先搞清楚问题出在哪,再一步步解决。

问题根源:SNI 未正确发送

你现在用curl https://{k8s节点IP}:30200/...直接访问节点IP+NodePort,这里有个关键细节:SSL握手阶段的SNI(服务器名称指示)没传对

Nginx Ingress Controller是靠SNI来匹配对应TLS证书的——虽然你加了Host头,但这个头是HTTP层的信息,而证书选择是在SSL握手(HTTP之前的阶段)就完成的。当curl访问IP地址时,默认不会发送SNI,Nginx找不到匹配的证书配置,就会 fallback到自带的伪造证书。

解决方案

这里给你三个可行的方案,按需选择:

1. 让curl发送正确的SNI(快速验证用)

修改curl命令,用--resolve参数把域名映射到节点IP,这样curl会在SSL握手时带上SNI,同时HTTP请求的Host头也能正确匹配:

curl https://fake.example.com:30200/myapp/ping --resolve fake.example.com:30200:{k8s节点IP} -k --verbose

执行这个命令后,你应该就能看到返回的是你自己的CA证书了。

2. 把自定义证书设为Ingress Controller的默认证书(全局配置)

如果你希望所有未匹配SNI的请求都用你的证书,可以通过Helm修改nginx-ingress的配置,把默认TLS证书指定为你的test-secret

helm upgrade nginx-ingress ingress-nginx/ingress-nginx \
  --set controller.defaultTLS.secret=default/test-secret

这个方案适合需要统一默认证书的场景,但要注意会覆盖所有未配置TLS的Ingress的默认证书。

3. 通过域名正常访问(生产环境推荐)

既然你已经把fake.example.com的A记录指向了负载均衡器IP,那直接用域名访问才是标准用法:

curl https://fake.example.com/myapp/ping -k --verbose

负载均衡器会把流量转发到Kubernetes集群的Ingress Controller,Nginx会根据域名(SNI+Host头)自动匹配到你配置的test-secret证书,这也是生产环境最稳妥的方式。

验证

不管用哪个方案,执行命令后看verbose输出里的证书信息,应该能看到是你自己的CA证书,而不是Ingress Controller的默认伪造证书。

内容的提问来源于stack exchange,提问作者Essa Ennab

火山引擎 最新活动