我正在遵循本文档将文件上传到GCS。 Setting Up Authentication for Server to Server Production Applications
它在本地工作,但在生产中出现此错误:
发布https://www.googleapis.com/upload/storage/v1/b/[bucket-name]/o?alt=json&prettyPrint=false&projection=full&uploadType=multipart:x509:无法加载系统根目录,并且没有提供根目录。
func UploadIMG(ctx *context.Context, file []byte, fileName string) error {
storageClient, err := storage.NewClient(*ctx)
if err != nil {
log.Fatal(err)
}
w := storageClient.Bucket(bucketName).Object(fileName).NewWriter(*ctx)
if _, err := w.Write(file); err != nil {return err}
if err := w.Close(); err != nil {return err}
oauthClient, err := google.DefaultClient(*ctx, cloudkms.CloudPlatformScope)
if err != nil {
log.Fatal(err)
}
kmsService, err := cloudkms.New(oauthClient)
if err != nil {
log.Fatal(err)
}
_ = kmsService
return nil
}
答案 0 :(得分:3)
您实际上是否已继续链接的教程,并确保您具有正确的凭据?
错误本身很可能与证书有关。尝试执行请求时,它会在基础系统上查找根证书,但找不到或打开它们。例如在Ubuntu上,它们应位于/ usr / share / ca-certificates和/或/ etc / ssl / certs下。确保您拥有具有正确特权的证书,以便能够执行所需的请求。
答案 1 :(得分:1)
正如人们在回答中所说,这与我的dockerFile中缺少证书颁发机构有关。
就我而言,在alpine中已经有一个名为ca-certificates的软件包实用程序,它附带了预安装的证书。只需将以下命令添加到我的泊坞窗即可。
RUN apk --no-cache add ca-certificates
答案 2 :(得分:0)
对于任何Google api,您都需要一个信任的根CA。
不确定您的生产环境,但是如果您使用的是Docker,请将此行添加到Dockerfile
:
COPY /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
从Linux
构建开始,您可以看到go
会查找系统根信任文件的顺序:
https://golang.org/src/crypto/x509/root_linux.go
"/etc/ssl/certs/ca-certificates.crt", // Debian/Ubuntu/Gentoo etc.
"/etc/pki/tls/certs/ca-bundle.crt", // Fedora/RHEL 6
"/etc/ssl/ca-bundle.pem", // OpenSUSE
"/etc/pki/tls/cacert.pem", // OpenELEC
"/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", // CentOS/RHEL 7
如果您的生产(linux)版本中没有这些目录,那么go
将不具有系统根信任,并且您会得到您看到的错误。