使用预签名 URL 下载和上传对象 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用预签名 URL 下载和上传对象

您可以使用预签名 URL 授予对 Amazon S3 中对象的限时访问权限,而不更新存储桶策略。可以在浏览器中输入预签名 URL,或者程序使用预签名 URL 来下载对象。预签名 URL 使用的凭证是生成该 URL 的 Amazon Identity and Access Management(IAM)主体的凭证。

还可以使用预签名 URL 来允许他人将特定对象上传到您的 Amazon S3 存储桶。这允许在不要求另一方拥有 Amazon 安全凭证或权限的情况下进行上传。如果具有相同键的对象已存在于在预签名 URL 中指定的存储桶中,则 Amazon S3 将现有对象替换为上传的对象。

在到期日期和时间之前,可以多次使用预签名 URL。

创建预签名 URL 时,必须提供您的安全凭证,然后指定以下内容:

  • 一个 Amazon S3 存储桶

  • 对象键(如果将在您的 Amazon S3 存储桶中下载此对象,则一旦上传,这就是要上传的文件名)

  • HTTP 方法(GET 用于下载对象、PUT 用于上传、HEAD 用于读取对象元数据等)

  • 过期时间间隔

使用预签名 URL 上传对象时,您可以使用校验和来验证对象完整性。尽管使用 Amazon 签名版本 2 创建的预签名 URL 仅支持 MD5 校验和,但使用 Amazon 签名版本 4 创建的预签名 URL 支持其它校验和算法,包括 CRC-64/NVME、CRC32、CRC32C、SHA-1 和 SHA-256。要使用这些其它校验和算法,请确保您使用的是 Amazon 签名版本 4,并在上传请求中包含相应的校验和标头。有关对象完整性的更多信息,请参阅在 Amazon S3 中检查对象完整性

谁可以创建预签名 URL

具有有效安全凭证的任何人都可以创建预签名 URL。但对于成功地访问对象的人来说,必须由拥有执行预签名 URL 所基于的操作权限的人创建预签名 URL。

以下各个类型的凭证可用于创建预签名 URL:

  • IAM 用户 – 使用 Amazon 签名版本 4 时,有效期最长 7 天。

    要创建有效期最长为 7 天的预签名 URL,请首先将 IAM 用户凭证(访问密钥和私有密钥)委托给用于创建预签名 URL 的方法。

  • 临时安全凭证:有效期不能超过凭证本身。这些凭证包括:

    • IAM 角色凭证:当角色会话到期时,预签名 URL 也会到期,即使您指定更长的到期时间也是如此。

    • Amazon EC2 实例使用的 IAM 角色凭证:在角色凭证的有效期内有效(通常为 6 小时)。

    • Amazon Security Token Service 凭证:仅在临时凭证的有效期内有效。

注意

如果您使用临时凭证创建了预签名 URL,则此 URL 将在凭证过期时过期。通常,当您用于创建预签名 URL 的凭证被撤销、删除或停用时,预签名 URL 就会到期。即使创建的 URL 的过期时间更晚,也是如此。有关临时安全凭证生命周期,请参阅《IAM 用户指南》中的比较 Amazon STS API 操作

预签名 URL 的到期时间

预签名 URL 在生成 URL 时指定的时间段内保持有效。如果使用 Amazon S3 控制台创建预签名 URL,过期时间可设置为 1 分钟到 12 小时之间。如果您使用 Amazon CLI 或 Amazon SDK,则过期时间可设置为多达 7 天。

如果您使用临时令牌创建了预签名 URL,则此 URL 将在该令牌到期时到期。通常,当您用于创建预签名 URL 的凭证被撤销、删除或停用时,预签名 URL 就会到期。即使创建的 URL 的过期时间更晚,也是如此。有关您使用的凭证如何影响到期时间的更多信息,请参阅谁可以创建预签名 URL

在发出 HTTP 请求时,Simple Storage Service (Amazon S3) 会检查签名 URL 的到期日期和时间。例如,如果客户端刚好在到期时间之前开始下载某个大型文件,即使在下载过程中超过到期时间,下载也会继续进行。但如果连接断开,在客户端试图在超过到期时间后重新开始下载,则下载将会失败。

限制预签名 URL 功能

预签名 URL 的功能受创建它的用户的权限所限制。预签名 URL 实质上是一种不记名令牌,向持有相关 URL 的人授予了访问权限。因此,我们建议您适当地保护它们。以下是一些可用来限制使用预签名 URL 的方法。

Amazon 签名版本 4(SigV4)

