在 Docker 中使用 CA 证书

注意

在生产容器中使用中间人 (MITM) CA 证书时,应遵循最佳实践。如果受到攻击,攻击者可能会拦截敏感数据,伪造可信服务或执行中间人攻击。在继续之前,请咨询您的安全团队。

如果您的公司使用检查 HTTPS 流量的代理,则可能需要将所需的根证书添加到您的主机和 Docker 容器或镜像中。这是因为 Docker 及其容器在拉取镜像或发出网络请求时,需要信任代理的证书。

在主机上,添加根证书可确保任何 Docker 命令(如 `docker pull`)都能正常工作。对于容器,您需要在构建过程或运行时将根证书添加到容器的信任存储中。这确保了在容器内运行的应用程序可以通过代理进行通信,而不会遇到安全警告或连接故障。

将 CA 证书添加到主机

以下部分描述如何在 macOS 或 Windows 主机上安装 CA 证书。对于 Linux,请参阅您发行版的文档。

macOS

  1. 下载 MITM 代理软件的 CA 证书。
  2. 打开 **钥匙串访问** 应用程序。
  3. 在钥匙串访问中,选择 **系统**,然后切换到 **证书** 选项卡。
  4. 将下载的证书拖放到证书列表中。如果系统提示,请输入您的密码。
  5. 找到新添加的证书,双击它,然后展开 **信任** 部分。
  6. 为证书设置 **始终信任**。如果系统提示,请输入您的密码。
  7. 启动 Docker Desktop 并验证 `docker pull` 是否有效,假设 Docker Desktop 已配置为使用 MITM 代理。

Windows

选择您是想使用 Microsoft Management Console (MMC) 还是 Web 浏览器安装证书。


  1. 下载 MITM 代理软件的 CA 证书。
  2. 打开 Microsoft Management Console (mmc.exe)。
  3. 在 MMC 中添加 **证书管理单元**。
    1. 选择 **文件** → **添加/删除管理单元**,然后选择 **证书** → **添加 >**。
    2. 选择 **计算机帐户**,然后选择 **下一步**。
    3. 选择 **本地计算机**,然后选择 **完成**。
  4. 导入 CA 证书
    1. 从 MMC 中,展开 **证书(本地计算机)**。
    2. 展开 **受信任的根证书颁发机构** 部分。
    3. 右键单击 **证书** 并选择 **所有任务** 和 **导入…**。
    4. 按照提示导入您的 CA 证书。
  5. 选择 **完成**,然后选择 **关闭**。
  6. 启动 Docker Desktop 并验证 `docker pull` 是否成功(假设 Docker Desktop 已经配置为使用 MITM 代理服务器)。

提示

根据使用的 SDK 和/或运行时/框架,除了将 CA 证书添加到操作系统的信任存储之外,可能还需要进一步的步骤。

  1. 下载 MITM 代理软件的 CA 证书。
  2. 打开您的 Web 浏览器,转到 **设置** 并打开 **管理证书**
  3. 选择 **受信任的根证书颁发机构** 选项卡。
  4. 选择 **导入**,然后浏览到下载的 CA 证书。
  5. 选择 **打开**,然后选择 **将所有证书放在下列存储区中**。
  6. 确保选择了 **受信任的根证书颁发机构**,然后选择 **下一步**。
  7. 选择 **完成**,然后选择 **关闭**。
  8. 启动 Docker Desktop 并验证 `docker pull` 是否成功(假设 Docker Desktop 已经配置为使用 MITM 代理服务器)。

将 CA 证书添加到 Linux 镜像和容器

如果您需要运行依赖于内部或自定义证书的容器化工作负载(例如在具有公司代理或安全服务的环境中),则必须确保容器信任这些证书。如果不添加必要的 CA 证书,您的容器中的应用程序在尝试连接到 HTTPS 终结点时可能会遇到请求失败或安全警告。

通过 在构建时将 CA 证书添加到镜像,您可以确保从该镜像启动的任何容器都将信任指定的证书。这对于在生产期间需要无缝访问内部 API、数据库或其他服务的应用程序尤其重要。

在无法重建镜像的情况下,您可以改为 直接将证书添加到容器。但是,在运行时添加的证书如果容器被销毁或重新创建则不会持久存在,因此此方法通常用于临时修复或测试场景。

将证书添加到镜像

提示

以下命令适用于 Ubuntu 基本镜像。如果您的构建使用不同的 Linux 发行版,请使用等效的包管理命令(`apt-get`、`update-ca-certificates` 等)。

要在构建容器镜像时添加 CA 证书,请在您的 Dockerfile 中添加以下指令。

# Install the ca-certificate package
RUN apt-get update && apt-get install -y ca-certificates
# Copy the CA certificate from the context to the build container
COPY your_certificate.crt /usr/local/share/ca-certificates/
# Update the CA certificates in the container
RUN update-ca-certificates

将证书添加到容器

提示

以下命令适用于基于 Ubuntu 的容器。如果您的容器使用的是其他 Linux 发行版,请使用等效的包管理命令(例如 apt-getupdate-ca-certificates 等)。

向正在运行的 Linux 容器添加 CA 证书

  1. 下载 MITM 代理软件的 CA 证书。

  2. 如果证书的格式不是 .crt,请将其转换为 .crt 格式。

    命令示例
    $ openssl x509 -in cacert.der -inform DER -out myca.crt
    
  3. 将证书复制到正在运行的容器中

    $ docker cp myca.crt <containerid>:/tmp
    
  4. 连接到容器

    $ docker exec -it <containerid> sh
    
  5. 确保已安装 ca-certificates 包(更新证书所需)。

    # apt-get update && apt-get install -y ca-certificates
    
  6. 将证书复制到 CA 证书的正确位置。

    # cp /tmp/myca.crt /usr/local/share/ca-certificates/root_cert.crt
    
  7. 更新 CA 证书。

    # update-ca-certificates
    
    示例输出
    Updating certificates in /etc/ssl/certs...
    rehash: warning: skipping ca-certificates.crt, it does not contain exactly one certificate or CRL
    1 added, 0 removed; done.
  8. 验证容器是否可以通过 MITM 代理进行通信。

    # curl https://example.com
    
    示例输出
    <!doctype html>
    <html>
    <head>
        <title>Example Domain</title>
    ...