无法将文件上传到生产中的Google云存储

时间:2019-04-11 13:28:34

标签: go google-cloud-storage

我正在遵循本文档将文件上传到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
}

3 个答案:

答案 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将不具有系统根信任,并且您会得到您看到的错误。