概述
用戶可以使用查詢字符串參數驗證身份信息,此方法也稱為預簽名URL。預簽名URL的用例場景是用戶可以授予對OOS資源的臨時訪問權限。例如,用戶可以在網站上包含預先簽名的URL,或者在命令行客戶端(例如Curl)中使用它來下載文件。
預簽名URL支持GET、DELETE、PUT、HEAD、POST請求(POST Object除外)。
注意使用預簽名URL方式,有將您授權的數據在過期時間內曝露在互聯網上的風險,建議您預先評估后使用。
以下是預簽名URL的示例。
//oos-cn.ctyunapi.cn/examplebucket/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=<AccessKeyID>/20180721/<oos-region>/s3/aws4_request
&X-Amz-Date=20180721T201207Z
&X-Amz-Expires=86400
&X-Amz-SignedHeaders=host
&X-Amz-Signature=<signature-value>
預簽名URL方式需要注意:
- 預簽名URL方式必須包含的字段:X-Amz-Date、X-Amz-Algorithm、X-Amz-Signature、X-Amz-SignedHeaders、X-Amz-Credential和X-Amz-Expires。字段的順序可以互換,如果缺少其中一個,返回錯誤信息。
- 如果訪問時間晚于請求中X- Amz-Expires時間或者設置的時間格式錯誤,返回錯誤信息。
- 如果在URL和Header中同時包含簽名,以Header中的簽名為準。
- 該X-Amz-CredentialURL中的值僅顯示可讀性“/”字符。在實踐中,它應編碼為%2F。例如:
&X-Amz-Credential=<AccessKeyID>%2F20180721%2F<oos-region>%2Fs3%2Faws4_request
下表介紹了URL中提供身份驗證信息的查詢參數。
查詢字符串參數 描述 X-Amz-Algorithm 確定OOS簽名的版本以及用于計算簽名的算法。取值為AWS4-HMAC-SHA256。 X-Amz-Credential 用戶的accessKeyId和范圍信息,范圍信息包括請求日期、區域、服務、終止字符串aws4_request,格式如下:
AccessKeyID/date/region/service/aws4_request 其中:
date格式為YYYYMMDD。
region:
對于oos api:訪問域名為oos-xx.ctyunapi.cn,region為xx。
對于統計api:訪問域名為oos-xx-mg.ctyunapi.cn,region為xx-mg。
對于操作跟蹤api:訪問域名為oos-xx-cloudtrail.ctyunapi.cn,region為xx。
對于iam api:訪問域名為oos-xx-iam.ctyunapi.cn,region為xx。各資源池的詳細訪問域名詳見域名(Endpoint)列表。
service:
若使用OOS API服務,service為s3。
若使用統計分析服務,service為s3。
若使用操作跟蹤服務,service為cloudtrail。若使用IAM服務,service為sts。X-Amz-Date 日期和時間格式必須遵循ISO 8601標準,并且必須使用“yyyyMMddTHHmmssZ”格式進行格式化。例如,如果日期和時間是“08/01/2018 15:32:41.982-700”,則必須首先將其轉換為UTC(協調世界時),然后提交為“20180801T083241Z”。 X-Amz-Expires 提供生成的預簽名URL有效的時間段(以秒為單位)。例如,86400(24小時)。該值是整數。您可以設置的最小值為1,最大值為604800(七天)。 X-Amz-SignedHeaders 列出用于計算簽名的標頭。簽名計算中需要以下標頭:
HTTP host標頭。
x-amz-*請求頭。
X-Amz-Signature 提供簽名以驗證您的請求。此簽名必須與OOS計算的簽名相匹配。否則,OOS拒絕該請求。
簽名過程
下圖說明了簽名計算過程。

