对于每一次HTTP或者HTTPS协议请求,我们会根据访问中的签名信息验证访问请求者身份。具体由使用AccessKeyID和AccessKeySecret对称加密验证实现。
AccessKey相当于用户密码,AccessKey用于调用API,而用户密码用于登录 ECS控制台
。其中AccessKeyID是访问者身份,AccessKeySecret是加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密谨防泄露。(点击查看AccessKeySecret)
步骤 1. 构造规范化请求字符串
现在,您得到了规范化请求字符串(CanonicalizedQueryString),其结构遵循 请求结构。
步骤 2. 构造签名字符串
示例 1. 参数拼接法
以调用 DescribeRegions 查询地域为例。假设您获得了 AccessKeyID=testid 以及 AccessKeySecret=testsecret,签名流程如下所示:
- 1.构造规范化请求字符串。
https://api.now.cn/api/Ecs/DescribeRegions?Timestamp=2016-02-23T12:46:24Z&AccessKeyID=testid&SignatureMethod=HMAC-SHA1&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf
- 2.构造待签名字符串 StringToSign。
GET&%2F&AccessKeyID%3Dtestid%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf%26Timestamp%3D2016-02-23T12%253A46%253A24Z
- 3.计算签名值。因为 AccessKeySecret=testsecret,用于计算的Key为 testsecret&,计算得到的签名值为
OLeaidS1JvxuMvnyHOwuJ+uX5qY=。示例使用的是Java Base64编码方法。
Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )
- 4.添加 RFC3986 规则编码后的Signature=OLeaidS1JvxuMvnyHOwuJ%2BuX5qY%3D 到 步骤1 的URL中。
https://api.now.cn/api/Ecs/DescribeRegions?SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&AccessKeyID=testid&Signature=OLeaidS1JvxuMvnyHOwuJ%2BuX5qY%3D&SignatureMethod=HMAC-SHA1&Timestamp=2016-02-23T12%253A46%253A24Z
示例 2. 编程语言法
依然以调用 DescribeRegions 查询地域为例。假设您获得了AccessKeyID=testid以及AccessKeySecret=testsecret,并且假定所有请求参数放在一个Java
Map
对象里。