【问题标题】:Docker Build using CA Trust Bundle from Host使用来自主机的 CA Trust Bundle 构建 Docker
【发布时间】:2021-02-14 23:37:54
【问题描述】:

给定一个从网络安装的简单 Dockerfile,我正在尝试找出一种优雅的方法来允许构建过程信任 HTTPS 端点,无论构建是在公司代理后面还是不在公司代理后面。 最好不要更改 Dockerfile。

Dockerfile:

FROM alpine

RUN apk update -v; apk add -v curl

错误:

$ docker build .
Sending build context to Docker daemon  83.97kB
Step 1/2 : FROM alpine
 ---> e50c909a8df2
Step 2/2 : RUN apk update -v; apk add -v curl
 ---> Running in 983ed3885376
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
140566353398600:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1913:
ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.13/main: Permission denied
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/main: No such file or directory
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
140566353398600:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1913:
ERROR: 2 errors; 14 distinct packages available
https://dl-cdn.alpinelinux.org/alpine/v3.13/community: Permission denied
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/community: No such file or directory
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
139846303062856:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1913:
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.13/main: Permission denied
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/main: No such file or directory
139846303062856:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1913:
ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.13/community: Permission denied
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/community: No such file or directory
ERROR: unable to select packages:
  curl (no such package):
    required by: world[curl]
The command '/bin/sh -c apk update -v; apk add -v curl' returned a non-zero code: 1

这里的问题是,我的开发人员机器位于公司网络上的流量拦截代理后面,从 Docker 构建中的 apk 的角度来看,该代理在中间人连接含义,它看到的证书具有由我们的代理签署,它不信任。

来自主机的信任不是问题 - 当我得到构建中请求的文件时,它可以工作:

$ wget https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
--2021-02-15 12:41:59--  https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
Connecting to 10.0.2.2:9000... connected.
Proxy request sent, awaiting response... 200 OK
Length: 631235 (616K) [application/octet-stream]
Saving to: ‘APKINDEX.tar.gz’

当我在构建服务器上运行它时,它通过正常,因为没有转发代理。

有没有办法在不修改 Dockerfile 的情况下将具有代理 CA(例如 /etc/ssl/certs/ca-certificates)的 Ubuntu 信任包传递到构建过程?

谢谢!

【问题讨论】:

  • 嗨!我有同样的错误。你找到解决方案了吗?谢谢
  • 我认为这只是 Docker 工作方式的一个限制。运行构建的操作系统需要能够信任代理证书。除了使用 COPY 将代理的 CA 证书放入操作系统,然后使用 Debian/Ubuntu(或等效)的 update-ca-certificates 将它们加载到操作系统信任包中之外,Docker 不提供其他机制。我认为最好的办法是在信任包中生成一个包含 CA 证书的基础镜像,然后使用它而不是使用没有这些证书的基础镜像。
  • 这很奇怪,因为我之前没有这个问题。我想我没有和你一样的错误:fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gzERROR: https://dl-cdn.alpinelinux.org/alpine/v3.13/main: Permission deniedfetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gzERROR: https://dl-cdn.alpinelinux.org/alpine/v3.13/community: Permission deniedv3.13.2-8-g7bb1c88019 [https://dl-cdn.alpinelinux.org/alpine/v3.13/main]v3.13.2-12-gea23800845 [https://dl-cdn.alpinelinux.org/alpine/v3.13/community]
  • 我解决了我的问题。我不知道这是否是最好的方法,但你可以遵循它。将您的代理复制到您的图像COPY proxy.pem /opt。将相同的 pem 文件复制到证书 COPY proxy.pem /etc/ssl/certs。将证书附加到 ca-certificates.crt。 cat /opt/proxy.pem >> /etc/ssl/certs/ca-certificates.crt

标签: linux docker ubuntu ssl certificate


【解决方案1】:

我的解决方案。 创建“存储库”文件。内容是:

http://dl-cdn.alpinelinux.org/alpine/v3.13/main
http://dl-cdn.alpinelinux.org/alpine/v3.13/community

在 Docker 文件中,在“RUN apk update”之前,添加以下内容:

复制存储库 /etc/apk/repositories

谢谢。

【讨论】:

  • 请分享适当的内容作为您问题的一部分,而不是链接到外部网站。
  • 点赞!这为我解决了:-) 谢谢老兄
【解决方案2】:
FROM abdennour/alpine:3.14-ssl

RUN openssl x509 -inform der -in COMPANY.der -out /usr/local/share/ca-certificates/company-cert.crt && \
   cat /usr/local/share/ca-certificates/company-cert.crt >> /etc/ssl/certs/ca-certificates.crt && \
   update-ca-certificates

解释!

  1. 向购买 SSL 证书的团队申请 CA 证书。 告诉他们提供证书文件“*.der”

  2. 明白了吗?将其转换为 .cert 文件

RUN openssl x509 -inform der -in COMPANY.der -out /usr/local/share/ca-certificates/company-cert.crt && \
   cat /usr/local/share/ca-certificates/company-cert.crt >> /etc/ssl/certs/ca-certificates.crt && \
   update-ca-certificates

但这需要在映像中有openssl ca-certificates 包。 而且因为你不能安装任何东西,所以你可以依赖至少包含这两个包的 alpine 镜像,比如我的基础镜像:

FROM abdennour/alpine:3.14-ssl

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 2022-07-04
    • 2020-07-05
    相关资源
    最近更新 更多