s3接口認證說明


S3 Authorization太繞,太頭痛,下面解釋說明:

XS3 REST API基於HMAC(哈希消息身份驗證碼)密鑰使用自定義HTTP方案進行身份驗證。要對請求進行身份驗證,您首先需要合並請求的選定元素以形成一個字符串。然后,您可以使用XS3私

有訪問密鑰來計算該字符串的HMAC。通常我們將此過程稱為“簽署請求”並且我們將輸出HMAC算法稱為“簽名”,因為它會模擬真實簽名的安全屬性。最后,您可以使用本部分中介紹的語法,作為請求的參數添加此簽名。

 

系統收到經身份驗證的請求時,將提取您申領的XS3私有訪問密鑰,並以相同的使用方式將它用於計算已收到的消息的簽名。然后,它會將計算出的簽名與請求者提供的簽名進行對比。如果兩個簽名相匹配,則系統認為請求者必須擁有對XS3私有訪問密鑰的訪問權限,因此充當向其頒發密鑰的委托人的頒發機構。如果兩個簽名不匹配,那么請求將被丟棄,同時系統將返回錯誤消息。

 

身份驗證標頭
XS3 REST API使用標准的 HTTP Authorization標頭來傳遞身份驗證信息。(標准標頭的名稱是不可取的,因為它承載的是身份驗證信息,而不是授權。)在XS3身份驗證方案下,授權標頭具有以下形式:
Authorization: AWS Access Key: Signature

新用戶注冊后,會向開發人員頒發訪問密鑰 ID和私有訪問密鑰。對於請求身份驗證,Access Key元素將標識用於計算簽名的訪問密鑰 ID和進行請求的開發人員(間接)。

Signature元素是請求中選定元素的 RFC 2104 HMAC-SHA1,因此授權標頭的Signature部分會因請求的不同而異。如果系統計算出的請求簽名與請求隨附的Signature相匹配,則請求者證明擁有XS3私有訪問密鑰。然后在該身份下,借助獲得此密鑰的開發人員的授權來處理請求。

 

用於簽名的請求規范

在系統收到經身份驗證的請求時撤銷,系統會將計算出的請求簽名與StringToSign中提供的簽名進行對比。基於此原因,您必須采用XS3使用的相同方法計算簽名。根據適用於簽名的統一格式放置請求的過程稱為標准化。

Authorization字段計算方法如下:

在該示例中,“\n” 表示Unicode碼位 U+000A,這通常稱為換行符。

"Authorization: AWS " + Access Key + ":" + Signature

Signature = Base64(HMAC-SHA1( Secret Key, UTF-8-Encoding-Of( StringToSign )))

StringToSign =VERB + "\n"

+ CONTENT-MD5 + "\n"

+ CONTENT-TYPE + "\n"

+ DATE + "\n"

+ CanonicalizedHeaders

+ CanonicalizedResource))

 

- Access Key:XS3提供
- Signature:HMAC-SHA1 是由RFC 2104(用於消息身份驗證的哈希密鑰)定義的算法。該算法要求輸入兩個字節字符串:一個密鑰和一個消息。對於XS3請求身份驗證,請將您的私有訪問密鑰(Secret Key) 用作密鑰,並將UTF-8編碼格式的StringToSign用作消息。HMAC-SHA1的輸出也是字節字符串,稱為摘要。通過對此摘要進行Base64編碼來構成Signature請求參數。
- VERB:HTTP協議請求,如GET/PUT/DELETE等。
- CONTENT-MD5:標准 HTTP 請求的CONTENT-MD5,計算方法參見 RFC1864
- CONTENT-TYPE:表示請求內容的類型,例如“application/xml”

 

如果請求中沒有CONTENT-MD5或者CONTENT-TYPE頭信息(例如,Content-Type或Content-MD5對於PUT請求是可選的,並且對於GET請求沒有任何意義),請使用空字符串 ("") 替換該位置。

-          DATE表示此次操作的時間,且必須為 HTTP1.1中支持的GMT格式

