【问题标题】:How do I make an HTTPS call in a Busybox Docker container running Go?如何在运行 Go 的 Busybox Docker 容器中进行 HTTPS 调用?
【发布时间】:2018-01-05 10:26:11
【问题描述】:

我正在尝试在运行 Go 二进制文件的 Docker 容器中进行 HTTPS 调用。这给了我以下错误:

x509: 未能加载系统根目录并且没有提供根目录

查了一下,问题似乎是 BusyBox docker 映像没有根 CA 证书。从 StackOverflow 上的其他答案看来,最好的方法是将 CA 根挂载到 /etc/ssl/certs 容器目录中。

要在本地进行测试,挂载主机的根 CA 证书是有意义的。在生产中运行时(我使用 Google Container Engine),我不确定如何指定根 CA 证书。我需要自己创建一个吗?或者 GKE 中是否有我可以重复使用的现有证书?

【问题讨论】:

    标签: ssl docker kubernetes google-kubernetes-engine busybox


    【解决方案1】:

    您可以有多种选择

    从主机共享证书

    正如您所指出的,您可以从主机分享/etc/ssl/certs

    使用带有证书的busybox

    您可以使用像 odise/busybox-curl 这样已经安装了证书的图像。

    为此使用 docker-compose 和共享卷

    这是一种更好的方法,因为它不需要您依赖主机

    version: '2'
    
    services:
      busybox:
        image: busybox
        command: sleep 1000
        volumes:
          - certificates:/etc/ssl/certs:ro
      certifcate_installer:
        image: alpine
        command: sh -c 'apk update && apk add ca-certificates'
        volumes:
          - certificates:/etc/ssl/certs
    volumes:
      certificates:
    

    使用多阶段 Dockerfile 构建它

    FROM alpine as certs
    RUN apk update && apk add ca-certificates
    
    FROM busybox
    COPY --from=certs /etc/ssl/certs /etc/ssl/certs
    

    然后像普通文件一样构建它

    vagrant@vagrant:~/certs$ docker build -t busyboxcerts .
    Sending build context to Docker daemon  49.66kB
    Step 1/4 : FROM alpine as certs
     ---> 4a415e366388
    Step 2/4 : RUN apk update && apk add ca-certificates
     ---> Running in 0059f93b5fc5
    fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/main/x86_64/APKINDEX.tar.gz
    fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/community/x86_64/APKINDEX.tar.gz
    v3.5.2-131-g833fa41a4d [http://dl-cdn.alpinelinux.org/alpine/v3.5/main]
    v3.5.2-125-g9cb91a548a [http://dl-cdn.alpinelinux.org/alpine/v3.5/community]
    OK: 7966 distinct packages available
    (1/1) Installing ca-certificates (20161130-r1)
    Executing busybox-1.25.1-r0.trigger
    Executing ca-certificates-20161130-r1.trigger
    OK: 5 MiB in 12 packages
     ---> 1a84422237e4
    Removing intermediate container 0059f93b5fc5
    Step 3/4 : FROM busybox
     ---> efe10ee6727f
    Step 4/4 : COPY --from=certs /etc/ssl/certs /etc/ssl/certs
     ---> af9936f55fc4
    Removing intermediate container 1af54c34a5b5
    Successfully built af9936f55fc4
    Successfully tagged busyboxcerts:latest
    vagrant@vagrant:~/certs$ docker run busyboxcerts:latest ls /etc/ssl/certs
    02265526.0
    024dc131.0
    03179a64.0
    

    有关多阶段构建的更多详细信息,请参阅https://docs.docker.com/engine/userguide/eng-image/multistage-build/#before-multi-stage-builds

    所有方法都有各自的优缺点。我个人更喜欢最后一个或倒数第二个方法

    【讨论】:

      【解决方案2】:

      使用 apk add ca-certificates && update-ca-certificates 在您的容器中安装 CA 证书,如 here 所述。

      【讨论】:

      • 这适用于 Alpine Linux,不适用于 Busybox,因为 Docker Busybox 映像没有 apk 命令
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      相关资源
      最近更新 更多