容器中curl挂载主机证书后仍报本地颁发者证书错误的排查
问题分析与解决方法
问题根源
从补充测试输出能直接看出:容器内的curl默认使用的CA证书文件是/cacert.pem,而非主机系统默认的/etc/ssl/certs/ca-certificates.crt。这就是你挂载了主机证书目录却仍出现证书验证失败的核心原因——curlimages/curl镜像在构建时已指定自定义CA证书路径,不会自动读取系统默认路径的证书。
解决方案
方法1:通过环境变量指定CA证书路径
运行容器时设置CURL_CA_BUNDLE环境变量,指向挂载过来的主机CA证书文件:
docker run \ -v /etc/ssl:/etc/ssl \ -v /usr/local/share/ca-certificates:/usr/local/share/ca-certificates \ -v /usr/share/ca-certificates:/usr/share/ca-certificates \ -e CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt \ curlimages/curl -svvo /dev/null https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz
方法2:curl命令显式指定CA证书
直接在curl命令中用--cacert参数指定主机CA证书路径:
docker run \ -v /etc/ssl:/etc/ssl \ -v /usr/local/share/ca-certificates:/usr/local/share/ca-certificates \ -v /usr/share/ca-certificates:/usr/share/ca-certificates \ curlimages/curl --cacert /etc/ssl/certs/ca-certificates.crt -svvo /dev/null https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz
方法3:覆盖容器默认CA证书文件
将主机CA证书挂载到容器默认的/cacert.pem路径,替换镜像自带文件:
docker run \ -v /etc/ssl/certs/ca-certificates.crt:/cacert.pem \ curlimages/curl -svvo /dev/null https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz
以上任意一种方式,都能让容器内的curl使用包含Zscaler根证书的主机CA文件,完成证书验证。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

