除了通過HTTP請求頭部的Authorization字段進行簽名授權外,您還可以生成一個包含簽名和其他必要的請求信息的預簽名URL。通過這種方式,您可以在不透露訪問憑證的情況下,授予第三方在特定有效期內對OSS資源的訪問權限。本文介紹如何使用V1簽名算法實現在URL中包含簽名。
OSS支持更安全的V4簽名算法,建議您使用V4簽名。更多信息,請參見V4簽名。
SDK簽名實現
OSS SDK已自動實現V1簽名,您使用OSS SDK時無需關注簽名問題。如果您想了解具體語言的簽名實現,請參考OSS SDK的代碼。OSS SDK簽名實現的文件請參見下表。
SDK | 簽名實現 | 使用示例 |
Java | ||
PHP | ||
Node.js | ||
Browser.js | ||
Python | ||
Android | ||
iOS | ||
Go | ||
C++ | ||
C | ||
.Net | ||
Ruby |
注意事項
使用在URL中簽名的方式,會將授權的數據在過期時間內暴露在互聯網上,請預先評估使用風險。
OSS不支持同時在URL和Header中包含簽名。
您可以為PUT操作生成一個預簽名的URL,該URL用于檢查是否上傳了正確的內容。SDK對請求進行預簽名時,將計算請求正文的校驗和,并生成包含在預簽名URL中的MD5校驗和。用戶必須上傳與SDK生成的MD5校驗和相同的內容,否則操作失敗。如果要驗證MD5,只需在請求中增加Content-MD5頭即可。
簽名實現
簽名示例
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?OSSAccessKeyId=nz2p***********&Expires=1141889120&Signature=****Pxyb****mGa%****272YEAiv****
如果需要使用STS用戶構造URL簽名,則必須攜帶
security-token
。https://examplebucket.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?OSSAccessKeyId=nz2p***********&Expires=1141889120&Signature=****Pxyb****mGa%****272YEAiv****&security-token=CAIS****q6Ft5B2yfSjIr****Oz31blR9oWmWBf****DR/xm3Imc****IHxMdHJsCeAcs/Q0lGFR5/sflqJIR****EvCUcZr8szfWcsZos2****u5Jko1be0ewHKeQKZsebWZ+LmNpy/Ht6md1HDkAJq3LL+bk/Mdle5MJqP+/kFC9MMRVuAcCZhDtVbLRcYgq18D3bKMuu3ORPHm3fZCFES2jBxkmRi86+ysIP+phPVlw/90fRH5dazcJW0Zsx0OJo6Wcq+3+FqM6DQlTNM6hwNtoUO1fYUommb54nDXwQIvUjfbtC5qIM/cFVLAYEhAL****TGkvl1h/fejYyfyW****kFCHiPF****JCUSbr4a4sjF6zyPnPWycyCLYXleLzhxPWd/2kagAGaXG69BqwYNvrKKI3W8****bNc1wQDMXQfiHpFCRG6lYhh3****pwH90A3sTlxzRGvi8+****JwrluOHWs+Fj6S6s0cOhKvKRWYE8UuWeXIvv4l6DAGwH****LjLC11f5prUJ****b+3hwuBod32Jx+us/1p996Glao725orcb****
您可以在簽名URL中添加想要授權的IP地址、IP地址段或VPC ID,避免未授權的終端訪問OSS資源。
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?&OSSAccessKeyId=44CF****************&Expires=1475462111&Signature=77Dv****************&x-oss-ac-subnet-mask=32
參數說明
名稱
類型
是否必選
描述
OSSAccessKeyId
字符串
是
指定URL簽名中使用的AccessKey ID。
Expires
數字
是
Unix時間戳(自UTC時間1970年01月01號開始的秒數),用于標識該URL的超時時間,單位為秒。如果OSS接收到該URL請求的時間晚于簽名中包含的Expires參數時,則返回請求超時的錯誤碼。例如,當前時間是1141889060,開發者希望創建一個60秒后自動失效的URL,則可以設置Expires時間為1141889120。
說明出于安全考慮,OSS控制臺中默認URL的有效時間為3600秒,最大值為32400秒。關于修改URL超時時間的具體操作,請參見使用文件URL。
Signature
字符串
是
簽名信息。格式如下:
Signature = urlencode(base64(hmac-sha1(AccessKeySecret, VERB + "\n" + CONTENT-MD5 + "\n" + CONTENT-TYPE + "\n" + EXPIRES + "\n" + CanonicalizedOSSHeaders + CanonicalizedResource)))
所有OSS支持的請求和各種Header參數,在URL中進行簽名的算法和在Header中包含簽名的算法類似。
生成URL中的簽名字符串時,除了將Date參數替換為Expires參數外,仍然包含
CONTENT-TYPE
、CONTENT-MD5
、CanonicalizedOSSHeaders
等簽名版本1中定義的Header(請求中雖然仍有Date請求Header,但無需將Date加入簽名字符串中)。在URL中包含簽名時必須對URL進行編碼。如果在URL中多次傳入Signature、Expires或OSSAccessKeyId,則以第一次傳入的值為準。
使用URL簽名時,OSS會先驗證請求時間是否晚于Expires時間,然后再驗證簽名。
security-token
字符串
否
安全令牌。只有當使用STS用戶構造URL簽名時,才需要設置此參數。
說明關于搭建STS服務的具體操作,請參見使用STS臨時訪問憑證訪問OSS。您可以通過調用STS服務的AssumeRole接口或者使用各語言STS SDK來獲取臨時訪問憑證。臨時訪問憑證包括臨時訪問密鑰(AccessKey ID和AccessKey Secret)和安全令牌(SecurityToken)。
x-oss-ac-source-ip
字符串
否
指定IP地址或者IP地址段。
重要該參數只需要在生成signature時使用,不需要在URL中攜帶該參數。
如果在生成簽名時添加了IP地址或IP地址段,則需要傳遞參數x-oss-ac-subnet-mask,用于標記子網掩碼。
x-oss-ac-subnet-mask
數字
否
子網掩碼中1的個數。如果請求中攜帶該參數,OSS會將實際請求IP地址與子網掩碼進行求與,然后用于計算簽名是否正確。如果該參數被惡意篡改,將導致簽名無法校驗通過。
x-oss-ac-vpc-id
字符串
否
指定VPC ID。指定該參數后,OSS會判斷是否為對應VPC ID來源的請求。如果請求是從該VPC ID發起且該參數已賦值,則同時校驗VPC ID和來源IP地址或IP地址段。
x-oss-ac-forward-allow
布爾型
否
指定是否允許轉發請求。OSS如果檢測到該字段并且請求中帶有
X-Forwarded-For
(可能為多個IP地址),則將X-Forwarded-For
的值用于計算簽名校驗。取值如下:
true:表示允許轉發請求。
重要設置為true存在請求頭被篡改劫持的風險。
false(默認值):不允許轉發請求。
生成簽名的Python示例代碼(只涉及必選參數)
import base64 import hmac import hashlib import urllib h = hmac.new("accesskey", "GET\n\n\n1141889120\n/examplebucket/oss-api.pdf", hashlib.sha1) urllib.quote(base64.encodestring(h.digest()).strip())
錯誤碼
錯誤碼 | 返回消息 | 描述 |
AccessDenied | 403 Forbidden | 在URL中添加簽名時,Signature、Expires和OSSAccessKeyId順序可以調換,但不能缺少Signature、Expires或OSSAccessKeyId中的一個或者多個。 |
AccessDenied | 403 Forbidden | 訪問的當前時間晚于請求中設定的Expires時間或時間格式錯誤。 |
InvalidArgument | 400 Bad Request | URL中包含Signature、Expires、OSSAccessKeyId中的一個或者多個,并且Header中也包含簽名消息。 |