【问题标题】:How to change the format of S3Client.getURL如何更改 S3Client.getURL 的格式
【发布时间】:2017-12-30 08:41:02
【问题描述】:

我在我的 Spring Boot 应用程序中使用 AWS Java SDK。 目前,当我想返回我使用的 s3 对象的 URL 时:

s3Client.putObject(new PutObjectRequest(S3_BUCKET_NAME, key,fileToUpload));
URL signedUrl = s3Client.getUrl(S3_BUCKET_NAME, key);

signedUrl 看起来像这样:

https://<my_bucket_name>.s3.eu-central-1.amazonaws.com/<my_key>

问题是这个 URL 无效(它在连接过程中返回 HTTPS 错误)。现在,我无法配置我的自定义域并通过 CloudFront 配置解决问题。

所以我的想法是在 SDK 上强制使用不同的格式。像这样的:

https://s3.eu-central-1.amazonaws.com/<my_bucket_name>/<my_key>

有人能指出正确的方向吗?

PS: 我知道,我可以对 URL 进行简单的替换,但这不是一个优雅的解决方案。

【问题讨论】:

  • 您收到的 HTTPS 错误是什么?为什么您认为不同的 URL 格式可以缓解 HTTPS 问题?
  • 它大喊“错误代码:SSL_ERROR_BAD_CERT_DOMAIN”。 my_bucket_name.s3.eu-central-1.amazonaws.com 使用了无效的安全证书。使用 ttps://s3.eu-central-1.amazonaws.com 我可以缓解这个问题。
  • 您是否尝试在 Firefox 中访问此 URL?您是否尝试过 Chrome 中的网址?好像firefox有一个bugsupport.mozilla.org/en-US/questions/1049026
  • Chrome 报告同样的 https 错误。 coursera_assets_example 在两种浏览器中都能正常工作,这很奇怪。看来是我的存储桶配置导致了问题。
  • @Anuruddha - 检查我的答案,这是我的愚蠢错误。因此,感谢您的谈话,它帮助我解决了这个问题。

标签: java amazon-web-services spring-boot aws-java-sdk


【解决方案1】:

好的,问题出在存储桶名称上。存储桶名称中的点字符引起了所有麻烦。

foo-bar-com 作为存储桶名称按预期工作。 foo.bar.cam.s3。存储桶名称导致 https 异常。

【讨论】:

  • https://bucket.s3.region.amazonaws.com/key 形式的 S3 URL 称为 虚拟式访问,而 https://s3.region.amazonaws.com/bucket/key 称为 路径式访问。由于通配符 SSL 证书验证的工作方式,后者支持存储桶名称中的点,而前者不支持。我不是 Java 开发人员,但请参阅 isPathStyleAccess 了解我认为可能是您的替代解决方案。
  • 多年来,Java SDK 的首选方法似乎也经历了多次迭代,c.f. stackoverflow.com/a/24012996/1695906.
  • 还要注意,将 URL 从一种样式重新格式化为另一种样式的字符串替换仅适用于 Signature V2,因为那里的签名算法在其输入中使用实际的存储桶名称;相比之下,Signature V4 使用 URL 中的整个主机名作为签名算法的输入,因此 URL 中的字符串替换 - 这必然会更改主机名 - 也会使签名无效......所以,你没有这样做可能很好不要走这条路。两者之间的一个显着视觉差异是 Sig V2 URL 包含 AWSAccessKeyId 而 Sig V4 URL 包含 X-Amz-Credential
猜你喜欢
  • 2023-03-26
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
相关资源
最近更新 更多