更新Kubernetes SSL证书后集群内Python应用请求报SSLError问题求助
问题根因与排查修复方案
该问题的核心差异是:浏览器内置的根证书库覆盖了新证书的完整信任链,而集群内Python应用运行环境的根证书信任链不完整,导致证书校验失败。
排查步骤与修复方案
1. 验证TLS Secret的证书链完整性
绝大多数此类问题都是导出证书时仅导出了叶子域名证书,未拼接中间CA、根CA证书导致。Python的
requests库默认要求校验完整信任链,缺失中间CA就会触发对应报错。
验证命令:kubectl get secret <替换为你的TLS Secret名称> -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl verify -verbose -CApath /etc/ssl/certs -如果输出不为
OK,说明证书链不全。
修复方式:将叶子证书、中间CA证书、根CA证书按顺序拼接成完整的crt文件(叶子证书放在最上方,根证书放在最下方),重新更新TLS Secret即可。2. 校验Pod运行环境的根证书库是否包含对应CA
如果新证书是自签名CA、小众CA签发,基础镜像的默认根证书列表不会收录该CA,也会触发校验失败。
验证命令(进入出问题的Python Pod内执行):openssl s_client -connect <替换为你请求的服务域名>:443 -CApath /etc/ssl/certs如果返回
Verify return code: 20 (unable to get local issuer certificate),说明Pod内根证书库缺失对应CA。
修复方式三选一:- 构建镜像时把新CA证书加入镜像根证书列表:Debian/Ubuntu系镜像将CA文件放到
/usr/local/share/ca-certificates/目录后执行update-ca-certificates;Alpine系镜像执行apk add --no-cache ca-certificates && update-ca-certificates - 业务代码显式指定CA路径:将CA证书通过ConfigMap/Secret挂载到Pod内,
requests请求时添加参数verify="/挂载的CA证书路径" - 测试环境临时关闭校验(生产环境不推荐):请求添加参数
verify=False,同时可执行urllib3.disable_warnings()关闭告警。
- 构建镜像时把新CA证书加入镜像根证书列表:Debian/Ubuntu系镜像将CA文件放到
3. 确认请求域名与证书SAN匹配
检查新证书的Subject Alternative Name字段是否包含Pod请求的域名,泛域名证书要注意匹配规则是否覆盖请求域名。
检查命令:kubectl get secret <替换为你的TLS Secret名称> -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -text | grep -A 10 "Subject Alternative Name"如果域名不在列表中,需要重新签发符合域名要求的证书。
内容的提问来源于stack exchange,提问作者Aghil Varghese
相关产品推荐
相关产品推荐

