如何在运行Go的Busybox Docker容器中进行HTTPS调用?

时间:2017-07-29 11:49:37

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

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

  

x509:无法加载系统根并且未提供根

看了这个,似乎问题是BusyBox docker镜像没有根CA证书。从StackOverflow上的其他答案来看,似乎最好的方法是将CA根目录安装到/etc/ssl/certs容器目录中。

要在本地测试,安装主机的根CA证书是有意义的。在生产中运行时(我使用Google容器引擎),我不确定如何指定根CA证书。我需要自己创建吗?或者GKE中是否存在可以重复使用的现有证书?

2 个答案:

答案 0 :(得分:11)

您可以拥有多种选择

从主机分享证书

正如您所指出,您可以与主持人共享/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

所有方法各有利弊。我个人更喜欢最后或最后一种方法

答案 1 :(得分:3)

使用Beaver Page Builder apk add ca-certificates && update-ca-certificates安装CA证书,如here所述。