配置SSL证书后OpenSSL检测到Kubernetes Ingress伪造证书问题
openssl命令异常) 我来帮你排查这个问题——浏览器能正常加载正确的SSL证书,但openssl s_client命令返回伪造证书,这种情况通常是Ingress Controller的配置匹配或证书加载环节出了问题,结合你提供的Ingress配置和日志,我们一步步来解决:
1. 先抓核心问题线索
从日志里的这条提示能找到关键突破口:
W1029 22:02:36.476751 6 main.go:125] No IngressClass resource with name nginx found. Only annotation will be used.
虽然日志说明空class的Ingress会被处理,但如果Ingress Controller是基于IngressClass来匹配资源的,你的Ingress没有明确指定ingressClassName,可能导致Controller没有正确关联你的TLS配置,最终 fallback到默认的伪造证书。
2. 第一步:补全Ingress的ingressClassName配置
修改你的Ingress YAML,添加ingressClassName字段,明确指定要使用的Ingress Controller类:
annotations: nginx.ingress.kubernetes.io/ssl-redirect: 'true' nginx.ingress.kubernetes.io/from-to-www-redirect: 'true' name: nginx-echo spec: ingressClassName: nginx # 新增这一行,明确关联Ingress Controller tls: - hosts: - domain.com secretName: domain.com rules: - host: domain.com http: paths: - path: / pathType: Prefix backend: service: name: website-lorem port: number: 80
然后应用更新:
kubectl apply -f your-ingress-file.yaml
3. 第二步:验证TLS Secret的有效性
确认domain.com这个Secret确实包含正确的证书和私钥:
- 查看Secret的内容:
kubectl get secret domain.com -o yaml
- 解码并检查证书内容(确保包含你的域名,且证书链完整):
# 解码证书到本地文件 echo $(kubectl get secret domain.com -o jsonpath='{.data.tls\.crt}') | base64 -d > domain.crt # 查看证书核心信息 openssl x509 -in domain.crt -noout -subject -issuer -ext subjectAltName
- 同样验证私钥的有效性:
echo $(kubectl get secret domain.com -o jsonpath='{.data.tls\.key}') | base64 -d > domain.key openssl rsa -in domain.key -check
如果证书或私钥无效,Controller会无法加载,转而使用伪造证书。
4. 第三步:强制Ingress Controller重载配置
有时候配置更新后Controller没有自动触发重载,手动触发一下更稳妥:
- 进入Controller Pod发送重载信号:
# 替换成你的Controller Pod名称和命名空间 kubectl exec -it <nginx-ingress-controller-pod-name> -n <ingress-namespace> -- /usr/sbin/nginx -s reload
- 或者直接重启Pod(更彻底的方式):
kubectl delete pod <nginx-ingress-controller-pod-name> -n <ingress-namespace>
5. 第四步:重新测试openssl命令
一定要加上-servername参数(SNI必须显式指定,浏览器会自动处理但openssl不会):
openssl s_client -connect domain.com:443 -servername domain.com | openssl x509 -noout -subject -issuer
额外注意点
日志里的SSL certificate chain completion is disabled提示:如果你的证书缺少中间证书,浏览器可能会自动补全,但openssl会报错,不过这不是返回伪造证书的原因,只是后续可能需要优化的点——确保你的tls.crt包含完整的证书链(域名证书 + 所有中间证书)。
内容的提问来源于stack exchange,提问作者user8462556

