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

K8s Ingress加载TLS证书失败 访问报证书主体名不匹配错误

Kubernetes Ingress自定义TLS证书不生效问题排查与修复

根因判定

从控制器日志可以直接定位核心问题:

  • 存储自定义证书的nginx-ingress-tls Secret未被Ingress控制器正确加载,报错包含两类:一是私钥解析失败、证书与私钥公钥不匹配;二是控制器无法在本地缓存中找到对应命名空间的自定义证书,自动回退使用内置的默认假证书
  • 回退使用的默认假证书SAN(主体备用名)列表中不包含myapp.com域名,因此curl访问时触发主机名不匹配的SSL校验错误,和证书生成阶段填写的FQDN无直接关联

常见触发该问题的原因包括:创建Secret时证书与私钥字段填反、私钥设置了加密口令未移除、复制证书/私钥内容时遗漏首尾标记行或多输入冗余字符、Secret类型不是标准的kubernetes.io/tls、Secret部署的命名空间和Ingress资源所在命名空间不匹配。

排查与修复步骤

  • 第一步:校验本地证书与私钥的匹配性
    分别计算证书和私钥的公钥哈希,两个命令返回的哈希值完全一致才代表匹配:
    openssl x509 -noout -modulus -in cert.pem | openssl md5
    openssl rsa -noout -modulus -in key.pem | openssl md5
    
    如果哈希值不一致,直接重新生成证书即可,推荐使用带SAN扩展的生成命令,同时通过-nodes参数取消私钥的口令加密,避免控制器解析失败:
    openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365 -nodes -subj "/CN=myapp.com" -addext "subjectAltName=DNS:myapp.com"
    
  • 第二步:校验集群内Secret配置
    首先确认Secret存在于Ingress所在的default命名空间,且类型为标准TLS Secret:
    kubectl get secret nginx-ingress-tls -n default
    
    如果返回资源不存在、类型不符,直接删除异常Secret即可。如果Secret存在,进一步校验其中存储的tls.crt、tls.key字段内容和本地文件完全一致,无首尾行缺失、冗余空格/字符问题。
  • 第三步:重建标准TLS Secret
    最稳妥的创建方式是直接通过kubectl读取本地证书文件生成,完全避免手动编辑YAML带来的内容错误:
    kubectl delete secret nginx-ingress-tls -n default --ignore-not-found
    kubectl create secret tls nginx-ingress-tls --cert=cert.pem --key=key.pem -n default
    
  • 第四步:验证生效状态
    等待30-60秒待Ingress控制器完成配置同步后,查看控制器日志,确认不存在证书加载失败、回退假证书的报错。再执行访问验证:
    curl -I -k https://myapp.com
    
    加-k参数是因为自签名证书本身不在系统默认信任列表中,该参数会跳过证书信任链校验,只要返回后端服务的HTTP响应头、不再报主机名不匹配的SSL错误,即代表自定义TLS证书已正常生效。如果需要完全移除SSL校验告警,将本地生成的cert.pem加入系统信任根证书库即可。

内容的提问来源于stack exchange,提问作者Timothy Pulliam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:54:19