如何在当前日期的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
响应重定向浏览器。
- S3 Java客户端因“Content-Length delimited message body的过早结束”或“java.net.SocketException Socket closed”而失败了很多
- Amazon Web Services(AWS)S3 Java创建子目录(对象)
- AWS S3无需访问和密钥在Java中上载
- 在Java SDK Amazon S3中配置路径样式
- Maven可以从私有s3存储桶中引用父POM吗?
- 使用Java进行AWS S3文件搜索
- 解压缩HTTPInputStream时GZIPInputStream过早关闭
- 使用进度回调将文件或InputStream上载到S3
- 如何从用Java编写的AWS Lambda函数中读取S3文件?