某些 HTTP 客戶端庫不提供為請求設置Date標頭的功能。如果您在標准化標頭中包含“Date”標頭的值時遇到困難,您可以改用“x-amz-date”標頭為請求設置時間。x-amz-date標頭的值必須采用 RFC 2616格式 (http://www.ietf.org/rfc/rfc2616.txt) 之一。 x-amz-date標頭位於請求中時,系統將在計算請求簽名時忽略任何Date標頭。因此,如果包含了x-amz-date標頭,請在構建Date時使用StringToSign的空字符串。

 

構建CanonicalizedHeaders元素

所有以“x-amz-”為前綴的HTTP Header被稱為CanonicalizedHeaders。

 

它的構建方法如下:

1) 將所有以“x-amz-”為前綴的HTTP請求頭的名字轉換成小寫字母。如‘X-AMZ-Meta-Name: Hello’

轉換成‘x-amz-meta-name: hello’。

2) 將上一步得到的所有HTTP 請求頭按照字典序進行升序排列。

3) 如果有相同名字的請求頭,則根據標准RFC 2616, 4.2 章進行合並(兩個值之間只用逗號分隔)。

如有兩個名為‘x-amz-meta-name’的請求頭,對應的值分別為‘hello’和‘world,則合並后

為:‘x-amz-meta-name:hello,world。

4) 通過將折疊空格(包括換行符)替換為單個空格,“展開”跨多個行的長標頭.

5) 刪除請求頭和內容之間分隔符兩端出現的任何空格。如‘x-amz-meta-name: hello,world轉換

成:‘x-amz-meta-name:hello,world。

6) 最后,請向生成的列表中的每個標准化標頭附加換行字符 (U+000A)。通過將此列表中所有的標頭

規范化為單個字符串,構建 CanonicalizedResource 元素。

 

構建CanonicalizedResource元素
用戶發送請求中想訪問的XS3目標資源被稱為 CanonicalizedResource。

它的構建方法如下:
1) 將CanonicalizedResource 置成空字符串(“”)
2) 附加未解碼的HTTP請求-URI 的路徑部分(取決於但不包括查詢字符串):“/BucketName/ObjectName”(無ObjectName則不填;如果ObjectName為中文,請用UTF-8編碼)。
對於不尋址bucket的請求(例如,GET Service),請附加“/”。
3) 如果請求將尋址子資源,請附加子資源、其值(如果有)和問號。請注意,如果存在多個子資源,子資源必須按子資源名稱的字典順序排序並使用“&”進行分隔。此時的CanonicalizedResource例子如:/BucketName/ObjectName?acl &uploadId=UploadId
構建CanonicalizedResource元素時如果有以下子資源,則必須包含他們:acl、partNumber、uploadId和uploads。

 

python示例代碼

 

import urllib2
import hashlib
import datetime
import base64
import exceptions
import hmac
GMT_FORMAT = '%a, %d %b %Y %H:%M:%S GMT'
MyAccessKey='QYV025X8CC65JOUAZ2KO'
MySecretKey='V+g3qxqlCfT28kIUjllYqaDpKwYEqNAFAJ2ijlwN'
myDate= datetime.datetime.utcnow().strftime(GMT_FORMAT)
def authStr():
mystr="GET\n\n\n"+myDate+"\n/"
myhmac= hmac.new(MySecretKey,digestmod=hashlib.sha1)
myhmac.update(mystr)
signStr=base64.encodestring( myhmac.digest())
result= "AWS %s:%s" %(MyAccessKey,signStr)
return result.strip()
def start():

req=urllib2.Request('http://xxxxx:80')
req.add_header('Date',myDate)
req.add_header('AWSAccessKeyId',MyAccessKey)
req.add_header('Authorization',authStr())
print req.headers
response=urllib2.urlopen(req)
print response.read()
if __name__ =="__main__":
start()

參考文檔:http://docs.ceph.com/docs/master/radosgw/s3/authentication/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM