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

时间:2015-10-08 06:34:54

标签: java amazon-web-services amazon-s3

将图像上传到Amazon S3存储桶。我需要从亚马逊服务器获取预先签名的网址。我还想设置该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 个答案:

答案 0 :(得分:15)

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

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

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

  

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

     

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回复。