使用 Amazon 签名版本 4(SigV4)对预签名 URL 请求进行身份认证时要强制执行特定的行为,您可以在存储桶策略和接入点策略中使用条件键。例如,以下存储桶策略使用 s3:signatureAge 条件,当相关签名的存在时间超过 10 分钟时,将拒绝对于 amzn-s3-demo-bucket 存储桶中对象的任何 Amazon S3 预签名 URL 请求。要使用此示例,请将 user input placeholders 替换为您自己的信息。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "Deny a presigned URL request if the signature is more than 10 min old", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": "s3:*", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Condition": { "NumericGreaterThan": { "s3:signatureAge": "600000" } } } ] }

有关策略键相关的 Amazon 签名版本 4 的更多信息,请参阅《Amazon Simple Storage Service API 参考》中的 Amazon 签名版本 4 身份认证

网络路径限制

如果您想限制使用预签名 URL 和 Amazon S3 对特定网络路径的所有访问权限,则可以编写 Amazon Identity and Access Management(IAM)策略。您可以在进行调用的 IAM 主体、Amazon S3 存储桶或两者上设置这些策略。

对 IAM 主体实施网络路径限制后,要求拥有这些凭证的用户从指定的网络发出请求。对存储桶或接入点实施限制后,要求对该资源的所有请求都必须来自指定的网络。这些限制也适用于预签名 URL 以外的场景。

您使用的 IAM 全局条件键取决于端点的类型。如果您正在对 Amazon S3 使用公有端点,请使用 aws:SourceIp。如果您正在使用虚拟私有云(VPC)端点访问 Amazon S3 存储桶,请使用 aws:SourceVpcaws:SourceVpce

以下 IAM 策略语句要求主体仅从指定的网络范围访问。Amazon使用此策略语句时,所有访问都必须来自该范围。这包括有人对于 Amazon S3 使用预签名 URL 的情况。要使用此示例,请将 user input placeholders 替换为您自己的信息。

{ "Sid": "NetworkRestrictionForIAMPrincipal", "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "NotIpAddressIfExists": {"aws:SourceIp": "IP-address-range"}, "BoolIfExists": {"aws:ViaAWSService": "false"} } }

预签名 URL 的常见问题

问:为什么我的预签名 URL 的到期时间早于配置的到期时间?

预签名 URL 只有在其基础凭证有效时才保持有效。预签名 URL 在其配置的到期时间或其关联凭证到期时(以先发生者为准)到期。对于 Amazon Elastic Container Service 任务或容器,角色凭证通常每 1-6 小时轮换一次。使用 Amazon Security Token Service(Amazon STS)AssumeRole 时,预签名 URL 将在角色会话结束时到期,默认为 1 小时。对于 Amazon EC2 实例配置文件,元数据凭证会定期轮换,最长有效期约为 6 小时。

问:当我访问预签名 URL 时,为何收到 403 Forbidden 错误?

在生成预签名 URL 之前,请验证您配置了正确的权限。生成 URL 的 IAM 用户或角色必须具有执行特定操作所需的权限,例如 s3:GetObject。此外,请检查 Amazon S3 存储桶策略是否未显式拒绝访问该对象。

问:我遇到了 SignatureDoesNotMatch 错误。如果修复此问题?

如果您在使用 Amazon S3 预签名 URL 时遇到 SignatureDoesNotMatch 错误,请考虑几个常见原因。首先,请确保系统时钟与网络时间协议(NTP)服务器同步,因为即使是很小的时间偏差也会使签名失效。接下来,请注意,某些公司代理可能会修改标头或查询字符串,从而可能导致签名不匹配。要排除故障,请尝试在没有代理的情况下进行测试。最后,验证所有请求参数(包括 HTTP 方法、标头和查询字符串)在 URL 生成和使用之间是否完全匹配。解决这些问题通常可以解决 SignatureDoesNotMatch 错误。

问:我遇到了 ExpiredToken 错误。我应该怎么办?

如果您在使用预签名 URL 时收到 ExpiredToken 错误,这表示用于生成 URL 的 Amazon 凭证不再有效。要解决此问题,请先刷新您的 Amazon 凭证,然后生成新的预签名 URL。对于长时间运行的应用程序,我们建议实施凭证刷新逻辑以保持持续访问。在适当情况下,您可以使用寿命更长的凭证或实施令牌刷新机制。如果您使用的是 Amazon Security Token Service(Amazon STS)AssumeRole,请验证配置的会话持续时间是否符合使用案例要求。请记住,预签名 URL 仅在其基础凭证的有效期内有效,因此实施适当的凭证管理至关重要。