问题 如何在当前日期的1年内设置Amazon S3存储桶预签名URL到期时间


图像上传到Amazon S3存储桶。我需要得到一个 预先签名的URL 从亚马逊服务器。我还想设置该URL的到期时间。最多只需17天。但我不能设置最长1年的到期时间。

      Calendar cal = Calendar.getInstance();
        cal.add(Calendar.YEAR, 1);
        Date nextYear = cal.getTime();

    GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(
                "bucketName", "accessname");
        generatePresignedUrlRequest.setMethod(HttpMethod.GET);
        generatePresignedUrlRequest
                .setExpiration(nextYear);
        URL url = s3client
                .generatePresignedUrl(generatePresignedUrlRequest);
        bucketURL = url.toString();

10496
2017-10-08 06:34


起源

TL:DR-v4签名算法只允许7天。 (关于文档中的v4:所有地区都支持此最新签名版本,2014年1月30日之后的任何新区域仅支持签名版本4.)因此,您最好在需要时生成预签名URL。 - HopeKing


答案:


您没有“从服务器”获得预先签名的URL。签名计算在客户端完成。预先签名的URL实际上是在您的计算机上计算的,而不是由服务计算的。

如果您使用的是当前的SDK,则可能使用的是Signature V4。如果签名的URL包含 X-Amz-Signature= 然后这证实了V4。较旧的V2算法仅使用 Signature= 在签名的URL中。

如果您的签名确实是V4,那么您会看到故意限制:

预签名URL最多可以有效七天,因为您在签名计算中使用的签名密钥有效期最长为七天。

http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html

如果您已经在使用V2,那么您应该可以在2038年之前使用到期时间对URL进行签名。如果您使用的是V4,则可以通过切换到使用V2来解决限制,但这是不可取的。在较新的S3区域(如法兰克福)中不支持V2,如果您按照自己的意愿轮换AWS访问密钥,则最终的密钥失效也将使使用该密钥创建的任何签名无效。

在大多数情况下,更正确的方法是在需要时生成签名URL。如上所述,该操作不需要与S3服务交互,并且通常可以实时完成。

如果您需要授予特定用户访问“直接链接”的权限,请考虑在应用程序中创建可以评估用户凭据的端点,此时您可以生成签名URL并使用HTTP重定向浏览器 302 响应。


15
2017-10-08 12:52



我怎样才能切换到V2?它有全球性的财产吗? - Ruslan
V2在新区域@Ruslan中不起作用,并且由于V4在大多数情况下是一个更好的算法,我不知道这是否可能,但它可能是。您在哪个地区工作,以及您使用的SDK是什么?在这个答案中,我应该想到的一点是CloudFront。 CloudFront使用与S3不同的身份验证机制,但可以在任何Bucket前使用。 CloudFront签名URL不限于短时间间隔,并且S3没有两个选项 - 您可以限制从单个IP地址使用签名URL,也可以设置启动有效时间。 - Michael - sqlbot
我想我在一个古老的地区。谢谢你的回答,但我已经找到了解决方案:-) clientConfiguration.setSignerOverride(“S3SignerType”) - Ruslan