为保证API的安全使用,在调用API时阿里云会对每个API请求通过签名(Signature)进行身份验证。无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名信息。本文介绍计算签名的方法和示例。
步骤一:构造规范化请求字符串
- 参数排序。按照参数首字母的字典顺序对参数排序,排序参数包括公共请求参数和接口自定义参数,不包括公共请求参数中的
Signature
参数。 公共请求参数详情,请参见公共参数。 - 对请求参数和参数值进行编码。使用UTF-8字符集按照RFC3986规则编码请求参数和参数取值。为方便表述,我们将此步骤的编码方法,命名为
encodeURIComponent
。参数编码方式:- 字符A~Z、a~z、0~9以及字符短横线(-)、下划线(_)、英文句点(.)和波浪线(~)不编码。
- 对其它ASCII码字符进行编码。编码格式为
%
加上16进制的ASCII码。例如半角双引号("
)将被编码为%22
。 - 非ASCII码通过UTF-8编码。
- 空格( )编码成
%20
,而不是加号(+
)。
- 使用等号(=)连接编码后的请求参数和参数取值。
- 使用与号(&)连接编码后的请求参数,注意参数排序与步骤1一致。
- 头部添加协议头和endpoint。例如https://ecs.aliyuncs.com/。
现在,您得到了规范化请求字符串,为方便表述,我们将步骤一:构造规范化请求字符串得到的字符串命名为
CanonicalizedQueryString
。
步骤二:构造签名字符串
- 构造待签名字符串
stringToSign
。我们以Java为例,该字符串构造规则为:String stringToSign = HTTPMethod + "&" + // HTTPMethod:发送请求的 HTTP 方法,例如 GET。 encodeURIComponent("/") + "&" + // encodeURIComponent 为步骤一第2步的编码方法 encodeURIComponent(CanonicalizedQueryString) // CanonicalizedQueryString 为步骤一获取的规范化请求字符串。
- 按照RFC2104的定义,通过您传入的AccessKeyId对应的密钥AccessSecret,使用
HMAC-SHA1
的签名算法,计算待签名字符串StringToSign
的签名。以Java为例,计算方法为:String signature = Base64(HMAC_SHA1(AccessSecret + "&", UTF_8_Encoding_Of(stringToSign)))
现在您得到了公共参数Signature的签名值
signature
。
签名示例
本示例以调用ECS DescribeDedicatedHosts查询一台或多台专有宿主机的详细信息为例。假设您获得了AccessKeyID=testid以及 AccessKeySecret=testsecret,签名流程为:
- 构造规范化请求字符串。
http://ecs.aliyuncs.com/?Timestamp=2016-02-23T12%253A46%253A24Z&Format=XML&AccessKeyId=testid&Action=DescribeDedicatedHosts&SignatureMethod=HMAC-SHA1&SignatureNonce=3ee8c1b8-xxxx-xxxx-xxxx-xxxxxxxxxx&Version=2014-05-26&SignatureVersion=1.0
- 构造待签名字符串
stringToSign
。GET&%2F&AccessKeyId%3Dtestid%26Action%3DDescribeDedicatedHosts%26Format%3DXML%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D3ee8c1b8-xxxx-xxxx-xxxx-xxxxxxxxx%26SignatureVersion%3D1.0%26Timestamp%3D2016-02-23T12%253A46%253A24Z%26Version%3D2014-05-26
- 计算签名值。例如
AccessKeySecret=testsecret
,用于计算的Key为testsecret&
(注意:加上后缀&)。计算得到的签名值为OLeaidS1JvxuMvnyHOwuJ+uX5qY=
。本示例使用的是 Java Base64 编码方法。String Signature = Base64(HMAC_SHA1(AccessSecret + "&",UTF_8_Encoding_Of(stringToSign)))
- 添加RFC3986规则编码后的
Signature=OLeaidS1JvxuMvnyHOwuJ%2BuX5qY%3D
到步骤1的URL中。http://ecs.aliyuncs.com/?SignatureVersion=1.0&Action=DescribeDedicatedHosts&Format=XML&SignatureNonce=3ee8c1b8-xxxx-xxxx-xxxx-xxxxxxxxx&Version=2014-05-26&AccessKeyId=testid&Signature=OLeaidS1JvxuMvnyHOwuJ%2BuX5qY%3D&SignatureMethod=HMAC-SHA1&Timestamp=2016-02-23T12%253A46%253A24Z
通过步骤4得到的URL,您可以使用浏览器、curl或者 wget等工具发起HTTP请求调用
DescribeDedicatedHosts
,查询一台或多台专有宿主机的详细信息。