使用 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 路由,因此 Docker Desktop 会自动使用 Zscaler 代理,无需任何其他配置。

如果您不使用 Zscaler 作为系统级代理,请在 Docker Desktop 中手动配置代理设置。使用设置管理为组织中的所有客户端设置代理设置,或在 Docker Desktop GUI 的设置 > 资源 > 代理下编辑代理配置。

在 Docker 镜像中安装根证书

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

获取根证书

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

示例:使用 Google Chrome 导出证书

  1. 在 Google Chrome 中,导航到chrome://certificate-manager/
  2. 在**本地证书**下,选择**查看导入的证书**。
  3. 找到 Zscaler 根证书,通常标记为**Zscaler 根 CA**。
  4. 打开证书详细信息并选择**导出**。
  5. 以 ASCII PEM 格式保存证书。
  6. 在文本编辑器中打开导出的文件,以确认它包含-----BEGIN CERTIFICATE----------END CERTIFICATE-----

获取证书后,将其存储在可访问的存储库中,例如 JFrog Artifactory 或 Git 存储库。或者,使用 AWS S3 等通用存储。

使用证书构建

要在构建镜像时安装这些证书,请将证书复制到构建容器中并更新信任存储区。Dockerfile 示例如下所示

FROM debian:bookworm
COPY zscaler-cert.pem /usr/local/share/ca-certificates/zscaler-cert.pem
RUN apt-get update && \
    apt-get install -y ca-certificates && \
    update-ca-certificates

这里,zscaler-cert.pem是根证书,位于构建上下文(通常在应用程序的 Git 存储库中)的根目录下。

如果您使用工件存储库,则可以使用ADD指令直接获取证书。您还可以使用--checksum标志来验证证书的内容摘要是否正确。

FROM debian:bookworm
ADD --checksum=sha256:24454f830cdb571e2c4ad15481119c43b3cafd48dd869a9b2945d1036d1dc68d \
    https://artifacts.example/certs/zscaler-cert.pem /usr/local/share/ca-certificates/zscaler-cert.pem
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-cert.pem /usr/local/share/ca-certificates/zscaler-cert.pem
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 操作。