не удается загрузить файл в облачное хранилище Google на производстве - PullRequest
2 голосов
/ 11 апреля 2019

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

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

Post 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 ]

3 голосов
/ 11 апреля 2019

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

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

1 голос
/ 14 апреля 2019

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

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

RUN apk --no-cache add ca-certificates
0 голосов
/ 11 апреля 2019

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

...