将 Docker 与 Zscaler 结合使用
在许多企业环境中,网络流量会通过 HTTPS 代理(如 Zscaler)进行拦截和监控。虽然 Zscaler 确保了安全合规性和网络控制,但它可能会给使用 Docker 的开发人员带来问题,尤其是在构建过程中,可能会出现 SSL 证书验证错误。本指南概述了如何配置 Docker 容器和构建,以正确处理 Zscaler 的自定义证书,确保在受监控的环境中顺利运行。
证书在 Docker 中的作用
当 Docker 构建或运行容器时,它通常需要从互联网获取资源——无论是从注册中心拉取基础镜像、下载依赖项,还是与外部服务通信。在代理环境中,Zscaler 会拦截 HTTPS 流量,并用自己的证书替换远程服务器的证书。然而,Docker 默认不信任这个 Zscaler 证书,这会导致 SSL 错误。
x509: certificate signed by unknown authority发生这些错误是因为 Docker 无法验证 Zscaler 提供的证书的有效性。为了避免这种情况,你必须配置 Docker 以信任 Zscaler 的证书。
为 Docker Desktop 配置 Zscaler 代理
根据 Zscaler 的部署方式,你可能需要手动配置 Docker Desktop 代理设置以使用 Zscaler 代理。
如果你通过 Zscaler 客户端连接器 将 Zscaler 作为系统级代理使用,设备上的所有流量都会自动通过 Zscaler 路由,因此 Docker Desktop 会自动使用 Zscaler 代理,无需额外配置。
如果你不使用 Zscaler 作为系统级代理,请在 Docker Desktop 中手动配置代理设置。你可以使用设置管理为组织中的所有客户端设置代理设置,或者在 Docker Desktop GUI 的 设置 > 资源 > 代理下编辑代理配置。
在 Docker 镜像中安装根证书
要使容器能够使用并信任 Zscaler 代理,请将证书嵌入到镜像中并配置镜像的信任存储。在镜像构建时安装证书是首选方法,因为它无需在启动时进行配置,并提供了一个可审计、一致的环境。
获取根证书
获取根证书最简单的方法是从管理员已经安装了该证书的机器上导出。你可以使用网页浏览器或系统的证书管理服务(例如,Windows 证书存储)。
示例:使用 Google Chrome 导出证书
- 在 Google Chrome 中,导航到
chrome://certificate-manager/。 - 在本地证书下,选择查看导入的证书。
- 找到 Zscaler 根证书,通常标记为 Zscaler Root CA。
- 打开证书详情并选择导出。
- 以 ASCII PEM 格式保存证书。
- 在文本编辑器中打开导出的文件,确认它包含
-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----。
获取证书后,请将其存储在可访问的仓库中,例如 JFrog Artifactory 或 Git 仓库。或者,也可以使用通用存储,如 AWS S3。
使用证书进行构建
要在构建镜像时安装这些证书,请将证书复制到构建容器中并更新信任存储。一个示例 Dockerfile 如下:
FROM debian:bookworm
COPY zscaler-root-ca.crt /usr/local/share/ca-certificates/zscaler-root-ca.crt
RUN apt-get update && \
apt-get install -y ca-certificates && \
update-ca-certificates在这里,zscaler-root-ca.crt 是根证书,位于构建上下文的根目录(通常在应用程序的 Git 仓库内)。
如果你使用制品仓库,可以直接使用 ADD 指令获取证书。你还可以使用 --checksum 标志来验证证书的内容摘要是否正确。
FROM debian:bookworm
ADD --checksum=sha256:24454f830cdb571e2c4ad15481119c43b3cafd48dd869a9b2945d1036d1dc68d \
https://artifacts.example/certs/zscaler-root-ca.crt /usr/local/share/ca-certificates/zscaler-root-ca.crt
RUN apt-get update && \
apt-get install -y ca-certificates && \
update-ca-certificates使用多阶段构建
对于需要在最终运行时镜像中使用证书的多阶段构建,请确保证书安装发生在最后阶段。
FROM debian:bookworm AS build
WORKDIR /build
RUN apt-get update && apt-get install -y \
build-essential \
cmake \
curl \
git
RUN --mount=target=. cmake -B output/
FROM debian:bookworm-slim AS final
ADD --checksum=sha256:24454f830cdb571e2c4ad15481119c43b3cafd48dd869a9b2945d1036d1dc68d \
https://artifacts.example/certs/zscaler-root-ca.crt /usr/local/share/ca-certificates/zscaler-root-ca.crt
RUN apt-get update && \
apt-get install -y ca-certificates && \
update-ca-certificates
WORKDIR /app
COPY --from=build /build/output/bin .
ENTRYPOINT ["/app/bin"]结论
将 Zscaler 根证书直接嵌入到你的 Docker 镜像中,可以确保容器在 Zscaler 代理环境中顺利运行。通过采用这种方法,你可以减少潜在的运行时错误,并创建一个一致、可审计的配置,从而在受监控的网络中实现 Docker 的顺畅操作。