在 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 Client Connector将 Zscaler 用作系统级代理,设备上的所有流量都会自动通过 Zscaler 路由,因此 Docker Desktop 会自动使用 Zscaler 代理,无需额外配置。

如果您没有将 Zscaler 用作系统级代理,请在 Docker Desktop 中手动配置代理设置。可以使用Settings Management为组织中的所有客户端设置代理,或者在 Docker Desktop GUI 中通过设置 > 资源 > 代理进行编辑。

在 Docker 镜像中安装根证书

为了让容器能够使用并信任 Zscaler 代理,请将证书嵌入镜像中并配置镜像的信任存储。在镜像构建时安装证书是首选方法,因为它消除了启动时配置的需要,并提供了一个可审计、一致的环境。

获取根证书

获取根证书最简单的方法是从已安装证书的机器上导出。您可以使用网页浏览器或系统的证书管理服务(例如,Windows 证书管理器)。

示例:使用 Google Chrome 导出证书

  1. 在 Google Chrome 中,导航到 chrome://certificate-manager/
  2. 本地证书下,选择查看已导入证书
  3. 找到 Zscaler 根证书,通常标记为Zscaler Root CA
  4. 打开证书详细信息并选择导出
  5. 将证书保存为 ASCII PEM 格式。
  6. 在文本编辑器中打开导出的文件,确认其中包含 -----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 在受监控的网络中顺利操作。

页面选项