Docker容器运行Golang http.Client时出现错误“certificate signed by unknown authority”。

30

我创建了一个docker容器,使用GoLang与谷歌API交互。一开始我使用的是SCRATCH容器,但更改为ubuntu/alpine后出现错误certificate signed by unknown authority

resp, err := client.Get("https://www.googleapis.com/oauth2/v3/userinfo")

希望得到任何有关解决此问题的帮助。在我的mac上可以正常运行代码。

经过一些研究,我发现了https://github.com/golang/go/issues/24652的问题,但我不确定这是否直接相关或者我是否需要与容器共享某些证书。

2个回答

77

使用 Scratch 构建镜像时,除了将应用程序放入镜像中外,您还需要包含可信证书。例如,如果您的项目中直接注入了 ca-certificates.crt 文件:

FROM scratch
ADD ca-certificates.crt /etc/ssl/certs/
ADD main /
CMD ["/main"]

如果您正在使用多阶段构建,并且只想要由分发商打包的证书,那么看起来应该是这样的:

FROM golang:alpine as build
# Redundant, current golang images already include ca-certificates
RUN apk --no-cache add ca-certificates
WORKDIR /go/src/app
COPY . .
RUN CGO_ENABLED=0 go-wrapper install -ldflags '-extldflags "-static"'

FROM scratch
# copy the ca-certificate.crt from the build stage
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=build /go/bin/app /app
ENTRYPOINT ["/app"]

当我将本来在Linux和Windows上正常运行的应用程序容器化后,出现了非常奇怪的行为。我猜是由于ca-certs引起的,并且这篇答案完全解决了我的问题! - CenterOrbit

0

你可以为Ubuntu专门使用自签名证书。 在开始之前,您应该配置一个具有sudo权限的非root用户。您可以按照我们的Ubuntu 16.04初始服务器设置指南学习如何设置此类用户帐户。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接