本文为您介绍签名机制的操作步骤。对于每一次HTTP或者HTTPS协议请求,我们会根据访问中的签名信息验证访问请求者身份。具体由使用AccessKeyID和AccessKeySecret对称加密验证实现。

AccessKey说明

AccessKeyID和AccessKeySecret可在控制台AccessKey管理页面获得。其中AccessKeyID是访问者身份,AccessKeySecret是加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密谨防泄露。

AccessKey的相关操作请参见获取AccessKey

操作步骤

  1. 构造规范化请求字符串。
    1. 排序参数。排序规则以首字母顺序排序,排序参数包括公共参数接口自定义参数,不包括公共请求参数中的Signature参数。
      说明 当使用GET方法提交请求时,这些参数就是请求URL中的参数部分。即URL中?之后由&连接的部分。
    2. 编码参数。使用UTF-8字符集按照RFC3986
      • 字符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,可以先用标准库中percentEncode编码,随后将编码后的字符中加号(+)替换为%20、星号(*)替换为%2A%7E替换为波浪号(~),即可得到上述规则描述的编码字符串。
    3. 使用等号(=)连接编码后的请求参数和参数取值。
    4. 使用与号(&)连接编码后的请求参数,注意参数排序与步骤1一致。
  2. 构造签名字符串。
    1. 构造待签名字符串Signature
      您可以同样使用percentEncode处理上一步构造的规范化请求字符串,规则如下:
      StringToSign=
      HTTPMethod + "&" + //HTTPMethod:发送请求的 HTTP 方法,例如 GET。
      percentEncode("/") + "&" + //percentEncode("/"):字符(/)UTF-8 编码得到的值,即 %2F。
      percentEncode(CanonicalizedQueryString) //您的规范化请求字符串。
    2. 计算HMAC值。

      按照RFC2104的定义,使用上述步骤得到的字符串计算签名HMAC值。

      说明 计算签名时使用的Key就是您持有的AccessKeySecret并加上一个&字符(ASCII:38),使用的哈希算法是SHA1。
    3. 计算签名值。

      按照Base64 编码规则把上一步骤中的HMAC值编码成字符串,即得到签名值(Signature)。

    4. 添加签名。
      将得到的签名值作为Signature参数添加到请求参数中,即完成请求签名过程。
      说明 得到的签名值在作为最后的请求参数值提交给服务器时,也要按照RFC3986