由于授权,无法访问 S3 预签名 URL [重复]
Posted
技术标签:
【中文标题】由于授权,无法访问 S3 预签名 URL [重复]【英文标题】:Can't access S3 Pre-Signed URL due to authorization [duplicate] 【发布时间】: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=
?
签名=借助一些帮助,我找到了答案,它是 2 个缺失部分的组合(其中一个在 cmets 中被提及):
需要设置这个:
System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true");
必须设置“endPoint”(上传或下载不需要):
s3Client.setEndpoint(endpoint);
也可以选择添加以下内容:
s3Client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));
【讨论】:
这行得通...我只执行了2
点。
endpoint 的值是多少? @Tirath以上是关于由于授权,无法访问 S3 预签名 URL [重复]的主要内容,如果未能解决你的问题,请参考以下文章