签名时,您需在用户管理控制台页面查看您当前账号的 AccessKeyId 和 AccessKeySecret,然后进行加密。其中,AccessKeyId 用于标识访问者身份;AccessKeySecret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。
请按照下面的方法对请求进行签名:
按参数名的字典顺序,对请求参数进行排序,包括 公共请求参数(不包括 Signature 参数)和接口的自定义参数。
说明 当使用 GET 方法提交请求时,这些参数就是请求 URL 中的参数部分,即 URL 中 ?之后由 &连接的部分。
使用UTF-8字符集按照 RFC3986 规则编码整个字符串。编码规则如下:
如果您使用的是Java标准库中的java.net.URLEncoder,可以先用标准库中 URLEncoder.encode()编码,随后将编码后的字符中加号+替换为%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;
}
完成后,即获得规范化请求字符串(CanonicalizedQueryString)。
加上请求方法构造完整的签名字符串。可参考如下规则:
StringToSign=
HTTPMethod + "&" + //HTTPMethod:发送请求的 HTTP 方法,例如 GET。
percentEncode("/") + "&" + //percentEncode("/"):字符(/)UTF-8 编码得到的值,即 %2F。
CanonicalizedQueryString//您的规范化请求字符串。
按照 RFC2104 的定义,使用步骤"构造签名字符串"得到的字符串StringToSign计算签名 HMAC 值。示例使用的是Java Base64编码方法。
signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )
说明 计算签名时,使用的 Key 就是您的 AccessKeySecret 。使用的哈希算法是 SHA1。
按照 Base64 编码规则把步骤"计算HMAC值"中的 HMAC 值编码成字符串,即得到签名值(Signature)。
将得到的签名值作为 signature 参数,按照 RFC3986 的规则进行 URL 编码后,再添加到请求参数中,即完成对请求签名的过程。