下表描述了圖中顯示的功能。用戶需要為這些功能實現代碼。
功能 描述 Lowercase() 將字符串轉換為小寫。 Hex() 小寫十六進制編碼。 SHA256Hash() 安全散列算法(SHA)加密散列函數。 HMAC-SHA256() 使用提供的簽名密鑰的SHA256算法計算HMAC。這是最終的簽名。 Trim() 刪除任何前導或尾隨空格。 UriEncode() URI編碼每個字節。UriEncode()必須強制執行以下規則:
URI編碼除了下面字符之外的每個字節:'A' - 'Z','a' - 'z','0' - '9',' - ','.','_'和'?'。
空格字符是保留字符,必須編碼為“%20”(而不是“+”)。
每個URI編碼字節由'%'和兩位十六進制值組成。
十六進制值中的字母必須為大寫,例如“%1A”。
除了文件名之外,對正斜杠字符'/'進行編碼。例如,如果文件名稱為photos/Jan/sample.jpg,則不對鍵名稱中的正斜杠進行編碼。
說明建議您編寫自己的自定義UriEncode函數,以確保您的編碼可以正常工作。
以下是Java中的示例UriEncode()函數。
public static String UriEncode(CharSequence input, boolean encodeSlash) {
? ? ? ? ? StringBuilder result = new StringBuilder();
? ? ? ? ? for (int i = 0; i < input.length(); i++) {
? ? ? ? ? ? ? char ch = input.charAt(i);
? ? ? ? ? ? ? if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') {
? ? ? ? ? ? ? ? ? result.append(ch);
? ? ? ? ? ? ? } else if (ch == '/') {
? ? ? ? ? ? ? ? ? result.append(encodeSlash ? "%2F" : ch);
? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? result.append(toHexUTF8(ch));
? ? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? ? return result.toString();
? ? ? }
使用參數的簽名過程與使用請求頭的簽名過程類似,如下所示:
- 由于創建預簽名URL的時候,并不知道有效負載的內容,所以設置常量UNSIGNED-PAYLOAD。
- 規范查詢字符串(Canonical Query String)必須包括除了X-Amz-Signature之外的所有上述查詢字符串。
規范標頭必須包括HTTP Host標頭。如果用戶想包含x-amz-*請求頭,這些標頭都將參與簽名計算。用戶可以選擇其他的請求頭是否參與簽名計算。安全起見,盡可能多的請求頭參與簽名計算。
生成簽名的示例
通過創建預簽名URL的方式,與其他人共享example-bucket中test.txt文件,過期時間設置為7天(604800秒)。以GET請求為例:
GET
//oos-cn.ctyunapi.cn/example-bucket/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=2a948fd3f00ba0925806/20240906/cn/s3/aws4_request&X-Amz-Date=20240906T235141Z&X-Amz-Expires=604800
&X-Amz-SignedHeaders=host
&X-Amz-Signature=<signature-value>
以下步驟首先說明如何計算簽名和構建預簽名URL。示例中使用的訪問密鑰如下:
| 參數 | 值 |
|---|---|
| AccessKeyID | 2a948fd3f00ba0925806 |
| SecretAccessKey | ef2017c2e5ffa0b1761717ecbca021da16501384 |
- StringToSign
- 創建規范請求(以GET請求為例)
GET /example-bucket/test.txt X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=2a948fd3f00ba0925806%2F20240906%2Fcn%2Fs3%2Faws4_request&X-Amz-Date=20240906T235141Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host host:oos-cn.ctyunapi.cn host UNSIGNED-PAYLOAD - 待簽名字符串
AWS4-HMAC-SHA256 20240906T235141Z 20240906/cn/s3/aws4_request 9e0b6407d893f03ea8ed79710b98a0b19bf9060b744f0e14212f32d1ac04ba62
- 創建規范請求(以GET請求為例)
- StringKey
signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<SecretAccessKey>","20240906"),"cn"),"s3"),"aws4_request") - 簽名
66628b60cb4cc78d37c76b204d6a019572ed3887d84488c72f0643d850ad4915 - 將簽名信息添加到請求頭
//oos-cn.ctyunapi.cn/example-bucket/test.txt?X-Amz-Date=20240906T235141Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=66628b60cb4cc78d37c76b204d6a019572ed3887d84488c72f0643d850ad4915&X-Amz-SignedHeaders=host&X-Amz-Credential=2a948fd3f00ba0925806/20240906/cn/s3/aws4_request&X-Amz-Expires=604800