【发布时间】:2016-04-01 17:29:22
【问题描述】:
使用 Java8 和 aws-java-sdk 1.10.43 我正在尝试获取 S3 文件的预签名 URL。我确实得到了一个链接,但浏览它会导致这个错误:
您提供的授权机制不受支持。请用 AWS4-HMAC-SHA256
强调一下,我希望生成一个可以通过电子邮件发送并在浏览器中打开的 URL,而不是使用 Java 代码读取该 URL。
我正在使用下面的代码,并且我相信我需要以某种方式将 setSSEAlgorithm 设置为使用“v4”,但是我未能使其工作。我错过了什么?我应该配置什么(注意:我故意避开配置文件,我希望代码从环境变量中设置所有属性)
Date expiration = <some date>;
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, targetPath);
generatePresignedUrlRequest.setMethod(HttpMethod.GET);
generatePresignedUrlRequest.setExpiration(expiration);
AmazonS3 s3client = new AmazonS3Client(s3Credentials);
URL s = s3client.generatePresignedUrl(generatePresignedUrlRequest);
存储桶位于 eu-central-1
谢谢
【问题讨论】:
-
那里提出的解决方案没有帮助 - 将属性设置为仍然生成相同的结果。澄清:我能够生成一个看起来像预签名 URL 的 URL,但是将该 URL 粘贴到浏览器中会导致错误消息。我没有尝试使用我的 Java 代码阅读内容,但我希望生成一个 URL 以粘贴到浏览器中(例如通过电子邮件发送)
-
生成预签名 URL 是在不与实际 S3 服务交互的情况下完成的,因此您的代码“工作”到那一点是有意义的,并且在使用 URL 时会发生错误。您生成的签名 URL 是否包含
Signature=?... 还是x-amz-signature=? -
签名=
。这是我收到的 URL 示例:https:// ?AWSAccessKeyId= &Expires=1451297351&Signature=1kD1IQfn2gfmJ%2Fa2Wp2ZORVte0Y%3D -
这绝对是 Signature Version 2 URL,因此您的代码未启用 V4 签名,如链接问题中所示,一种可能的解释是您的 SDK 版本太旧而无法支持它。
-
设置 SDK 属性和端点对我有帮助。我通过在 s3client 中添加配置属性来解决它。例如:新 AmazonS3Client(new ClientConfiguration().withSignerOverride("AWSS3V4SignerType"))
标签: java amazon-s3 authorization aws-java-sdk