ECS API中Signature错误的排查方法

本文涉及的产品
云服务器ECS,u1 2核4GB 1个月
推荐场景:
2048小游戏搭建
云服务器 ECS,每月免费额度280元 3个月
简介: Signature的生成方法 将get中提交的参数(除了aks以外所有的参数)按照一定的组成规则拼成一个字符串,前面再加上GET&/&组成StringToSign,然后对StringToSign做 HMAC计算,以Access Key Secret+一个“&”号为HMAC计算的key,最终算出的字符串就是Signature。
+关注继续查看

Signature的生成方法

将get中提交的参数(除了aks以外所有的参数)按照一定的组成规则拼成一个字符串,前面再加上GET&/&组成StringToSign,然后对StringToSign做 HMAC计算,以Access Key Secret+一个“&”号为HMAC计算的key,最终算出的字符串就是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、 对于扩展的 UTF-8 字符,编码成 “%XY%ZA…” 的格式;
d、 需要说明的是英文空格( )要被编码是 %20,而不是加号(+)。

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

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服务器发送请求了

参考文档

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

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
数据可视化 PyTorch API
wandb安装注册及解决训练模型报API错误
wandb是Weight & Bias的缩写,一句话,**它是一个参数可视化平台**。 wandb强大的兼容性,它能够和Jupyter、TensorFlow、Pytorch、Keras、Scikit、fast.ai、LightGBM、XGBoost一起结合使用。
|
前端开发 JavaScript API
关于 SAP UI5 getSAPLogonLanguage is not a function 的错误消息以及 API 版本的讨论
关于 SAP UI5 getSAPLogonLanguage is not a function 的错误消息以及 API 版本的讨论
126 0
关于 SAP UI5 getSAPLogonLanguage is not a function 的错误消息以及 API 版本的讨论
|
开发框架 Oracle 前端开发
Oracle+ASP.Net Core Web API在云服务器上的部署
暑假数据库课程设计,我们小组选择vue+web api+Oracle开发网站,需要云服务器部署项目,对比后选择了阿里云服务器,并选择飞天加速计划——高校学生在家实践活动,一番摸索后实现了oracle数据库的建立与web api的发布,目前使用感觉良好。
Oracle+ASP.Net Core Web API在云服务器上的部署
|
存储 Java API
使用Java消费API的一个错误消息PKIX path building failed以及解决方案
使用Java消费API的一个错误消息PKIX path building failed以及解决方案
|
弹性计算 Linux 网络安全
【ECS】通过API允许不同账号下的ECS实例内网通信
若您需要实现同一地域下不同账号的ECS实例内网通信,可以参考本文描述授权安全组间互访。
201 0
【ECS】通过API允许不同账号下的ECS实例内网通信
|
弹性计算 Linux API
【ECS】通过API撤销不同账号下的ECS实例内网通信
若您在同一地域下授权过不同账号的ECS实例内网通信,可以通过API接口撤销安全组授权。
【ECS】通过API撤销不同账号下的ECS实例内网通信
热门文章
最新文章
相关产品
云迁移中心
推荐文章
更多