【问题标题】:How to get signed urls in java?如何在java中获取签名的url?
【发布时间】:2025-12-18 03:10:01
【问题描述】:

嗨,我是 amazon s3 和 cloudfront 的新手。我有任务将对象上传到我的存储桶并将云端 URL 发送到电子邮件。到目前为止,我已经成功完成了部分的上传和下载。对于下载,我的 url 看起来像“//cloudfront-domain/object-name”。我希望它看起来有点复杂。我已经通过文档,它说我可以添加日期到期,它还将 base64 json 策略,并且两者都将在 url 中可用。 因此,当我通过 java 应用程序上传对象时,我想为其设置策略并获取签名的 url。 如果您有示例代码,请分享。 谢谢。

【问题讨论】:

  • 我建议你看看jets3t。

标签: java amazon-web-services amazon-s3 amazon-cloudfront


【解决方案1】:

所以当我上传对象时

有些人对此有误解...该服务不提供签名 URL。您不会“因为”上传对象而得到它们。签名 URL 由您的代码生成,在生成签名 URL 时不与服务交互。

您通常会在呈现将出现签名 URL 的页面的同时生成签名 URL,而不仅仅是一次,例如在您上传对象时。后者是可能的,但签名 URL 的生命周期是有限的,并且在您轮换签名密钥时会变得无效。

这是签名 URL 背后的理论。

浏览器发出请求。该服务检查策略文档以验证请求的参数是否实际匹配策略允许的参数,然后根据策略文档验证签名,以查看它是否被授权遵守策略。对于给定的策略文档,只有一个可能的正确签名,因此服务生成应该伴随请求的签名,以查看它是否匹配。如果是,则允许该操作。由于篡改策略会改变正确的签名,所以签名的 URL 不能被篡改。

documentation 解释了签名 URL 的工作原理,并提供了如何生成它们的示例。如果需要,您实际上可以为此编写自己的代码,因为整个签名过程都已记录在案。

请注意,如果您使用//dxxxexample.cloudfront.net/... 形式的链接而不是https://dxxxexample.cloudfront.net/...,那么您需要生成签名的URL 以期望http*://dxxxexample... 而不是http://...https://...,否则,相同签名 URL 对 HTTP 和 HTTPS 都无效。

【讨论】:

  • 嗨。感谢您的洞察力。实际上我已经通过生成签名的 url 过程。它仍然有点难以消化。但我会尽快通过。因此,当我们以这种方式为 json 格式的对象分配策略时,
  • { "Statement": [ { "Resource":"URL or stream name of the object", "Condition":{ "DateLessThan":{"AWS:EpochTime":required 结束日期和时间Unix时间格式和UTC}, "DateGreaterThan":{"AWS:EpochTime":Unix时间格式和UTC的可选开始日期和时间}, "IpAddress":{"AWS:SourceIp":"可选IP地址"} } } ] }
  • 上传前是否需要创建这样的json格式并附上对象?和相同的 json 为 url?
  • 没有。这些不为 object 建立策略。该策略适用于生成的 URL 的实际使用 本身。您可以为一个对象生成基本上无限数量的具有不同策略的不同签名 URL。如果您在 Resource 中使用通配符,也可以为多个对象创建单个 URL,因为 CloudFront 签名 URL 支持通配符(与 S3 签名 URL 不同,后者只能应用于单个对象)。
  • 嘿,你有任何关于它的演示编码吗?这将非常有帮助。