为保证API的安全调用,在调用API时阿里云会对每个API请求通过签名进行身份验证。
签名
API签名包含两部分:公共请求头(HTTP协议Header参数和阿里云协议Header参数)和CanonicalizedResource(规范资源),Body不计入签名。
AccessKey ID
和AccessKey Secret
由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中AccessKey ID
用于标识访问者的身份;AccessKey Secret
是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密,只有阿里云和用户知道。
系统会对每个访问的请求进行验证,每个提交的请求都需要在请求中包含签名(Signature)信息。系统通过使用AccessKey ID
和AccessKey Secret
进行对称加密的方法来验证请求的发送者身份。如果计算出来的验证码和提供的一样,即认为该请求是有效的;否则请求将被拒绝处理,并返回HTTP403错误。
请求要求将签名包含在HTTP Header中,格式为Authorization: acs [Access Key Id]:[Signature]
。
签名计算方法
签名计算方法如下:
Signature = base64(hmac-sha1(VERB + "\n"
+ ACCEPT + "\n"
+ Content-MD5 + "\n"
+ Content-Type + "\n"
+ Date + "\n"
+ CanonicalizedHeaders + "\n"
+ CanonicalizedResource))
VERB
表示HTTP的Method。比如示例中的PUT。Accept
客户端需要的返回值类型,支持application/json和application/xml。Content-MD5
表示请求内容数据的MD5值。Content-Type
表示请求内容的类型。Date
表示此次操作的时间,不能为空,目前只支持GMT格式。如果请求时间与服务器时间相差超过15分钟,系统会判定此请求不合法,并返回400错误。比如示例中的Thu, 17 Mar 2018 18:00:00 GMT
。CanonicalizedHeaders
表示HTTP中以x-acs-
开始的字段组合。CanonicalizedResource
表示HTTP所请求资源的URI(统一资源标识符)。比如/namespaces
。
CanonicalizedHeaders
CanonicalizedHeaders(即以x-acs-
开头的Header)在签名验证前需要符合以下规范:
将所有以
x-acs-
为前缀的HTTP请求头的名字转换成小写字母。比如将X-ACS-Meta-Name: TaoBao
转换为x-acs-meta-name: TaoBao
。阿里云规范请求头的名字是大小写不敏感的,建议全部使用小写。如果一个公共请求头的值部分过长,则需要处理其中的
\t
、\n
、\r
、\f
分隔符,将其替换为英文半角的空格。将上一步得到的所有HTTP阿里云规范头按照字典序进行升序排列。
删除请求头和内容之间分隔符两端出现的任何空格。比如将
x-acs-meta-name: TaoBao,Alipay
转换为x-acs-meta-name:TaoBao,Alipay
。将所有的头和内容用
\n
分隔符分隔拼成最后的CanonicalizedHeaders。
CanonicalizedResource
CanonicalizedResource表示客户想要访问资源的规范描述,需要将子资源和query一同按照字典序,从小到大排列并以&为分隔符生成子资源字符串(?
后的所有参数)。
http://cr.cn-hangzhou.aliyuncs.com/repository?name=repository1&namespace=namespace1
CanonicalizedResource应该为:
/repository?name=repository1&namespace=namespace1