簽名是驗證傳送至 Cloud Storage XML API 的請求的一種方法。例如,使用已簽署網址或 HTML 表單時,就會使用簽名。本頁面適用於使用 V4 簽署程序建立的簽章,這是建立簽章的建議程序。
簽章專屬於 Cloud Storage XML API,與 OAuth 2.0 權杖不同;OAuth 2.0 權杖也可與 XML API 搭配使用,且更廣泛地適用於各項 Google Cloud 服務,包括 Cloud Storage JSON API。
總覽
「簽名」可鑑別身分並提供強大的驗證機制,確保 Cloud Storage 要求會使用特定帳戶的權限進行處理。簽名可達成這類驗證,且不會揭露與該帳戶相關聯的敏感金鑰資訊 (稱為「密鑰」或「私密金鑰」)。
當您提出含有簽名的請求時,Cloud Storage 會使用金鑰資訊的副本,為要求計算等效的簽名。如果要求中包含的簽名與 Cloud Storage 計算的簽名相符,Cloud Storage 就會知道簽名是使用相關的密鑰或私密金鑰建立。
在 Cloud Storage 中,如要使用下列項目,就必須使用簽章:
此外,簽名也可用於 XML API 要求的 Authorization
標頭。
在執行從 Amazon S3 簡易遷移時,在直接要求中使用簽章很實用;不過,建議您使用 OAuth 2.0 權杖,以便驗證直接要求。
結構
建立簽章的元件和程序取決於您要使用簽章的用途,以及您使用的驗證金鑰。一般來說,簽章有兩個元件:簽署金鑰和要求資訊。您可以將簽署演算法套用至這兩個元件,以建立簽章。下表簡要說明簽章的不同用途,以及在每個用途中建構簽章所需的元件:
用途 | 簽署金鑰 | 索取資訊 |
---|---|---|
含有 RSA 金鑰的 HTML 表單 | 直接使用 RSA 私密金鑰 | Base64 編碼政策文件 |
含有 HMAC 金鑰的 HTML 表單 | 從 HMAC 金鑰的密鑰衍生 | Base64 編碼政策文件 |
使用 RSA 金鑰簽署的網址或標頭 | 直接使用 RSA 私密金鑰 | 要簽署的字串 |
使用 HMAC 金鑰的已簽署網址或已簽署標頭 | 從 HMAC 金鑰的密鑰衍生 | 要簽署的字串 |
字串至簽名
欲簽署字串包含要求的相關資訊,以及您要簽署的標準化要求雜湊。
結構
欲簽署字串必須採用 UTF-8 編碼,且具備下列結構,包括在各個元素之間使用新行:
SIGNING_ALGORITHM ACTIVE_DATETIME CREDENTIAL_SCOPE HASHED_CANONICAL_REQUEST
簽署演算法
您為 SIGNING_ALGORITHM 使用的值取決於您使用的鍵類型,以及用於標頭或查詢參數的擴充功能:
用途 | 「SIGNING_ALGORITHM」的值 |
---|---|
x-goog-* 擴充功能和 RSA 金鑰 |
GOOG4-RSA-SHA256 |
x-goog-* 擴充功能和 HMAC 金鑰 |
GOOG4-HMAC-SHA256 |
x-amz-* 擴充功能和 HMAC 金鑰 |
AWS4-HMAC-SHA256 |
有效時間
可使用簽章的日期和時間,採用 ISO 8601 基本格式 YYYYMMDD'T'HHMMSS'Z'
。
對於已簽署的網址,簽章可在有效日期/時間前 15 分鐘至您指定的到期時間之間使用。有效日期/時間必須與已簽署網址的
X-Goog-Date
查詢字串參數相符,且必須使用您在憑證範圍中指定的日期。如果是含有已簽署標頭的要求,簽章可在有效時間前 15 分鐘至有效時間後 15 分鐘之間使用。使用中時間戳記必須與使用簽章的
x-goog-date
要求標頭相符,且使用中時間戳記必須使用您在憑證範圍中指定的日期。
憑證範圍
要求的憑證範圍。
標準化要求的雜湊
標準要求的十六進位編碼 SHA-256 雜湊。使用 SHA-256 雜湊函式建立標準化要求的雜湊值。您的程式設計語言應擁有用來建立 SHA-256 雜湊的程式庫。雜湊值範例如下:
436b7ce722d03b17d3f790255dd57904f7ed61c02ac5127a0ca8063877e4e42c
範例
以下是格式正確的簽署字串範例,其中新行會顯示為實際的新行,而不是 \n
:
GOOG4-RSA-SHA256 20191201T190859Z 20191201/us-central1/storage/goog4_request 54f3076005db23fbecdb409d25c0ccb9fb8b5e24c59f12634654c0be13459af0
政策文件
政策文件會定義哪些使用者可存取相應的 HTML 表單,並將內容上傳至 Cloud Storage。政策文件會提供授權,確保 HTML 表單可以將檔案上傳至目標儲存桶。您可以使用政策文件,允許網站訪客將檔案上傳至 Cloud Storage。
政策文件會以 JavaScript 物件標記法 (JSON) 建構。政策文件必須同時採用 UTF-8 和 Base64 編碼。政策文件包含以下章節:
項目 | 說明 |
---|---|
expiration |
政策文件的到期時間,採用 ISO 8601 基本格式 YYYYMMDD'T'HHMMSS'Z' 。政策文件過期會導致 HTML 表單中斷。 |
conditions |
每個上傳項目都必須符合的一系列條件。 |
conditions
部分必須包含:
針對 HTML 表單中使用的每個欄位設定條件陳述式,但
x-goog-signature
、file
和policy
欄位除外。"bucket"
條件陳述式,即使您未在 HTML 表單中使用桶層欄位也一樣。
如果您想針對同一個欄位使用多個條件陳述式,請為每個欄位建立個別的 HTML 表單。在條件陳述式中,您可以使用三種類型的條件:
完全比對
針對欄位執行精確比對,HTML 表單中指定欄位使用的值必須與此條件中設定的值相符。請使用下列任一語法樣式設定此條件:
{"field" : "value"}
["eq", "$field", "value"]
除了
Content-Length
以外,所有有效的 HTML 表單欄位都可以使用完全比對。開頭為
如果欄位值的開頭必須是特定前置字串,請使用
starts-with
限制條件,並搭配以下語法:["starts-with", "$field", "value"]
如果欄位的值沒有任何限制,請使用
starts-with
條件,並搭配下列語法:["starts-with", "$field", ""]
除了
Content-Length
之外,所有有效的 HTML 表單欄位都可以使用starts-with
條件。內容長度範圍
指定可在
Content-Length
欄位中使用的可接受值範圍。請使用下列語法指定此條件:["content-length-range", min_range, max_range]
範例
以下是政策文件範例:
{"expiration": "2020-06-16T11:11:11Z", "conditions": [ ["starts-with", "$key", ""], {"bucket": "travel-maps"}, {"success_action_redirect": "http://www.example.com/success_notification.html"}, ["eq", "$Content-Type", "image/jpeg"], ["content-length-range", 0, 1000000], {"x-goog-algorithm": "GOOG4-RSA-SHA256"}, {"x-goog-credential": "example_account@example_project.iam.gserviceaccount.com/20191102/us-central1/storage/goog4_request"}, {"x-goog-date": "20191102T043530Z"} ] }
這份政策文件定義了下列條件:
- 表單將於 2020 年 6 月 16 日世界標準時間 11 點 11 分 11 秒到期。
- 檔案名稱的開頭可以是任何有效字元。
- 檔案必須上傳至值區
travel-maps
。 - 如果上傳成功,系統會將使用者重新導向至
http://www.example.com/success_notification.html
。 - 該表單僅允許上傳圖片。
- 使用者無法上傳大於 1 MB 的檔案。
憑證範圍
憑證範圍是字串,會同時出現在要簽署的字串和政策文件中。憑證範圍的結構如下:
DATE/LOCATION/SERVICE/REQUEST_TYPE
憑證範圍包含下列元件:
- DATE:簽章可供使用的日期,格式為 YYYYMMDD。
- LOCATION:如果是 Cloud Storage 資源,您可以為 LOCATION 使用任何值。建議使用的值是與簽名套用資源相關聯的位置。例如:
us-central1
。這個參數的存在是為了保持與 Amazon S3 的相容性。 - SERVICE:服務名稱。在大多數情況下,存取 Cloud Storage 資源時,這個值會是
storage
。使用 Amazon S3x-amz
擴充功能時,這個值為s3
。 - REQUEST_TYPE:要求類型。在大多數情況下,存取 Cloud Storage 資源時,這個值會是
goog4_request
。使用 Amazon S3x-amz
擴充功能時,這個值為aws4_request
。
舉例來說,典型的憑證範圍如下所示:
20191102/us-central1/storage/goog4_request
使用字串簽署功能搭配 x-amz
擴充功能時,憑證範圍如下所示:
20150830/us-east1/s3/aws4_request
簽署
如要建立簽名,您必須使用簽署演算法 (也稱為加密編譯雜湊函式),為要簽署的字串或政策文件簽署。簽署演算法會產生訊息摘要,必須以十六進位編碼才能建立最終簽章。您使用的簽署演算法取決於您擁有的驗證金鑰類型:
驗證金鑰 | 簽署演算法 | 簽署金鑰 |
---|---|---|
RSA 金鑰 | RSA-SHA256 | 直接使用 RSA 私密金鑰 |
HMAC 金鑰 | HMAC-SHA256 | 從 HMAC 金鑰的密鑰衍生 |
您可以使用 IAM signBlob
方法執行 RSA-SHA256 簽署演算法。例如 gcloud CLI 和多數 Google Cloud 用戶端程式庫等工具,可讓您使用 signBlob
方法建立已簽署的網址。
您也可以使用具備執行 RSA 簽名的程式庫 (例如 pyopenssl 程式庫) 的程式設計語言,在本機建立 RSA 金鑰簽名;不過,不建議使用這種方法,因為您必須建立及下載服務帳戶的私密金鑰。
從 HMAC 金鑰衍生簽署金鑰
使用 HMAC 金鑰簽署時,您必須建立 UTF-8 編碼的簽署金鑰,該金鑰必須衍生自 HMAC 金鑰密鑰。衍生金鑰專屬於與您要求相關聯的日期、地點、服務和要求類型。下列虛擬程式碼說明如何擷取簽署金鑰:
key_date = HMAC-SHA256("PREFIX" + HMAC_KEY_SECRET, "DATE") key_region = HMAC-SHA256(key_date, "LOCATION") key_service = HMAC-SHA256(key_region, "SERVICE") signing_key = HMAC-SHA256(key_service, "REQUEST_TYPE")
這段偽碼包含下列元件:
- PREFIX:在大多數情況下,存取 Cloud Storage 資源時,這個值會是
GOOG4
。使用 Amazon S3x-amz
擴充功能時,這個值為AWS4
。 - HMAC_KEY_SECRET:您用來建立及簽署要求的 HMAC 金鑰密鑰。
- DATE、LOCATION、SERVICE、REQUEST_TYPE:這些值必須與憑證範圍中指定的值相符。
衍生簽署金鑰後,您可以使用程式設計語言在本機建立簽名,該語言包含含有 HMAC-SHA256 簽署演算法的程式庫。
簽名後
如要完成簽署,簽署的輸出內容 (稱為「訊息摘要」) 必須以十六進位編碼表示。
範例
以下是簽署政策文件的虛擬程式碼:
EncodedPolicy = Base64Encode(PolicyDocument) MessageDigest = SigningAlgorithm(SigningKey, EncodedPolicy) Signature = HexEncode(MessageDigest)
以下是簽署要簽署的字串的虛擬程式碼:
MessageDigest = SigningAlgorithm(SigningKey, StringToSign) Signature = HexEncode(MessageDigest)
後續步驟
- 在已簽署的網址中使用簽章。
- 在含有
Authorization
標頭的要求中使用簽章。 - 在 HTML 表單中使用簽名。