如何向Docker alpine添加受信任的根CA

如何向Docker alpine添加受信任的根CA,docker,ssl,certificate,alpine,man-in-the-middle,Docker,Ssl,Certificate,Alpine,Man In The Middle,假设我所在的网络中有MITM SSL交换防火墙(google.com不是由google发布的,而是由自定义CA根权限重新发布的),这里有更多详细信息 我有一个简单的Dockerfile: FROM alpine:latest RUN apk --no-cache add curl 它失败严重,错误为SSL错误 => ERROR [2/2] RUN apk --no-cache add curl

假设我所在的网络中有MITM SSL交换防火墙(google.com不是由google发布的,而是由自定义CA根权限重新发布的),这里有更多详细信息

我有一个简单的Dockerfile:

FROM alpine:latest
RUN apk --no-cache add curl
它失败严重,错误为SSL错误

 => ERROR [2/2] RUN apk --no-cache add curl                                                                                                                                    1.0s
------
 > [2/2] RUN apk --no-cache add curl:
#5 0.265 fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
#5 0.647 140037857143624:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1913:
#5 0.649 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/main: Permission denied
#5 0.649 fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
#5 0.938 140037857143624:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1913:
#5 0.940 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/community: Permission denied
#5 0.941 ERROR: unable to select packages:
#5 0.942   curl (no such package):
#5 0.942     required by: world[curl]
------
executor failed running [/bin/sh -c apk --no-cache add curl]: exit code: 1
Internet上的每个教程都说我可以添加自己的“受信任”根证书并运行
更新ca证书

但只能通过“apt add”添加。在我看来,这种情况似乎是“鸡蛋”问题

错误是相似的

=> ERROR [2/2] RUN apk --no-cache add ca-certificates   && update-ca-certificates                                                                                             1.0s
------
 > [2/2] RUN apk --no-cache add ca-certificates   && update-ca-certificates:
#5 0.269 fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
#5 0.662 140490932583240:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1913:
#5 0.663 fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
#5 0.663 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/main: Permission denied
#5 0.929 140490932583240:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1913:
#5 0.931 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/community: Permission denied
#5 0.932 ERROR: unable to select packages:
#5 0.933   ca-certificates (no such package):
#5 0.933     required by: world[ca-certificates]
------
executor failed running [/bin/sh -c apk --no-cache add ca-certificates   && update-ca-certificates]: exit code: 1
是否有其他解决方案如何安装
更新ca证书
工具?还是我遗漏了什么

Thx

有关工作解决方案,请参见@kthompso答案。

基于@kthompso答案和来自的信息的工作解决方案(使用
更新ca证书


编辑:我想到的一个解决方案是使用curl-docker image和
-k
选项,并使用这些证书和工具下载
.apk
。将其作为本地文件安装。添加我的根CA证书并运行
更新CA证书
。这听起来太疯狂了,所以我认为这一定是更好的解决方案:)

手动将您的自签名证书附加到
/etc/ssl/certs/ca证书。crt

假设您的生成目录中名为
my-cert.pem
的文件中有自签名证书:

FROM alpine:latest
  
COPY my-cert.pem /usr/local/share/ca-certificates/my-cert.crt

RUN cat /usr/local/share/ca-certificates/my-cert.crt >> /etc/ssl/certs/ca-certificates.crt && \
    apk --no-cache add \
        curl

注意:当您使用
更新ca证书
时,您需要先将证书文件放入
/usr/local/share/ca certificates/
中。

我在
apk update
中遇到同样的错误。据我所知,它下载当前的
APKINDEX.tar.gz
,并且符合“无效”的SSL根证书。你的建议与我在互联网上发现的类似,但并不能解决问题。但是无论如何,thx。啊,好的,明白了。您应该能够将
cat
添加到您的根ca文件中,然后更新我的答案。工作非常完美,thx很多:)我发现通过此修改,您无法使用运行
更新ca证书来添加ca证书。。。执行此命令后,当您运行
apk add curl
时,您将得到相同的错误。因此,在我看来,
更新ca证书
使用
cat
回滚该修改。我已经根据您的答案修改了问题和工作答案。是的,正如我提到的——如果出于某种原因您仍要运行
更新ca证书
,您需要首先将您的证书复制到
/usr/local/share/ca certificates/
中。否则,
update ca certificates
将在根ca文件中找到该证书,但不在受信任的位置,并假定它应该被删除。这就是为什么我提供的
副本开始时会将自签名证书移动到该目录中,而不是像
/root
那样的随机位置。为什么建议在末尾“再次”添加它?“#使用
更新CA证书
工具再次添加根CA”第一步是能够使用apk下载anythink。第二步(您要求的步骤)是下载ca证书工具,然后通过调用update ca certificates添加ca标准方式。第一步或多或少是黑客攻击。是的,但我读到更新ca证书工具只是像第一步一样将证书附加到该文件中。它似乎没有增加任何价值。它还能做什么?
FROM alpine:latest

USER root

# To be able to download `ca-certificates` with `apk add` command
COPY my-root-ca.crt /root/my-root-ca.crt
RUN cat /root/my-root-ca.crt >> /etc/ssl/certs/ca-certificates.crt

# Add again root CA with `update-ca-certificates` tool
RUN apk --no-cache add ca-certificates \
    && rm -rf /var/cache/apk/*
COPY my-root-ca.crt /usr/local/share/ca-certificates
RUN update-ca-certificates

RUN apk --no-cache add curl
FROM alpine:latest
  
COPY my-cert.pem /usr/local/share/ca-certificates/my-cert.crt

RUN cat /usr/local/share/ca-certificates/my-cert.crt >> /etc/ssl/certs/ca-certificates.crt && \
    apk --no-cache add \
        curl