

# 使用预签名 URL 下载和上传对象
<a name="using-presigned-url"></a>

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

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

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

创建预签名 URL 时，必须提供您的安全凭证，然后指定以下内容：
+ 一个 Amazon S3 存储桶
+ 对象键（如果将在您的 Amazon S3 存储桶中下载此对象，则一旦上传，这就是要上传的文件名）
+ HTTP 方法（`GET` 用于下载对象、`PUT` 用于上传、`HEAD` 用于读取对象元数据等）
+ 过期时间间隔

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

**Topics**
+ [谁可以创建预签名 URL](#who-presigned-url)
+ [预签名 URL 的到期时间](#PresignedUrl-Expiration)
+ [限制预签名 URL 功能](#PresignedUrlUploadObject-LimitCapabilities)
+ [预签名 URL 的常见问题](#PresignedUrlFAQ)
+ [使用预签名 URL 共享对象](ShareObjectPreSignedURL.md)
+ [使用预签名 URL 上传对象](PresignedUrlUploadObject.md)

## 谁可以创建预签名 URL
<a name="who-presigned-url"></a>

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

以下各个类型的凭证可用于创建预签名 URL：
+ **IAM 用户** – 使用 AWS 签名版本 4 时，有效期最长 7 天。

  要创建有效期最长为 7 天的预签名 URL，请首先将 IAM 用户凭证（访问密钥和私有密钥）委托给用于创建预签名 URL 的方法。
+ **临时安全凭证**：有效期不能超过凭证本身。这些凭证包括：
  + **IAM 角色凭证**：当角色会话到期时，预签名 URL 也会到期，即使您指定更长的到期时间也是如此。
  + **Amazon EC2 实例使用的 IAM 角色凭证**：在角色凭证的有效期内有效（通常为 6 小时）。
  + **AWS Security Token Service 凭证**：仅在临时凭证的有效期内有效。

**注意**  
如果您使用临时凭证创建了预签名 URL，则此 URL 将在凭证过期时过期。通常，当您用于创建预签名 URL 的凭证被撤销、删除或停用时，预签名 URL 就会到期。即使创建的 URL 的过期时间更晚，也是如此。有关临时安全凭证生命周期，请参阅《IAM 用户指南》**中的[比较 AWS STS API 操作](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison)。

## 预签名 URL 的到期时间
<a name="PresignedUrl-Expiration"></a>

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

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

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

## 限制预签名 URL 功能
<a name="PresignedUrlUploadObject-LimitCapabilities"></a>

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

**AWS 签名版本 4（SigV4）**  
使用 AWS 签名版本 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"
                }
            }
        }
    ]
}
```

------

有关策略键相关的 AWS 签名版本 4 的更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [AWS 签名版本 4 身份认证](https://docs.aws.amazon.com/AmazonS3/latest/API/bucket-policy-s3-sigv4-conditions.html)。

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

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

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

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

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

## 预签名 URL 的常见问题
<a name="PresignedUrlFAQ"></a>

**问：为什么我的预签名 URL 的到期时间早于配置的到期时间？**  
预签名 URL 只有在其基础凭证有效时才保持有效。预签名 URL 在其配置的到期时间或其关联凭证到期时（以先发生者为准）到期。对于 Amazon Elastic Container Service 任务或容器，角色凭证通常每 1-6 小时轮换一次。使用 AWS Security Token Service（AWS 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 的 AWS 凭证不再有效。要解决此问题，请先刷新您的 AWS 凭证，然后生成新的预签名 URL。对于长时间运行的应用程序，我们建议实施凭证刷新逻辑以保持持续访问。在适当情况下，您可以使用寿命更长的凭证或实施令牌刷新机制。如果您使用的是 AWS Security Token Service（AWS STS）AssumeRole，请验证配置的会话持续时间是否符合使用案例要求。请记住，预签名 URL 仅在其基础凭证的有效期内有效，因此实施适当的凭证管理至关重要。