无法在 Docker 容器中交换 Google API 的 AccessToken

4
我有一个用Go编写的Web应用程序,使用oauth2(包golang.org/x/oauth2)通过Google登录用户(请按照此教程进行:https://developers.google.com/identity/sign-in/web/server-side-flow)。在本地测试应用程序时,它可以正常工作,但是当我在Docker容器中部署应用程序并运行二进制文件时(基于alpine:latest),它会出现错误:Post https://accounts.google.com/o/oauth2/token: x509: certificate signed by unknown authority。这是我的代码以交换accessToken的方式:
ctx = context.Background()

config := &oauth2.Config{
    ClientID:     config.GoogleClientId,
    ClientSecret: config.GoogleClientSecret,
    RedirectURL:  config.GoogleLoginRedirectUrl,
    Endpoint:     google.Endpoint,
    Scopes:       []string{"email", "profile"},
}

accessToken, err := config.Exchange(ctx, req.Code)
if err != nil {
    log.Println(err.Error())   // Error here
}

在Docker镜像中,安装您发行版的CA捆绑包。该软件包通常称为ca-certificates - Peter
2个回答

2
问题并非由Go引起,而是由Alpine镜像引起的。
默认的Alpine镜像没有证书,因此应用程序无法调用https地址(在这种情况下为https://accounts.google.com/o/oauth2/token)。
要解决此问题,请安装两个软件包opensslca-certificates。 Dockerfile示例:
apk add --no-cache ca-certificates openssl

1
你需要将Google颁发的CA证书添加到docker镜像的可信证书存储中。
Google CA证书为https://pki.google.com/GIAG2.crt
有关该证书的更多信息,请参见此处
然后在Dockerfile中,你需要这样做:
cp GIAG2.crt /usr/local/share/ca-certificates/GIAG2.crt
update-ca-certificates

当我运行 update-ca-certificates 命令时,它会显示警告 WARNING: ca-cert-GIAG2.pem does not contain exactly one certificate or CRL: skipping - Robin Huy
@RobinHuy,我认为它给出的完整信息是这样的: 正在更新/etc/ssl/certs中的证书... 警告:GIAG2.pem不包含证书或CRL:跳过 1个添加,0个删除;完成。 证书已添加,您在此之后尝试访问API了吗?我认为它会工作。 - Soumen Mukherjee
仍然没有起作用。完整的消息是WARNING: ca-certificates.crt 不包含精确一个证书或CRL:跳过 WARNING: ca-cert-GIAG2.pem 不包含精确一个证书或CRL:跳过。我按照您的建议复制文件GIAG2.crt,但是在ca-cert-GIAG2.pem处出现了警告错误。 - Robin Huy

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