【问题标题】:Request signature failing for Alibaba Cloud API call阿里云API调用请求签名失败
【发布时间】:2020-09-19 23:18:38
【问题描述】:

我尝试在 Postman 中创建一个方法并且非常接近,但我遇到了签名问题。我们正在尝试查询要添加到 WAF 规则的 VPC 的 IP 范围,以允许流量流向安全的应用程序。

Postman 允许使用 Javascript 编写预请求脚本,并支持一些包含的 JS 库,包括 CryptoJS。

这里的代码正是创建了阿里云所说的需要签名的请求。它使用 CryptoJS 的 HMAC-SHA1 签名并编码为 base 64。

所有变量都包含在请求参数中。我不确定它还能抱怨什么。

var dateIso = new Date().toISOString();

var randomString = function(length) {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    for(var i = 0; i < length; i++) {
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    }
    return text;
}

var accesskeyid = "LTAI4GC7VEijsm5bV3zwcZxZ"
var action = "DescribePublicIPAddress"
var format = "XML"
var regionid = "cn-shanghai-eu13-a01"
var signaturemethod = "HMAC-SHA1"
var signaturenonce = randomString(16)
var signatureversion = "1.0"
var timestamp = dateIso.replace(/:/gi, "%253A")
var version = "2016-04-28"

pm.environment.set("AccessKeyId", accesskeyid)
pm.environment.set("Action", action)
pm.environment.set("Format", format)
pm.environment.set("RegionID", regionid)
pm.environment.set("SignatureMethod", signaturemethod)
pm.environment.set("SignatureNonce", signaturenonce)
pm.environment.set("SignatureVersion", signatureversion)
pm.environment.set("Timestamp", dateIso)
pm.environment.set("Version", version)

var request = "GET&amp;%2F&amp;" + "AccessKeyID%3D" + accesskeyid + "%26Action%3D" + action + "%26Format%3D" + format + "%26RegionID%3D" + regionid + "%26SignatureMethod%3D" + signaturemethod + "%26SignatureNonce%3D" + signaturenonce + "%26SignatureVersion%3D" + signatureversion + "%26Timestamp%3D" + timestamp + "%26Version%3D" + version

pm.environment.set("Request", request)

var hash = CryptoJS.HmacSHA1(request, "spwH5dNeEm4t4dlpqvYWVGgf7aEAxB&")
var base64 = CryptoJS.enc.Base64.stringify(hash)
var encodesig = encodeURIComponent(base64)
pm.environment.set("Signature", encodesig);

console.log(base64)
console.log(request)

控制台输出显示:

Signature: XbVi12iApzZ0rRgJLBv0ytJJ0LY=

Parameter string to be signed: 
GET&amp;%2F&amp;AccessKeyID%3DLTAI4GC7VEijsm5bV3zwcZvC%26Action%3DDescribePublicIPAddress%26Format%3DXML%26RegionID%3Dcn-shanghai-eu13-a01%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3DiP1QJtbasQNSOxVY%26SignatureVersion%3D1.0%26Timestamp%3D2020-06-01T15%253A38%253A12.266Z%26Version%3D2016-04-28

Request sent:
GET https://vpc.aliyuncs.com/?AccessKeyID=LTAI4GC7VEijsm5bV3zwcZvC&Action=DescribePublicIPAddress&Format=XML&RegionID=cn-shanghai-eu13-a01&SignatureMethod=HMAC-SHA1&SignatureNonce=iP1QJtbasQNSOxVY&SignatureVersion=1.0&Timestamp=2020-06-01T15:38:12.266Z&Version=2016-04-28&Signature=XbVi12iApzZ0rRgJLBv0ytJJ0LY%3D

Response Received:
<?xml version='1.0' encoding='UTF-8'?><Error><RequestId>B16D216F-56ED-4D16-9CEC-633C303F2B61</RequestId><HostId>vpc.aliyuncs.com</HostId><Code>IncompleteSignature</Code><Message>The request signature does not conform to Aliyun standards. server string to sign is:GET&amp;%2F&amp;AccessKeyID%3DLTAI4GC7VEijsm5bV3zwcZvC%26Action%3DDescribePublicIPAddress%26Format%3DXML%26RegionID%3Dcn-shanghai-eu13-a01%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3DiP1QJtbasQNSOxVY%26SignatureVersion%3D1.0%26Timestamp%3D2020-06-01T15%253A38%253A12.266Z%26Version%3D2016-04-28</Message><Recommend><![CDATA[https://error-center.aliyun.com/status/search?Keyword=IncompleteSignature&source=PopGw]]></Recommend></Error>

当我从响应中检查“要签名的服务器字符串”和在比较中签名的参数字符串时,它们是相同的。

看起来一切都是根据需要构建的,但签名仍在咆哮。猜想我错过了一些简单的东西,但还没有找到。

注意:accesskeyID 和发布的密钥仅用于示例目的,并非真实帐户,因此此代码不会复制和粘贴以在 Postman 中执行。

PS - 我从其他几个关于这个主题的线程中学到了很多东西,这就是我达到这一点的原因。 akostadinov 在另一个线程上非常有帮助。

【问题讨论】:

    标签: alibaba-cloud


    【解决方案1】:

    我相信你有双重编码 &。我已经成功实现了其他阿里云 REST API。请检查一下。

    以下是预期的要签名的字符串格式:

    GET&%2F&AccessKeyId%3Dtestid&Action%3DDescribeVpcs&Format%3DXML&
    SignatureMethod%3DHMAC-SHA1&SignatureNonce%3D3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&SignatureVersion%3D1.0&TimeStamp%3D2016-02-23T12%253A46%
    253A24Z&Version%3D2014-05-15
    

    【讨论】:

      【解决方案2】:

      聚会有点晚了,但由于这是在谷歌上搜索 IncompleteSignature 错误时的第一个结果,我想我可以发表评论,希望能帮助别人摆脱我所经历的悲伤。

      对我来说,我在官方文档 here 中遗漏了一个细微的细节,即用于签名的密钥需要在末尾添加一个 & 符号 &amp;,然后才能使用。

      当我发现这一点时,其他一切都运行良好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-24
        • 1970-01-01
        相关资源
        最近更新 更多