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