Kubernetes部署中Laravel调用Google Maps API遇SSL证书验证失败问题
解决Kubernetes上Laravel调用Google地理编码API的SSL证书验证失败问题
确认容器内的CA证书路径与配置
不要仅在宿主机添加Google根CA证书,需确保证书被添加到容器内部的信任存储中。不同PHP镜像的默认信任路径有差异:- Debian/Ubuntu系镜像:通常指向
/etc/ssl/certs/ca-certificates.crt,可将证书复制到/usr/local/share/ca-certificates/后执行update-ca-certificates更新信任链 - RHEL/CentOS系镜像:通常指向
/etc/pki/tls/certs/ca-bundle.crt,可将证书内容追加到该文件中
验证容器内证书是否生效:执行openssl s_client -connect maps.google.com:443 -CAfile /path/to/your-ca-file,若返回Verify return code: 0 (ok)则配置正确
- Debian/Ubuntu系镜像:通常指向
检查PHP/Laravel的证书配置
PHP的curl或Guzzle客户端可能单独指定证书路径,需同步配置:- 编辑php.ini,设置
curl.cainfo = "/path/to/ca-certificates.crt"和openssl.cafile = "/path/to/ca-certificates.crt" - 若使用Laravel HTTP客户端,可在请求时指定证书路径,或在
config/services.php中全局配置:'guzzle' => [ 'verify' => '/etc/ssl/certs/ca-certificates.crt', ],
- 编辑php.ini,设置
排查Kubernetes网络层拦截
如果集群使用代理、Istio等Sidecar组件,可能会拦截SSL请求并替换证书:- 若存在代理,需将代理的CA证书也加入容器信任存储
- 若使用Istio,需配置
DestinationRule允许maps.google.com的SSL直通,避免Sidecar重加密
验证证书链完整性
部分场景下仅添加根CA不够,需确保完整的证书链(根CA+中间CA):
在容器内执行openssl s_client -connect maps.google.com:443,查看输出的Certificate chain部分,确认所有中间证书都已包含在信任存储中。若缺失,需下载对应中间CA证书并添加确保镜像一致性
本地Docker运行正常但K8s异常,可能是K8s使用的镜像未包含证书配置:
修改Dockerfile,将证书打包进镜像:# 假设证书文件为google_ca.crt COPY google_ca.crt /usr/local/share/ca-certificates/ RUN update-ca-certificates重新构建镜像并推送到仓库,更新K8s部署的镜像版本
内容的提问来源于stack exchange,提问作者user2881726
相关产品推荐
相关产品推荐

