Kubernetes Ingress自签名SSL证书链信任问题求助
以下是针对你遇到的「self-signed certificate in certificate chain」问题的排查和解决步骤:
1. 检查证书链的合并顺序
自签证书链的合并顺序不能乱,必须按服务器证书在前,根CA证书在后的顺序合并(如果有中间CA的话,中间CA放在两者之间)。你可以先导出当前Secret里的证书链检查:
kubectl get secret nginx-tls-secret -o jsonpath='{.data.tls\.crt}' | base64 -d > current-chain.crt cat current-chain.crt
每段证书都以-----BEGIN CERTIFICATE-----开头,-----END CERTIFICATE-----结尾,确认对应acme.com的服务器证书排在最前面,根CA证书在最后。顺序错误的话,重新合并后再更新Secret。
2. 确认TLS Secret的字段正确性
Kubernetes的TLS Secret要求tls.crt必须包含完整的证书链(服务器证书+根CA证书),不能只放服务器证书;tls.key是服务器的私钥。如果之前只传了服务器证书,重新生成Secret:
# 确保full-chain.crt是合并好的服务器证书+根CA证书 kubectl create secret tls nginx-tls-secret --key=server.key --cert=full-chain.crt --dry-run=client -o yaml | kubectl apply -f -
用--dry-run避免直接覆盖,再通过apply更新Secret。
3. 验证Ingress的TLS配置
检查你的Ingress YAML,确保tls段的hosts和secretName完全正确,示例如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: acme-ingress spec: tls: - hosts: - acme.com secretName: nginx-tls-secret rules: - host: acme.com http: paths: - path: / pathType: Prefix backend: service: name: your-target-service port: number: 80
更新Ingress配置后,等待Ingress Controller reload配置生效。
4. 本地信任根CA证书
自签证书由你自己的根CA签发,客户端(比如你的本地机器)默认不会信任这个CA,所以openssl命令会报错。需要把根CA证书添加到本地信任存储:
- Linux:
sudo cp root-ca.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates - macOS:
双击根CA证书文件,在「钥匙串访问」里找到该证书,右键选择「显示简介」,在「信任」栏把「使用此证书时」设为「始终信任」。 - Windows:
双击根CA证书,在弹出的向导里选择「将所有证书放入下列存储」,然后选择「受信任的根证书颁发机构」完成导入。
添加完成后再执行openssl s_client -showcerts -connect acme.com:443,如果配置没问题,就不会再提示证书链错误了。
5. 排查Ingress Controller日志
如果以上步骤都试过还是不行,查看Ingress Controller的日志,查找SSL相关错误:
# 假设Ingress Controller部署在ingress-nginx命名空间 kubectl logs -n ingress-nginx deploy/ingress-nginx-controller
搜索SSL、certificate等关键词,看是否有证书加载失败、链不完整的提示,根据日志进一步定位问题。
内容的提问来源于stack exchange,提问作者lilpaf

