签名机制

阿里云会对每个访问的请求进行身份验证,无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名Signature信息。通过使用AccessKey ID和AccessKey Secret进行对称加密的方法来验证请求的发送者身份。AccessKey ID和AccessKey Secret由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中AccessKey ID用于标识访问者的身份;AccessKey Secret用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密,只有阿里云和用户知道。

说明

阿里云提供了多种语言的SDK及第三方SDK,可以免去您对签名算法进行编码的麻烦。更多阿里云SDK的信息,参见 阿里云开发工具包

签名操作

您在访问时,需要按照下面的方法对请求进行签名处理。

  1. 使用请求参数构造规范化的请求字符串(Canonicalized Query String)。

    1. 参数排序。

      按照参数名称的字典顺序对请求中所有的请求参数(包括公共请求参数和接口的自定义参数,但不包括公共请求参数中的Signature参数)进行排序。

      说明

      当使用GET方法提交请求时,这些参数就是请求URI中的参数部分(即URI中问号(?)之后由and(&)连接的部分)。

    2. 参数编码。

      对排序之后的请求参数的名称和值分别用UTF-8字符集进行URL编码。编码的规则如下。

      • 对于字符: (A~Z)、(a~z)、(0~9)以及字符:短划线(-)、下划线(_)、英文句号(.)、波浪线(~)不编码;

      • 对于其它字符编码成 %XY 的格式,其中 XY 是字符对应ASCII码的16进制表示。比如英文的双引号(”)对应的编码为%22

      • 对于扩展的UTF-8字符,编码成 %XY%ZA… 的格式;

      • 英文空格( )要编码成%20,而不是加号(+)。

        该编码方式和一般采用的application/x-www-form-urlencodedMIME格式编码算法(比如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;
        }
    3. 将等号连接得到的参数组合按步骤i排好的顺序依次使用and(&)符号连接,即得到规范化请求字符串。

  2. 将上一步构造的规范化字符串按照下面的规则构造成待签名的字符串。

    StringToSign=
    HTTPMethod + “&” +
    percentEncode(“/”) + ”&” +
    percentEncode(CanonicalizedQueryString)                 

    其中:

    • HTTPMethod是提交请求用的HTTP方法,比如GET。

    • percentEncode(“/”) 是按照步骤1中ii描述的URL编码规则对字符正斜线(/)进行编码得到的值,即%2F

    • percentEncode(CanonicalizedQueryString)是对步骤1中构造的规范化请求。字符串按步骤1中ii描述的URL编码规则编码后得到的字符串。

  3. 按照RFC2104的定义,计算待签名字符串StringToSign的HMAC值。

    说明

    计算签名时使用的Key就是您持有的AccessKey Secret并加上一个and(&)字符(ASCII:38),使用的哈希算法是SHA1。

  4. 按照Base64编码规则把上面的HMAC值编码成字符串,即得到签名值Signature

  5. 将得到的签名值作为Signature参数添加到请求参数中,即完成对请求签名的过程。

    说明

    得到的签名值在作为最后的请求参数值提交给视频直播服务器时,需和其他参数一样,按照RFC3986的规则进行URL编码。更多详情,请参见RFC3986

示例

DescribeLiveSnapshotConfig 为例,签名前的请求URL为:

http://live.aliyuncs.com/?Format=XML&SignatureMethod=HMAC-SHA1&Action=DescribeLiveSnapshotConfig&AccessKeyId=testid&RegionId=cn-shanghai&ServiceCode=live&DomainName=example.com&AppName=test&SignatureNonce=c2fe8fbb-2977-4414-8d39-348d02419c1c&Version=2016-11-01&SignatureVersion=1.0&Timestamp=2017-06-14T09:51:14Z             

那么StringToSign就是:

GET&%2F&AccessKeyId%3Dtestid&Action%3DDescribeLiveSnapshotConfig&AppName%3Dtest&DomainName%3Dexample.com&Format%3DXML&RegionId%3Dcn-shanghai&ServiceCode%3Dlive&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3Dc2fe8fbb-2977-4414-8d39-348d02419c1c&SignatureVersion%3D1.0&Timestamp%3D2017-06-14T09%253A51%253A14Z&Version%3D2016-11-01

如果AccessKey ID使用的是testId,AccessKey Secret是testsecret,用于计算HMAC的Key就是(testsecret&),则计算得到的签名值是:

3I5a3myPjp8FXWT4rvxX5pKb/aw=

签名后的请求URL为:

http://live.aliyuncs.com/?Format=XML%26SignatureMethod=HMAC-SHA1%26Signature=3I5a3myPjp8FXWT4rvxX5pKb%2Faw%3D%26Timestamp=2017-06-14T09%3A51%3A14Z%26Action=DescribeLiveSnapshotConfig%26AccessKeyId=testid%26RegionId=cn-shanghai%26ServiceCode=live%26DomainName=example.com%26AppName=test%26SignatureNonce=c2fe8fbb-2977-4414-8d39-348d02419c1c%26Version=2016-11-01%26SignatureVersion=1.0
说明

增加了Signature参数,且按照URL编码规则编码。