AWS S3 - Golang 开发工具包 - SignatureDoesNotMatch

我正在寻找将 S3 存储桶与正在开发的 API 集成,无论我走到哪里都会遇到这个错误 -

SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.
        status code: 403

我做了以下

  1. 已安装 SDK 和 AWS CLI,并已配置 AWS

  2. 双重(三重)检查密钥和秘密密钥和存储桶权限的拼写

  3. 尝试使用凭证文档、.env,甚至直接对值进行硬编码

  4. 使用 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 中,我也会收到此错误。


慕慕森
浏览 572回答 3
3回答

拉丁的传说

我刚刚编译了您的代码并且它的执行正常......向您的二进制文件提供凭据的众多方法之一是填充这些环境变量export AWS_ACCESS_KEY_ID=AKfoobarT2IJEAU4export AWS_SECRET_ACCESS_KEY=oa6oT0Xxt4foobarbambazdWFCbexport AWS_REGION=us-west-2这就是您在使用 env var 方法时所需要的(您的值可使用 aws 控制台浏览器获得)大局是创建一个包装器外壳脚本 (bash),其中包含以上三行来填充环境变量以提供凭据,然后在同一个外壳脚本中执行 golang 二进制文件(通常您在一些初步过程中编译 golang)...在我的情况下,我将三个环境变量的值存储在加密文件中,shell 脚本在调用上述导出命令之前对其进行解密有时它有助于放弃踢,只需使用 aws 命令行等效命令让自己进入球场......从终端运行aws s3 ls s3://cairo-mombasa-zaire --region&nbsp; us-west-2它也可以使用上面显示的相同环境变量为了完整起见,这里是您添加了样板的代码......这运行正常并列出了桶package mainimport (&nbsp; &nbsp; "github.com/aws/aws-sdk-go/aws"&nbsp; &nbsp; "github.com/aws/aws-sdk-go/aws/session"&nbsp; &nbsp; "github.com/aws/aws-sdk-go/service/s3"&nbsp; &nbsp; // "github.com/aws/aws-sdk-go/service/s3/s3manager"&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "os")func exitErrorf(msg string, args ...interface{}) {&nbsp; &nbsp; fmt.Fprintf(os.Stderr, msg+"\n", args...)&nbsp; &nbsp; os.Exit(1)}func main() {&nbsp; &nbsp; region_env_var := "AWS_REGION"&nbsp; &nbsp; curr_region := os.Getenv(region_env_var)&nbsp; &nbsp; if curr_region == "" {&nbsp; &nbsp; &nbsp; &nbsp; exitErrorf("ERROR - failed to get region from env var %v", region_env_var)&nbsp; &nbsp; }&nbsp; &nbsp; fmt.Println("here is region ", curr_region)&nbsp; &nbsp; // Load session from shared config&nbsp; &nbsp; sess := session.Must(session.NewSessionWithOptions(session.Options{&nbsp; &nbsp; &nbsp; &nbsp; SharedConfigState: session.SharedConfigEnable,&nbsp; &nbsp; }))&nbsp; &nbsp; svc := s3.New(sess)&nbsp; &nbsp; result, err := svc.ListBuckets(nil)&nbsp; &nbsp; if err != nil { exitErrorf("Unable to list buckets, %v", err) }&nbsp; &nbsp; for _, b := range result.Buckets {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("* %s created on %s\n", aws.StringValue(b.Name), aws.TimeValue(b.CreationDate))&nbsp; &nbsp; }}

UYOU

&nbsp; &nbsp;numBytes, err := downloader.Download(tempFile,&nbsp; &nbsp; &s3.GetObjectInput{&nbsp; &nbsp; &nbsp; &nbsp; Bucket: aws.String(bucket),&nbsp; &nbsp; &nbsp; &nbsp; Key:&nbsp; &nbsp; aws.String(fileName),&nbsp; &nbsp; },)在我的情况下,桶值是错误的,最后缺少文字“/”。添加它可以解决我的问题。我得到的错误 - 错误:SignatureDoesNotMatch:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。状态码:403,

红糖糍粑

如果其他人碰巧有这个问题,问题是关于环境变量,就像斯科特上面建议的那样,但这是由于缺乏export&nbsp;AWS_SDK_LOAD_CONFIG="true"如果此环境变量不存在,则 Golang SDK 将不会查找凭据文件,此外,我为我的两个密钥实例化了环境变量,以使连接成功。回顾一下如果您尝试使用共享凭据文件夹,则必须使用上述环境变量来启用它。如果您使用环境变量,则不应受到此问题的影响。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go