对于每一次HTTP或者HTTPS协议请求,负载均衡会根据访问中的签名信息验证访问请求者身份。具体由使用AccessKeyID和AccessKeySecret对称加密验证实现。

RPC API要按以下格式在API请求的Query中增加签名(Signature)。

https://Endpoint/?SignatureVersion=1.0&SignatureMethod=HMAC-SHA1&Signature=CT9X0VtwR86fNWSnsc6v8YGOju****&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf
其中:
  • SignatureMethod:签名方式,目前支持HMAC-SHA1。
  • SignatureVersion:签名算法版本,目前版本是 1.0。
  • SignatureNonce:唯一随机数,用于防止网络重放攻击。用户在不同请求间要使用不同的随机数值,建议使用通用唯一识别码(Universally Unique Identifier, UUID)。
  • Signature: 使用AccessKey Secret对请求进行对称加密后生成的签名。

AccessKey和AccessKeySecret

AccessKey相当于用户密码。AccessKey用于调用API,而用户密码用于登录ECS控制台。其中AccessKeyID是访问者身份,AccessKeySecret是加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密谨防泄露。更多详情,请参见获取AccessKey

说明 SLB提供了多种编程语言的SDK及第三方SDK,可以免去您签名的烦恼。更多详情,请下载SDK

步骤一:构造规范化请求字符串

GET&%2F&AccessKeyId%3Dtestid%26Action%3DDescribeRegions%26Format%3DXML%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf%26SignatureVersion%3D1.0%26TimeStamp%3D2016-02-23T12%253A46%253A24Z%26Version%3D2014-05-26
  1. 按照参数名称的字典顺序对请求中所有的请求参数(包括公共请求参数和接口的自定义参数,但不包括公共请求参数中的Signature参数)进行排序。
    说明 当使用GET方法提交请求时,这些参数就是请求URL中的参数部分,即URL中?之后由&连接的部分。
  2. 对排序之后的请求参数的名称和值分别用UTF-8字符集进行URL编码。使用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替换为波浪号(~),即可得到上述规则描述的编码字符串。

      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. 使用等号(=)连接编码后的请求参数和参数取值。
  4. 将等号连接得到的参数组合按步骤 1 排好的顺序依次使用and(&)符号连接,即得到规范化请求字符串。

步骤二:构造签名字符串

  1. 按照RFC2104的定义,计算待签名字符串的HMAC-SHA1值。
    在AccessKey Secret后添加一个and(&)作为计算HMAC值的key。本示例中的key为testsecret&
    CT9X0VtwR86fNWSnsc6v8YGOjuE=
    说明 计算签名时,RFC2104规定的Key值是您的AccessKeySecret并加上与号(&),其ASCII值为38。
  2. 添加根据RFC3986规则编码后的参数Signature到规范化请求字符串URL中。
    http://slb.aliyuncs.com/?Action=DescribeLoadBalancers
    &TimeStamp=2016-02-23T12:46:24Z
    &Format=XML
    &AccessKeyId=testid
    &SignatureMethod=HMAC-SHA1
    &SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf
    &Version=2014-05-26
    &SignatureVersion=1.0
    &Signature=CT9X0VtwR86fNWSnsc6v8YGOjuE%3D