当前位置: 首页 > 知识库问答 >
问题:

我们计算的请求签名与您提供的签名不匹配。S3 Bucket Http Post

秦安怡
2023-03-14

我试图按照教程HTTP://docs.aws.amazon.com/amazons3/latest/api/sigv4-post-example.html使用HTTP post方法将图像上传到s3 bucket。但我每次都得到以下错误

 Error
 <Code>SignatureDoesNotMatch</Code>
 <Message>
 The request signature we calculated does not match the signature you 
 provided. Check your key and signing method.
  </Message>
 <form action="http://mynewdulibucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
Key to upload:
<input type="input"  name="key" value="user/user1/${filename}" /><br />
<input type="hidden" name="acl" value="public-read" />
<input type="hidden" name="success_action_redirect" value="http://mynewdulibucket.s3.amazonaws.com/successful_upload.html" />
Content-Type:
<input type="input"  name="Content-Type" value="image/jpeg" /><br />
<input type="hidden" name="x-amz-meta-uuid" value="14365123651274" />
<input type="hidden" name="x-amz-server-side-encryption" value="AES256" />
<input type="text"   name="X-Amz-Credential" value="XXXXXXXXXXXXX/20151229/us-east-1/s3/aws4_request" />
<input type="text"   name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" />
<input type="text"   name="X-Amz-Date" value="20151229T000000Z" />

Tags for File:
<input type="input"  name="x-amz-meta-tag" value="" /> <br />
<input type="hidden" name="Policy" value="XXXXXXXXXXXXXXX"/>
<input type="hidden" name="X-Amz-Signature" value="XXXXXXXXXXXXX" />
File:
<input type="file"   name="file" /> <br />
<!-- The elements after this will be ignored -->
<input type="submit" name="submit" value="Upload to Amazon S3" />

政策如下:

{ "expiration": "2018-12-30T12:00:00.000Z",
 "conditions": [
{"bucket": "mynewdulibucket"},
["starts-with", "$key", "user/user1/MyPhoto.jpg"],
{"acl": "public-read"},
{"success_action_redirect": "http://mynewdulibucket.s3.amazonaws.com/successful_upload.html"},
["starts-with", "$Content-Type", "image/"],
{"x-amz-meta-uuid": "14365123651274"},
{"x-amz-server-side-encryption": "AES256"},
["starts-with", "$x-amz-meta-tag", ""],
{"x-amz-credential": "XXXXXXXXX/20151229/us-east-1/s3/aws4_request"},
{"x-amz-algorithm": "AWS4-HMAC-SHA256"},
{"x-amz-date": "20151229T000000Z" }
]
  }

生成策略和签名的代码将粘贴到相关的表单字段中:

