【问题标题】:Add trusted CA to ubuntu without ca-certificates package在没有 ca-certificates 包的情况下将受信任的 CA 添加到 ubuntu
【发布时间】:2021-09-07 13:58:04
【问题描述】:

问题:

  • 我想构建一个 docker 容器FROM:ubuntu:20.04 但我无法访问外部互联网
  • 我在内部网络上有一个可以使用的 apt 镜像
  • apt 镜像位于带有自定义证书的 https 后面
  • 我有自定义证书的 CA
  • 基本的ubuntu:20.04 容器没有ca-certificates 包,所以我没有可用的update-ca-certificates 命令

到目前为止我做了什么:

  • 运行容器 (docker run -it --entrypoint /bin/bash ubuntu:20.04)

  • 在容器中,擦除 apt 列表并将其替换为我的自定义 apt 存储库

     echo > /etc/apt/sources.list
     echo 'deb https://mycompany.internal.network/ubuntu-remote focal main restricted' >> /etc/apt/sources.list
     echo 'deb https://mycompany.internal.network/ubuntu-remote focal multiverse' >> /etc/apt/sources.list
     echo 'deb https://mycompany.internal.network/ubuntu-remote focal universe' >> /etc/apt/sources.list
     [.....]
    
  • 将 https 的根 CA 放置在 /usr/local/share/ca-certificates/mycompany/

如果可以的话,我会从这里运行update-ca-certificates,一切都会正常运行。我通过预先安装 ca-certificates 包进行了测试,但是在将创建此容器的正确 CI 工作流程中,无法访问 ubuntu 上游 apt,所以我不能这样做,这将定期重建以保持图像是最新的。 如何在不使用update-ca-certificates 的情况下使其信任内部回购?我发现的所有文章都指向这样做,但我不能。

【问题讨论】:

    标签: ubuntu openssl ssl-certificate apt self-signed


    【解决方案1】:

    实际上我想到了两种可能性。

    最简单最危险的方法是简单地禁用证书验证

    更成熟安全的解决方案将是提供必要的 Debian 软件包存档以手动安装ca-certificates

    禁用证书验证

    您可以通过 apt 自身的附加选项来实现此目的,无论是针对任何主机还是特定主机。您正在寻找的APT 选项Acquire::https::Verify-Peer 用于任何主机或Acquire::https::<host>::Verify-Peer 仅用于特定主机。由于禁用任何主机的主机验证甚至是暂时的潜在的危险行为,我建议使用特定于主机的变体 - 但是您确实应该知道您拥有哪些注册表主机在您的sources.list 文件中设置。根据您的示例,命令如下所示。

    apt-get -o Acquire::https::mycompany.internal.network::Verify-Peer=0 update
    

    由于这仅在此一次调用期间临时设置选项,因此您还必须在实际安装某些东西(可能是“ca-certificates”)时设置它,如下所示:

    apt-get -o Acquire::https::mycompany.internal.network::Verify-Peer=0 install ca-certificates
    

    您也可以在apt.conf 中永久设置此选项,但我强烈反对这种方法(尤其是主机非特定变体),因为它会永久禁用 HTTPS 主机验证(对于一个甚至任何主机)——只要选项位于您的 apt.conf 中。

    提供必要的 Debian 软件包存档

    此解决方案不像第一个解决方案“那么简单”,但在完整性方面绝对是首选的解决方案,而且实际上并不难。你基本上要做的是,你得到ca-certificates及其依赖项的Debian软件包存档(*.deb),将它们复制到你的docker容器并通过dpkg安装它们。

    虽然第一步(为ca-certificates 获取 Debian 软件包存档 (.deb))似乎也相当容易,但获取其所有 必需 依赖项是一项更困难的任务 - 在至少如果您没有等效的“目标操作系统”,即 Ubuntu 20.04。但是如果你有,你基本上可以运行以下命令来下载所有.deb 用于将特定包安装到当前工作目录中。

    apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances ca-certificates | grep "^\w")
    

    然后,您可以在 docker build 期间将文件复制到容器中,或者稍后绑定挂载它们 - 无论哪种方式,您都希望通过更改到包含所有 .deb 文件的目录来简单地(尝试)安装所有文件在容器上下文和问题中:

    dpkg -i *
    

    dpkg 可能会注意到一些软件包已经安装并跳过这些。

    如前所述,这只有在目标容器操作系统与正在下载包的操作系统匹配时才能正常工作。如果不是这种情况,您基本上可以通过Ubuntu package registry index 手动解决和下载包依赖项。

    结论

    无论选择哪种解决方案,您最终都会获得ca-certificates 的有效安装。

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 2021-07-17
      • 2011-11-28
      • 1970-01-01
      • 2016-12-22
      • 2017-02-19
      • 2011-04-16
      • 2021-02-16
      • 1970-01-01
      相关资源
      最近更新 更多