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




