为了账号安全,请及时绑定邮箱和手机立即绑定

AWS S3 - Golang 开发工具包 - SignatureDoesNotMatch

AWS S3 - Golang 开发工具包 - SignatureDoesNotMatch

Go
慕慕森 2022-06-13 17:07:01
我正在寻找将 S3 存储桶与正在开发的 API 集成,无论我走到哪里都会遇到这个错误 -SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.         status code: 403我做了以下已安装 SDK 和 AWS CLI,并已配置 AWS双重(三重)检查密钥和秘密密钥和存储桶权限的拼写尝试使用凭证文档、.env,甚至直接对值进行硬编码使用 AWS CLI 测试(此工作),所以我相信我可以排除权限、密钥作为一个整体。我正在通过尝试列出存储桶进行测试,这是直接取自 AWS 文档的代码-sess := session.Must(session.NewSessionWithOptions(session.Options{   <--- DEBUGGER SET HERE        SharedConfigState: session.SharedConfigEnable,    }))    svc := s3.New(sess)    result, err := svc.ListBuckets(nil)    if err != nil { exitErrorf("Unable to list buckets, %v", err) }    for _, b := range result.Buckets {        fmt.Printf("* %s created on %s\n", aws.StringValue(b.Name), aws.TimeValue(b.CreationDate))    }使用调试器,我可以在程序运行时看到会话配置文件,问题可能在这里config -       -> credentials                      -> creds                         -> v                           -> Access Key = ""                           -> Secret Access Key  = ""                           -> Token  = ""                                                 -> provider                         ->value                           -> Access Key With Value                           -> Secret Access Key With Value                           -> Token With Value我个人找不到任何关于“creds”/“v”的文档,我不知道这是否是导致问题的原因。正如我所提到的,我可以使用 AWS CLI 上传到存储桶中,即使我将访问密钥等硬编码到 Go SDK 中,我也会收到此错误。
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

我刚刚编译了您的代码并且它的执行正常......向您的二进制文件提供凭据的众多方法之一是填充这些环境变量


export AWS_ACCESS_KEY_ID=AKfoobarT2IJEAU4

export AWS_SECRET_ACCESS_KEY=oa6oT0Xxt4foobarbambazdWFCb

export AWS_REGION=us-west-2

这就是您在使用 env var 方法时所需要的(您的值可使用 aws 控制台浏览器获得)


大局是创建一个包装器外壳脚本 (bash),其中包含以上三行来填充环境变量以提供凭据,然后在同一个外壳脚本中执行 golang 二进制文件(通常您在一些初步过程中编译 golang)...在我的情况下,我将三个环境变量的值存储在加密文件中,shell 脚本在调用上述导出命令之前对其进行解密


有时它有助于放弃踢,只需使用 aws 命令行等效命令让自己进入球场......从终端运行


aws s3 ls s3://cairo-mombasa-zaire --region  us-west-2

它也可以使用上面显示的相同环境变量


为了完整起见,这里是您添加了样板的代码......这运行正常并列出了桶


package main


import (


    "github.com/aws/aws-sdk-go/aws"

    "github.com/aws/aws-sdk-go/aws/session"


    "github.com/aws/aws-sdk-go/service/s3"

    // "github.com/aws/aws-sdk-go/service/s3/s3manager"


    "fmt"

    "os"

)



func exitErrorf(msg string, args ...interface{}) {

    fmt.Fprintf(os.Stderr, msg+"\n", args...)

    os.Exit(1)

}


func main() {


    region_env_var := "AWS_REGION"


    curr_region := os.Getenv(region_env_var)

    if curr_region == "" {

        exitErrorf("ERROR - failed to get region from env var %v", region_env_var)

    }


    fmt.Println("here is region ", curr_region)



    // Load session from shared config

    sess := session.Must(session.NewSessionWithOptions(session.Options{

        SharedConfigState: session.SharedConfigEnable,

    }))



    svc := s3.New(sess)

    result, err := svc.ListBuckets(nil)

    if err != nil { exitErrorf("Unable to list buckets, %v", err) }


    for _, b := range result.Buckets {

        fmt.Printf("* %s created on %s\n", aws.StringValue(b.Name), aws.TimeValue(b.CreationDate))

    }

}


查看完整回答
反对 回复 2022-06-13
?
UYOU

TA贡献1878条经验 获得超4个赞

   numBytes, err := downloader.Download(tempFile,

    &s3.GetObjectInput{

        Bucket: aws.String(bucket),

        Key:    aws.String(fileName),

    },

)

在我的情况下,桶值是错误的,最后缺少文字“/”。添加它可以解决我的问题。


我得到的错误 - 错误:SignatureDoesNotMatch:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。状态码:403,


查看完整回答
反对 回复 2022-06-13
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

如果其他人碰巧有这个问题,

问题是关于环境变量,就像斯科特上面建议的那样,但这是由于缺乏

export AWS_SDK_LOAD_CONFIG="true"

如果此环境变量不存在,则 Golang SDK 将不会查找凭据文件,此外,我为我的两个密钥实例化了环境变量,以使连接成功。

回顾一下

  • 如果您尝试使用共享凭据文件夹,则必须使用上述环境变量来启用它。

  • 如果您使用环境变量,则不应受到此问题的影响。


查看完整回答
反对 回复 2022-06-13
  • 3 回答
  • 0 关注
  • 571 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信