本文为您介绍签名机制的操作步骤。对于每一次HTTP或者HTTPS协议请求,我们会根据访问中的签名信息验证访问请求者身份。具体由使用AccessKeyID和AccessKeySecret对称加密验证实现。
AccessKey说明
AccessKeyID和AccessKeySecret可在控制台AccessKey管理页面获得。其中AccessKeyID是访问者身份,AccessKeySecret是加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密谨防泄露。
AccessKey的相关操作请参见获取AccessKey。
说明 短信服务平台提供了Java、Python、PHP等语言的服务端SDK。使用这些SDK,可以免去签名过程。各SDK的使用说明,请参见SDK简介后安装相关SDK。
操作步骤
- 构造规范化请求字符串。
- 排序参数。排序规则以首字母顺序排序,排序参数包括公共参数接口自定义参数,不包括公共请求参数中的Signature参数。说明 当使用GET方法提交请求时,这些参数就是请求URL中的参数部分。即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
替换为波浪号(~),即可得到上述规则描述的编码字符串。
- 字符A~Z、a~z、0~9 以及字符
- 使用等号(=)连接编码后的请求参数和参数取值。
- 使用与号(&)连接编码后的请求参数,注意参数排序与步骤a一致。
- 排序参数。排序规则以首字母顺序排序,排序参数包括公共参数接口自定义参数,不包括公共请求参数中的Signature参数。
- 构造签名字符串。
- 构造待签名字符串Signature。您可以同样使用percentEncode处理上一步构造的规范化请求字符串,规则如下:
StringToSign= HTTPMethod + "&" + //HTTPMethod:发送请求的 HTTP 方法,例如 GET。 percentEncode("/") + "&" + //percentEncode("/"):字符(/)UTF-8 编码得到的值,即 %2F。 percentEncode(CanonicalizedQueryString) //您的规范化请求字符串。
- 计算HMAC值。
按照RFC2104的定义,使用上述步骤得到的字符串计算签名HMAC值。
说明 计算签名时使用的Key就是您持有的AccessKeySecret并加上一个&
字符(ASCII:38),使用的哈希算法是SHA1。 - 计算签名值。
按照Base64 编码规则把上一步骤中的HMAC值编码成字符串,即得到签名值(Signature)。
- 添加签名。将得到的签名值作为Signature参数添加到请求参数中,即完成请求签名过程。说明 得到的签名值在作为最后的请求参数值提交给服务器时,也要按照RFC3986。
- 构造待签名字符串Signature。
示例
以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