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

为什么AWS不信任由自己的SDK生成的预签名URL

陆耀
2023-03-14
java.util.Date expiration = new java.util.Date();
long milliSeconds = expiration.getTime();
milliSeconds += 1000 * 60 * 60; // Add 1 hour.
expiration.setTime(milliSeconds);

GeneratePresignedUrlRequest generatePresignedUrlRequest = 
new GeneratePresignedUrlRequest(bucketName, objectKey);
generatePresignedUrlRequest.setMethod(HttpMethod.GET); 
generatePresignedUrlRequest.setExpiration(expiration);

URL url = s3client.generatePresignedUrl(generatePresignedUrlRequest); 

测试我用于连接到AWS S3的凭据;我能够使用相同的凭据和S3下载方法从AWS SDK下载S3对象。但我从AWS得到的对从上面生成的URL(例如,https://ozland.s3.amazonaws.com/1865b563cdc94fa28ef41ee0b9b0e608?AWSAccessKeyId=...AWSAccessKeyId...&EXPIRES=1471300223&Signature=PBGCRB0ZG%2B3IICDQQBVX%2FQDNAAC%3D)的响应是:

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message
<AWSAccessKeyId>...AWSAccessKeyId...</AWSAccessKeyId>
<StringToSign>GET


1471300223
/ozland/1865b563cdc94fa28ef41ee0b9b0e608</StringToSign>
<SignatureProvided>pbgcRB0Zg+3iicDQQbVX/qdNAAc=</SignatureProvided>
<StringToSignBytes>47 45 54 0a 0a 0a 31 34 37 31 33 30 30 32 32 33 0a 2f 61 6c 61 62 61 6d 61 63 6f 75 6e 74 79 2f 31 38 36 35 62 35 36 33 63 64 65 39 34 66 61 32 38 65 66 34 31 65 65 30 63 39 62 30 65 36 30 38</StringToSignBytes>
<RequestId>...RequestId...</RequestId>
<HostId>...HostId...</HostId></Error>

问题是为什么Response.StringToSign从上面与AWS文档(AWS文档)描述它的方式不同。特别是,根据文档,我希望StringToSign类似于:

AWS4-HMAC-SHA256
20150830T123600Z
20150830/us-east-1/iam/aws4_request
f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59

aws-tools在使用完全相同的S3 bucket和凭据生成预签名URL时非常适合我。但为什么我在这里得到的签名是不匹配的?

谢谢你!

共有1个答案

汪兴旺
2023-03-14

不同的是,错误响应中的string-to sign是Signature Version 2格式的,而这又是因为您签名的URL是V2格式的。

在这两种格式之间的显著视觉差异中,V2具有signature=[base64],而V4具有x-amz-signature=[hex]

这解释了Strings to Sign的差异。

 类似资料:
  • 我知道水桶是存在的。当我通过AWS Web GUI导航到此项目并双击它时,它将打开带有URL的对象,并且运行良好: 所以我认为我在使用SDK时肯定做错了什么。

  • 我按照https://docs.aws.amazon.com/amazons3/latest/dev/shareObjectPresignedurlJavasdk.html中的示例创建预签名的s3 url(v4),当我试图访问签名的url时,会出现Access Denied错误 下面是代码段 签名格式似乎是正确的,我不确定是否遗漏了其他一些s3客户端配置。由于我没有得到签名不匹配错误或无效的url

  • MarkFisher.Local使用了无效的安全证书。证书不是来自受信任的源。错误代码:MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY 我已按此答案中的建议将设置为。此外,转到首选项>隐私与安全>查看证书,我可以看到我的证书在“授权”选项卡中,并且我已经在“编辑信任”对话框中选中了“此证书可以标识网站”。这个原来没有检查 然而,Firefox拒绝接受该证

  • 在任何语言中使用AWS SDK,您都可以为私有S3对象生成预签名的URL,然后任何拥有该URL的人都可以使用该URL下载该对象。这里对此进行说明: https://docs.aws.amazon.com/amazons3/latest/dev/shareobjectpresignedurl.html 这是减少自己服务器负载的好方法。如果您的客户端使用follow重定向,则可以将实际的下载工作转移到

  • 我想通过SSL连接到我的服务器。因此,我使用以下命令在服务器上生成证书: 如果我使用如下所示的TrustManager信任客户端上的所有证书,则连接可以正常工作: 但我当然不想相信所有的证书,而只相信我的证书。我尝试了以下几个命令来导入证书: 我要怎么做才能让它正常工作?有人能解释一下对一个不是很熟悉cryto领域的人所必需的步骤吗? 编辑:正如Donal Fellows所建议的那样,我尝试了自定

  • 如果你想把自己的资源发放给第三方用户访问,但是又不想开放Bucket的读权限,可以通过生成预签名URL的形式提供给用户一个临时的访问URL。在生成URL时,你可以指定URL过期的时间,从而限制用户长时间访问。 生成一个预签名的URL 如下代码: String bucketName = "your-bucket-name"; String key = "your-object-key"; // 设