public class Main {

public static void main(String[] args) throws Exception
{
    String policy_document = "{\"expiration\":\"2018-12-30T12:00:00.000Z\",\"conditions\":[{\"bucket\":\"mynewdulibucket\"},[\"starts-with\",\"$key\",\"user/user1/MyPhoto.jpg\"],{\"acl\":\"public-read\"},{\"success_action_redirect\":\"http://mynewdulibucket.s3.amazonaws.com/successful_upload.html\"},[\"starts-with\",\"$Content-Type\",\"image/\"],{\"x-amz-meta-uuid\":\"14365123651274\"},{\"x-amz-server-side-encryption\":\"AES256\"},[\"starts-with\",\"$x-amz-meta-tag\",\"\"],{\"x-amz-credential\":\"AKIAJQHQNWQ7FCTGNKQQ/20151229/us-east-1/s3/aws4_request\"},{\"x-amz-algorithm\":\"AWS4-HMAC-SHA256\"},{\"x-amz-date\":\"20151229T000000Z\"}]}";
    String encodedPolicy = new String(Base64.getEncoder().encode(policy_document.getBytes("UTF-8"))).replaceAll("\n", "").replaceAll("\r", "");
    String secretKey = "XXXXXXXXXXXXXXXX";

    String signature = getSigning(secretKey, "20151229T000000Z", "us-east-1", "s3",encodedPolicy);

    //the following values get pasted into the form fields Policy and X-Amz-Signature respectively (see above XXXXX)
    System.out.println("base64 " + encodedPolicy);

    System.out.println("signature " + signature);

}


static byte[] HmacSHA256(String data, byte[] key) throws Exception
{
    String algorithm="HmacSHA256";
    Mac mac = Mac.getInstance(algorithm);
    mac.init(new SecretKeySpec(key, algorithm));
    return mac.doFinal(data.getBytes("UTF8"));
}

static String getSigning(String key, String dateStamp, String regionName, String serviceName,String base64signature) throws Exception {
    byte[] kSecret = ("AWS4" + key).getBytes("UTF8");
    byte[] kDate = HmacSHA256(dateStamp, kSecret);
    byte[] kRegion = HmacSHA256(regionName, kDate);
    byte[] kService = HmacSHA256(serviceName, kRegion);
    //
    byte[] kSigning = HmacSHA256("aws4_request", kService);

    byte[] signature = HmacSHA256(base64signature, kSigning);

    return new String(Base64.getEncoder().encode(signature));
}

共有1个答案

井翰
2023-03-14

当您没有正确进行身份验证时,就会出现这种误导性错误。

验证:

  • 您的~/.aws/配置是正确的。
  • 您在调用时正确地提供了API密钥。
  • 您的环境变量正在正确地传递您的凭据。
  • 运行此操作的实例已为其IAM角色分配了正确的权限。
 类似资料:
  • 我正试图上传一张使用AWS S3 SDK的图片。现在,这以前是有效的,但由于某种原因,它停止了工作,我开始得到这个错误: 现在,当我点击链接时,它会给我一个'NoSuchKey'错误: 我真的不明白这一点,因为我的键实际上只是一个字符串。我也试图上传一些东西,所以显然关键不会存在-我正在努力上传它! 另一个教程来自一个博客,我没有它的链接,但我上面的代码与文档中的这个教程相同。我所做的只是把它移到

  • 我有不同的对象来生成保存在S3中的文件。每个对象调用以下函数来保存文件。 我只有以下几个问题。对象要么总是保存文件,要么永远无法保存文件。 错误是 我们计算的请求签名与您提供的签名不匹配。检查您的AWS秘密访问密钥和签名方法。有关详细信息,请参阅REST身份验证和SOAP身份验证。(服务:S3,状态代码:403,请求ID:79b6c0a2-0d74-1f30-a4bf-246e9631ccd8,扩

  • 我想从网站content.geappliances.io使用AWS API网关得到响应,但总是得到错误: {“信息”:"我们计算的请求签名与您提供的签名不匹配。请检查您的AWS秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。\n\n此请求的规范字符串应为\n'GET\n/search/b2b/results\n\n内容类型:\n host:content.geapplications.io\

  • 我试图使用获取S3 bucket中的对象列表。获取以下异常: 我的代码片段: https://stackoverflow.com/a/30519762/948268--提到键以句点开始。 https://github.com/aws/aws-sdk-js/issues/86--讨论如何确保URI查询字符串参数值的正确编码。但在我的例子中,我使用的是AwsSessionCredentials类。 还

  • 我试图上传图片到s3与预先签署的url从aws SDK生成。 对于上面的返回url,当我试图访问它时,它给出了一个错误 null CORS配置 更新的解决方案

  • 我正试图在iOS上执行AWS上传。我正在遍历一个对象数组,并将大量大小不同的图像(1000+)上传到S3 bucket中。使用: 当我到达大约第700张图像时,上传过程开始变得非常缓慢,然后我开始在随后的每一次图像上传中收到这些错误: 编辑2:每个Yosuke请求的代码(我只是构建了一个请求对象数组,然后循环遍历数组并上传每个请求):