如何排查ECS API中Signature错误
发布日期:2015-11-11 15:11:44
如何排查ECS API中Signature错误 Signature生成的方法: 将get中提交的参数(除了aks以外所有的参数)按照一定的组成规则拼成一个字符串,前面加上GET&/&组成StringToSign,然后对StringToSign做 HMAC计算,以Access Key Secret+一个“&”号为HMAC计算的key,最终算出的字符串即为Signature。 详细的步骤参考官方文档:https://docs.aliyun.com/?spm=5176.100054.3.1.zDqYoT#/pub/ecs/open-api/requestmethod&signature 若结果反馈为Signature错误,可以排查以下几点: 1、 在构造“StringToSign”时是否对key值做了A-Z的字典排序 2、 是否将全部参数都放入了StringToSign 3、 计算前是否对StringToSign中的值做了urlencode,即将一些特殊的字符替换为类似%3D这样的字符串,如“=”需要替换成“%3D”,“/”要替换成“%2F”等,参见下述说明: a、 不对字符 A-Z、a-z、0-9 以及字符“-”、“_”、“.”、“~”编码; b、 对于其他字符编码成 “%XY” 的格式,其中 XY 是字符对应 ASCII 码的 16 进制表示。例如如英文的双引号(”)对应的编码为 %22; c、 需要注意的是英文空格( )要被编码是 %20,而不是加号(+); d、对于扩展的 UTF-8 字符,编码成 “%XY%ZA…” 的格式。 4、 观察是否使用了指定的算法,目前Signature需要使用HMAC-SHA1算法,在Java中通过Mac mac = Mac.getInstance("HmacSHA1");来获得HMAC-SHA1算法的对象 5、 检查HMAC-SHA1运算时是否是将Access Key Secret+&作为key(如Access Key Secret为abc,那么使用“abc&”作为运算的key),运算过程编码使用UTF-8编码 举例说明: 1、 例如要查询可用的镜像,先加入除了Signature以外所有的参数(值被忽略): [ImageOwnerAlias, SignatureVersion, Action, Format, PageSize, SignatureNonce, Version, AccessKeyId, SignatureMethod, RegionId, Timestamp] 2、 对它们进行字典排序: [AccessKeyId, Action, Format, ImageOwnerAlias, PageSize, RegionId, SignatureMethod, SignatureNonce, SignatureVersion, Timestamp, Version] 3、 将它们挨个拼接在一起(这个时候Timestamp中的值就已经经过了urlencode了,将“:”替换为“%3A”): AccessKeyId=6olc8au16tjr574v222c923p&Action=DescribeImages&Format=XML&ImageOwnerAlias=system&PageSize=10&RegionId=cn-hangzhou&SignatureMethod=HMAC-SHA1&SignatureNonce=352f98b6-5fbe-489c-b8a4-5d484939a8d5&SignatureVersion=1.0&Timestamp=2015-09-12T07%3A45%3A58Z&Version=2014-05-26 4、 在前面加上GET&/&: GET&/&AccessKeyId=6olc8au16tjr574v222c923p&Action=DescribeImages&Format=XML&ImageOwnerAlias=system&PageSize=10&RegionId=cn-hangzhou&SignatureMethod=HMAC-SHA1&SignatureNonce=352f98b6-5fbe-489c-b8a4-5d484939a8d5&SignatureVersion=1.0&Timestamp=2015-09-12T07%3A45%3A58Z&Version=2014-05-26 5、 再对整个字符串做urlencode,可以看到其中的“/”、“=”和参数键值对中的“&”都已经被替换,注意最前面的GET之后的两个“&”没有被替换: GET&%2F&AccessKeyId%3D6olc8au16tjr574v222c923p%26Action%3DDescribeImages%26Format%3DXML%26ImageOwnerAlias%3Dsystem%26PageSize%3D10%26RegionId%3Dcn-hangzhou%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D352f98b6-5fbe-489c-b8a4-5d484939a8d5%26SignatureVersion%3D1.0%26Timestamp%3D2015-09-12T07%253A45%253A58Z%26Version%3D2014-05-26 6、 构造HMAC运算的key,比如说Access Key Secret为“IamAccessKeySecret”故key为: IamAccessKeySecret& 7、 接着用电脑做HMAC-SHA1运算,算出来一个最终的字符串: 53wPekiWxh45TgPxVb4bkXrzZ6M= 8、 此字符串就是最终的Signature值,然后将其加入到HTTP get请求中,组成最终的get参数字符串,特别注意Signature加入后需要确认其中的特殊符号如“=”是否被转换为%xx的字符串等。 ImageOwnerAlias=system&SignatureVersion=1.0&Action=DescribeImages&Format=XML&PageSize=10&SignatureNonce=352f98b6-5fbe-489c-b8a4-5d484939a8d5&Version=2014-05-26&AccessKeyId=6olc8au16tjr574v222c923p&Signature=53wPekiWxh45TgPxVb4bkXrzZ6M%3D&SignatureMethod=HMAC-SHA1&RegionId=cn-hangzhou&Timestamp=2015-09-12T07%3A45%3A58Z 9、 接着就可以向ECS的API服务器发送请求了
|