You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置SSL证书后OpenSSL检测到Kubernetes Ingress伪造证书问题

解决NGINX Ingress Controller返回伪造证书问题(浏览器访问正常但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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:02:56