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

AccessKey说明

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

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

说明 短信服务平台提供了Java、Python、PHP等语言的服务端SDK。使用这些SDK,可以免去签名过程。各SDK的使用说明,请参见SDK简介后安装相关SDK。

操作步骤

  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. 使用与号(&)连接编码后的请求参数,注意参数排序与步骤a一致。
  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

示例

以SendMessageToGlobe为例,签名前的请求URL为:

http://dysmsapi.ap-southeast-1.aliyuncs.com/?AccessKeyId=testid&Action=SendMessageToGlobe&Format=XML&From=Alicloud&Message=Hello&RegionId=ap-southeast-1&SignatureMethod=HMAC-SHA1&SignatureNonce=57acef20-c1d8-11eb-8c08-db81fda24dcc&SignatureVersion=1.0&Timestamp=2021-05-31T06%3A20%3A49Z&To=861245567%2A%2A%2A%2A&Version=2018-05-01
那么StringToSign就是:
GET&%2F&AccessKeyId%3Dtestid%26Action%3DSendMessageToGlobe%26Format%3DXML%26From%3DAlicloud%26Message%3DHello%26RegionId%3Dap-southeast-1%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D57acef20-c1d8-11eb-8c08-db81fda24dcc%26SignatureVersion%3D1.0%26Timestamp%3D2021-05-31T06%253A20%253A49Z%26To%3D861245567%252A%252A%252A%252A%26Version%3D2018-05-01

假如使用的Access Key Id是“testid”,Access Key Secret是“testsecret”,用于计算HMAC的Key就是“testsecret&”,则计算得到的签名值是:Lh/xyzDi5tn8DXfqatBONMXLErg=

签名后的请求URL为(注意增加了Signature参数):
http://dysmsapi.ap-southeast-1.aliyuncs.com/?Signature=Lh%2FxyzDi5tn8DXfqatBONMXLErg%3D&AccessKeyId=testid&Action=SendMessageToGlobe&Format=XML&From=Alicloud&Message=Hello&RegionId=ap-southeast-1&SignatureMethod=HMAC-SHA1&SignatureNonce=57acef20-c1d8-11eb-8c08-db81fda24dcc&SignatureVersion=1.0&Timestamp=2021-05-31T06%3A20%3A49Z&To=861245567%2A%2A%2A%2A&Version=2018-05-01