s3 authorization v2

s3 authorization v2

参数传递

通过Authorization请求头

1
Authorization: AWS AWSAccessKeyId:Signature
  • AWSAccessKeyId: 你的AccessKey
  • Signature: 计算得到的签名

eg:

1
Authorization: AWS ziw5dp1alvty9n47qksu:frJIUN8DYpKDtOLCwo//yllqDzg=

通过请求参数

HTTP请求中的参数:

  • AWSAccessKeyId: 你的AccessKey
  • Signature: 计算得到的签名
  • Expires: 签名的过期时间

eg:

1
GET /yourbucket/yourkey?AWSAccessKeyId=ziw5dp1alvty9n47qksu&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D

签名计算

1
Signature = Base64(HMAC-SHA1(YourSecretKey, UTF-8-Encoding-Of(StringToSign)))
  • YourSecretKey: 你的SecretKey
  • StringToSign

StringToSign

1
2
3
4
5
6
StringToSign =  HTTP-Verb + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date|Expires + "\n" +
CanonicalizedAmzHeaders +
CanonicalizedResource
  • HTTP-Verb: 请求的方法,如:PUTGETDELETEPOST
  • Content-MD5: 请求头Content-MD5的内容,如果没有这个头,由空字符串代替
  • Content-Type: 请求头Content-Type的内容,如果没有这个头,由空字符串代替
  • Date|Expires: 如果使用Authorization头携带签名信息,为Date头的内容,如果没有Date头,由空字符串代替;如果使用请求参数携带签名信息,为参数Expires的内容
  • CanonicalizedAmzHeaders: 请求中所有以x-amz-开始的头所组成的字符串,如果没有这样的头,由空字符串代替
    eg:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    原始请求头:
    Date: Tue, 27 Mar 2007 19:36:42 +0000
    X-Amz-b: Bar
    x-amz-a: foob
    x-Amz-a: fooa
    Host: johnsmith.s3.amazonaws.com

    对应的CanonicalizedAmzHeaders为:
    x-amz-a:fooa,foob
    x-amz-b:Bar
  • CanonicalizedResource: 请求所对应的资源
    eg:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    GET /?foo=bar
    GET /yourbucket/yourkey?foo=bar
    GET /yourbucket/yourkey?acl&foo=bar

    对应的nicalizedResource分别为:


    /yourbucket/yourkey
    /yourbucket/yourkey?acl

参考&鸣谢