【问题标题】:Can't access S3 Pre-Signed URL due to authorization [duplicate]由于授权,无法访问 S3 预签名 URL [重复]
【发布时间】: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


【解决方案1】:

借助一些帮助,我找到了答案,它是 2 个缺失部分的组合(其中一个在 cmets 中被提及):

  1. 需要设置这个:

    System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true");
    
  2. 必须设置“endPoint”(上传或下载不需要):

    s3Client.setEndpoint(endpoint);
    

也可以选择添加以下内容:

s3Client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));

【讨论】:

  • 这行得通...我只执行了2 点。
  • endpoint 的值是多少? @Tirath
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多