更新时间:2022-09-02 09:35:23
RPC API要按如下格式在API请求的Query中增加签名(Signature):
https://Endpoint/?SignatureVersion=1.0&SignatureMethod=HMAC-SHA1&Signature=CT9X0VtwR86fNWSnsc6v8YGOjuE%3D&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf
其中:
签名算法遵循RFC 2104 HMAC-SHA1规范,使用AccessSecret对编码、排序后的整个请求串计算HMAC值作为签名。签名的元素是请求自身的一些参数,由于每个API请求内容不同,所以签名的结果也不尽相同。
Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of( StringToSign)) )
完成以下操作,计算签名:
%XY
的格式,其中 XY
是字符对应ASCII码的16进制表示。比如英文的双引号(””)对应的编码为 %22
。%XY%ZA…
的格式。%20
,而不是加号(+)。application/x-www-form-urlencoded
MIME格式编码算法(比如 Java标准库中的 java.net.URLEncoder
的实现)存在区别。编码时可以先用标准库的方式进行编码,然后把编码后的字符串中的加号(+)替换成 %20
,星号(*)替换成 %2A
,%7E
替换回波浪号(~),即可得到上述规则描述的编码字符串。本算法可以用下面的percentEncode
方法来实现:private static final String ENCODING = "UTF-8"; private static String percentEncode(String value) throws UnsupportedEncodingException { return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null; }
StringToSign= HTTPMethod + “&” + percentEncode(“/”) + ”&” + percentEncode(CanonicalizedQueryString)
以DescribeDrdsInstancesAPI 为例,假设使用的AccessKey Id
为 testid
, AccessKey Secret
为testsecret
。 签名前的请求URL如下:
AccessKeyId=testid&Action=DescribeDrdsInstances&Format=XML&RegionId=cn-hangzhou&SignatureMethod=HMAC-SHA1&SignatureNonce=ae5bdbeb-9b44-40a1-8bb4-b40784bff686&SignatureVersion=1.0&Timestamp=2016-01-20T14%3A26%3A15Z&Version=2015-04-13
使用testsecret&
,计算得到的签名值是:
h/ka/jNO+WZv8Tqgo4a75sp6eTs=
最后将签名作为Signature参数加入到URL请求中,最后得到的URL为:
http://drds.aliyuncs.com/?AccessKeyId=testid&Action=DescribeDrdsInstances&Format=XML&RegionId=cn-hangzhou&SignatureMethod=HMAC-SHA1&SignatureNonce=ae5bdbeb-9b44-40a1-8bb4-b40784bff686&SignatureVersion=1.0&Timestamp=2016-01-20T14%3A26%3A15Z&Version=2015-04-13&Signature=h%2Fka%2FjNO%2BWZv8Tqgo4a75sp6eTs%3D