

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用預先簽章的 URL 來下載和上傳物件
<a name="using-presigned-url"></a>

若要授予對 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 Signature 第 2 版建立的URLs 僅支援 MD5 檢查總和，但使用 AWS Signature 第 4 版建立的預先簽章 URLs 支援其他檢查總和演算法，包括 CRC-64/NVME、CRC32、CRC32C、 SHA-1和 SHA-256。若要使用這些額外的檢查總和演算法，請確定您使用 AWS 的是 Signature 第 4 版，並在上傳請求中包含適當的檢查總和標頭。如需有關物件完整性的詳細資訊，請參閱 [在 Amazon S3 中檢查物件完整性](checking-object-integrity.md)。

**Topics**
+ [誰可以建立預先簽章的 URL](#who-presigned-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 Signature 第 4 版時，有效期最長為 7 天。

  若要建立有效期限最長 7 天的預先簽章 URL，請先將 IAM 使用者憑證 (存取金鑰和私密金鑰) 委派給您用於建立預先簽章 URL 的方法。
+ **暫時安全登入資料** – 有效期不能超過憑證本身。這些憑證包括：
  + **IAM 角色憑證** – 預先簽章的 URL 會在角色工作階段過期時間到期，即使您指定較長的過期時間。
  + **Amazon EC2 執行個體使用的 IAM 角色憑證** – 在角色憑證期間有效 (通常為 6 小時)。
  + **AWS Security Token Service 登入**資料 – 僅在臨時登入資料期間有效。

**注意**  
如果使用暫時憑證建立了預先簽章的 URL，則 URL 會在憑證過期時過期。一般而言，預先簽章的 URL 會在您用來建立它的憑證遭到撤銷、刪除或停用時過期。即使 URL 是以較晚的到期時間建立也一樣。如需暫時性安全登入資料生命週期，請參閱《*IAM 使用者指南*》中的[比較 AWS STS API 操作](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison)。

## 預先簽章網址的到期時間
<a name="PresignedUrl-Expiration"></a>

預先簽章的 URL 在產生 URL 時指定的期間內會保持有效。如果您使用 Amazon S3 主控台建立預先簽章的 URL，到期時間可以設定在 1 分鐘到 12 小時之間。如果您使用 AWS CLI AWS SDKs，過期時間最多可設定為 7 天。

如果您使用臨時權杖建立了預先簽章的 URL，則 URL 會在權杖過期時過期。一般而言，預先簽章的 URL 會在您用來建立它的憑證遭到撤銷、刪除或停用時過期。即使 URL 是以較晚的到期時間建立也一樣。如需有關您使用的認證如何影響到期時間的詳細資訊，請參閱 [誰可以建立預先簽章的 URL](#who-presigned-url)。

Amazon S3 會在 HTTP 請求時，檢查已簽署的 URL 中的過期日期和時間。例如，如果用戶端在到期前一刻才開始下載大型檔案，則即使在下載期間過期了，下載也會繼續。然而，如果連線中斷並且用戶端在到期時間過後嘗試重新啟動下載，則下載會失敗。

## 限制預先簽章的 URL 功能
<a name="PresignedUrlUploadObject-LimitCapabilities"></a>

預先簽章的 URL 的功能，受到建立它的使用者許可所限制。實質上，預先簽章的 URL 是一種承載符記，可為擁有這些網址的客戶授與存取權。因此，我們建議您妥善保護它們。以下幾種方法可供您用來限制預先簽章的 URL 使用。

**AWS Signature 第 4 版 (SigV4)**  
若要在使用 AWS 第 4 版簽署程序 (SigV4) 驗證預先簽章 URL 請求時強制執行特定行為，您可以在儲存貯體政策和存取點政策中使用條件金鑰。例如，下列儲存貯體政策，使用 `s3:signatureAge` 條件來拒絕任何 *amzn-s3-demo-bucket* 儲存貯體中物件上的 Amazon S3 預先簽章 URL 請求 (如果簽章超過 10 分鐘)。若要使用此範例，請以您自己的資訊取代 *`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 Signature 第 4 版相關的政策金鑰詳細資訊，請參閱[AWS 《Amazon Simple Storage Service API 參考》中的 Signature 第 4 版身分驗證](https://docs.aws.amazon.com/AmazonS3/latest/API/bucket-policy-s3-sigv4-conditions.html)。 **

**網路路徑限制**  
如果您想要限制使用預先簽章URLs 和所有 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` 錯誤。我該怎麼辦？**  
當您使用預先簽章URLs 時收到`ExpiredToken`錯誤，表示用於產生 URL 的 AWS 登入資料不再有效。若要解決此問題，請在產生新的預先簽章 URLs 之前重新整理您的 AWS 登入資料。對於長時間執行的應用程式，建議您實作憑證重新整理邏輯，以維持連續存取。在適當情況下，您可以使用有效期限較長的憑證，或實作字符重新整理機制。如果您使用的是 AWS Security Token Service (AWS STS) AssumeRole，請確認您設定的工作階段持續時間符合您的使用案例需求。請記住，預先簽章的 URL 只會在其基礎憑證期間保持有效，因此實作適當的憑證管理至關重要。