ECS API中Signature错误的排查方法

    xiaoxiao2025-11-28  15

    Signature的生成方法

    将get中提交的参数(除了aks以外所有的参数)按照一定的组成规则拼成一个字符串,前面再加上GET&/&组成StringToSign,然后对StringToSign做 HMAC计算,以Access Key Secret+一个“&”号为HMAC计算的key,最终算出的字符串就是Signature。

    排查思路

    若碰到反馈Signature错误,可以排查以下几点:

    在构造“StringToSign”时是否对key值做了A-Z的字典排序是否将所有的参数都放入了StringToSign计算前是否对StringToSign中的值做了urlencode,即将一些特殊的字符替换成类似=这样的字符串,如“=”需要替换成“=”,“/”要替换成“/”等,参见下述说明:a、 对于字符 A-Z、a-z、0-9 以及字符“-”、“_”、“.”、“~”不编码;

    b、 对于其他字符编码成 “%XY” 的格式,其中 XY 是字符对应 ASCII 码的 16 进制表示。比如英文的双引号(”)对应的编码就是 "c、 对于扩展的 UTF-8 字符,编码成 “%XY%ZA…” 的格式;d、 需要说明的是英文空格( )要被编码是 ,而不是加号(+)。

    是否使用了指定的算法,目前Signature需要使用HMAC-SHA1算法,在Java中通过Mac mac = Mac.getInstance("HmacSHA1");来获得HMAC-SHA1算法的对象检查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了,将“:”替换为“:”):

    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:45:58Z&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:45:58Z&Version=2014-05-26

    5、 再对整个字符串做urlencode,可以看到其中的“/”、“=”和参数键值对中的“&”都已经被替换,注意最前面的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

    6、 然后构造HMAC运算的key,很简单,将Access Key Secret再加上一个“&”即可:

    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=&SignatureMethod=HMAC-SHA1&RegionId=cn-hangzhou&Timestamp=2015-09-12T07:45:58Z

    9、 然后就可以向ECS的API服务器发送请求了

    参考文档

    1.官网的生成Signature文档:https://help.aliyun.com/document_detail/25492.html

    相关资源:python入门教程(PDF版)
    最新回复(0)