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

图像上传到Amazon S3存储桶。 我需要从Amazon服务器获取预签名的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(); 

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

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

如果您的签名确实是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响应重定向浏览器。