не удается загрузить файл в облачное хранилище Google в рабочей среде

# #go #google-cloud-storage

#Вперед #google-облачное хранилище

Вопрос:

Я следую этой документации для загрузки файлов в GCS. Настройка аутентификации для производственных приложений между серверами

Он работает локально, но в рабочей среде я получаю эту ошибку:

Сообщение https://www.googleapis.com/upload/storage/v1/b/[bucket-name]/o?alt=jsonamp;prettyPrint=falseamp;projection=fullamp;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
}
  

Ответ №1:

Вы действительно продолжили учебник, на который вы ссылались, убедившись, что у вас правильные учетные данные?

Сама ошибка, вероятно, связана с сертификатом. Когда он пытается выполнить запрос, он ищет корневые сертификаты в базовой системе, но не может их найти или открыть. Например, в Ubuntu они должны находиться в /usr/share/ca-certificates и / или /etc/ssl/certs . Убедитесь, что у вас есть сертификаты с правильными привилегиями, чтобы иметь возможность выполнить нужный запрос.

Ответ №2:

как сказали ребята в своих ответах, это связано с отсутствием центра сертификации в моем dockerFile.

В моем случае в alpine уже есть пакетная утилита ca-certificates, которая поставляется с предустановленными сертификатами. Просто нужно добавить следующую команду в мой docker.

 RUN apk --no-cache add ca-certificates
  

Ответ №3:

Для любого API Google вам понадобится доверенный корневой центр сертификации.

Не уверен в вашей рабочей среде, но если вы используете 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 вас не будет доверия к системному корню, и вы получите ошибку, которую вы видите.