K8s Ingress加载TLS证书失败 访问报证书主体名不匹配错误
Kubernetes Ingress自定义TLS证书不生效问题排查与修复
根因判定
从控制器日志可以直接定位核心问题:
- 存储自定义证书的
nginx-ingress-tlsSecret未被Ingress控制器正确加载,报错包含两类:一是私钥解析失败、证书与私钥公钥不匹配;二是控制器无法在本地缓存中找到对应命名空间的自定义证书,自动回退使用内置的默认假证书 - 回退使用的默认假证书SAN(主体备用名)列表中不包含
myapp.com域名,因此curl访问时触发主机名不匹配的SSL校验错误,和证书生成阶段填写的FQDN无直接关联
常见触发该问题的原因包括:创建Secret时证书与私钥字段填反、私钥设置了加密口令未移除、复制证书/私钥内容时遗漏首尾标记行或多输入冗余字符、Secret类型不是标准的kubernetes.io/tls、Secret部署的命名空间和Ingress资源所在命名空间不匹配。
排查与修复步骤
- 第一步:校验本地证书与私钥的匹配性
分别计算证书和私钥的公钥哈希,两个命令返回的哈希值完全一致才代表匹配:
如果哈希值不一致,直接重新生成证书即可,推荐使用带SAN扩展的生成命令,同时通过openssl x509 -noout -modulus -in cert.pem | openssl md5 openssl rsa -noout -modulus -in key.pem | openssl md5-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:
如果返回资源不存在、类型不符,直接删除异常Secret即可。如果Secret存在,进一步校验其中存储的kubectl get secret nginx-ingress-tls -n defaulttls.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
相关产品推荐
相关产品推荐

