如何将 Amazon S3 存储桶预签名 URL 过期时间设置为自当前日期起 1 年内

2022-09-04 19:50:59

图像将上传到 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();

答案 1

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

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

如果你的签名确实是 V4,那么你看到的是一个有意的限制:

预签名 URL 的有效期最长为 7 天,因为在签名计算中使用的签名密钥的有效期最长为 7 天。

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


答案 2

推荐