alibaba-cloud - 为阿里巴巴云生成签名的麻烦
问题描述
阅读HTTP API 文档。我的请求因签名错误而失败。从错误消息中,我可以看到我要签名的字符串是正确的,但看起来我无法生成正确的 HMAC-SHA1(说真的为什么还要使用 SHA1 呢??)。
所以我决定尝试在同一个文档中复制样本的签名。
[47] pry(main)> to_sign = "GET&%2F&AccessKeyId%3Dtestid&Action%3DDescribeRegions&Format%3DXML&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3D3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&SignatureVersion%3D1.0&Timestamp%3D2016-02-23T12%253A46%253A24Z&Version%3D2014-05-26"
[48] pry(main)> Base64.encode64 OpenSSL::HMAC.digest("sha1", "testsecret", to_sign)
=> "MLAxpXej4jJ7TL0smgWpOgynR7s=\n"
[49] pry(main)> Base64.encode64 OpenSSL::HMAC.digest("sha1", "testsecret&", to_sign)
=> "VyBL52idtt+oImX0NZC+2ngk15Q=\n"
[50] pry(main)> Base64.encode64 OpenSSL::HMAC.hexdigest("sha1", "testsecret&", to_sign)
=> "NTcyMDRiZTc2ODlkYjZkZmE4MjI2NWY0MzU5MGJlZGE3ODI0ZDc5NA==\n"
[51] pry(main)> Base64.encode64 OpenSSL::HMAC.hexdigest("sha1", "testsecret", to_sign)
=> "MzBiMDMxYTU3N2EzZTIzMjdiNGNiZDJjOWEwNWE5M2EwY2E3NDdiYg==\n"
[52] pry(main)> OpenSSL::HMAC.hexdigest("sha1", "testsecret&", to_sign)
=> "57204be7689db6dfa82265f43590beda7824d794"
[53] pry(main)> OpenSSL::HMAC.hexdigest("sha1", "testsecret", to_sign)
=> "30b031a577a3e2327b4cbd2c9a05a93a0ca747bb"
很明显,这些都不匹配的示例签名CT9X0VtwR86fNWSnsc6v8YGOjuE=
。知道这里缺少什么吗?
更新:从tcpdump
Golang 客户端工具中,我看到它执行POST
如下请求:
POST /?AccessKeyId=**********&Action=DescribeRegions&Format=JSON&RegionId=cn-qingdao&Signature=aHZVpIMb0%2BFKdoWSIVaFJ7bd2LA%3D&SignatureMethod=HMAC-SHA1&SignatureNonce=c29a0e28964c470a8997aebca4848b57&SignatureType=&SignatureVersion=1.0&Timestamp=2018-07-16T19%3A46%3A33Z&Version=2014-05-26 HTTP/1.1
Host: ecs.aliyuncs.com
User-Agent: Aliyun-CLI-V3.0.3
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
x-sdk-client: golang/1.0.0
x-sdk-core-version: 0.0.1
x-sdk-invoke-type: common
Accept-Encoding: gzip
当我从上述请求中获取参数并生成签名时,它确实匹配。所以我尝试了所有 tree: GET
,POST
带有 URL 参数和POST
正文中的参数。每次我收到签名错误。如果我使用与 golang 工具完全相同的参数重做请求,我会收到 nonce already used 错误(如预期的那样)。
解决方案
- 看来这个aliyun ruby sdk(非官方,仅供参考)的作品。您可能想检查它是如何实现的。
- 检查它的 string_to_sign 的样子。我跑了一下,似乎与您提供的略有不同。参数与
&
而不是连接%26
。GET&%2F&AccessKeyId%3Dtestid&Action%3DDescribeRegions&Format%3DXML&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3D3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&SignatureVersion%3D1.0&Timestamp%3D2016-02-23T12%253A46%253A24Z&Version%3D2014-05-26
需要“红宝石” 需要“阿里云” $DEBUG = 真 选项 = { :access_key_id => "k", :access_key_secret => "s", :service => :ecs } service = Aliyun::Service.new 选项 将 service.DescribeRegions({})
推荐阅读
- reactjs - 自定义选项卡显示不正确
- smartview - SmartViewSDK 如何发送命令控制远程三星电视
- c# - 当我在 asp.net 上发布我的网站时,注册/登录停止工作
- api - 无法解码 Coinbase 机密
- python - 使用 Python 电子邮件模块在 HTML 邮件中嵌入图像
- javascript - React - 无论更改顺序如何,都可以同时对给定数据进行搜索和过滤
- html - 删除边框后,文本不再居中
- sed - 使用 sed 替换第一个模式
- python - matplotlib可视化-正负比例图
- flutter - 如何在 Flutter 中创建带有图标和文本的高架按钮