阿里云获取Access Key,在控制台
> 头像hover
> accesskeys
API:域名查看是否可以注册
文档地址:域名Check接口
手动实现签名
手动实现比较麻烦,但是可以了解签名的组成过程。
package com.yodean.component.site;
import org.springframework.util.Base64Utils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* All rights Reserved, Designed By www.xhope.top
*
* @version V1.0
* @Description: (用一句话描述该文件做什么)
* @author: Rick.Xu
* @date: 11/19/18 18:49
* @Copyright: 2018 www.yodean.com. All rights reserved.
*/
public class Test {
private static final String ENCODING = "UTF-8";
private static final String ALGORITHM = "HmacSHA1";
private static String percentEncode(String value) throws UnsupportedEncodingException {
return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null;
}
private static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
private static String formatIso8601Date(Date date) {
SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
df.setTimeZone(new SimpleTimeZone(0, "GMT"));
return df.format(date);
}
public static void main(String[] args) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException {
Map<String, String> parameters = new HashMap();
// 输入请求参数
parameters.put("Action", "CheckDomain");//变量
parameters.put("DomainName", "google.com");
parameters.put("FeeCommand", "create");
parameters.put("FeeCurrency", "CNY");
parameters.put("FeePeriod", "1");
// 公共参数
parameters.put("Version", "2018-01-29"); //变量
parameters.put("AccessKeyId", "test");
parameters.put("Timestamp", formatIso8601Date(new Date()));
parameters.put("SignatureMethod", "HMAC-SHA1");
parameters.put("SignatureVersion", "1.0");
parameters.put("SignatureNonce", UUID.randomUUID().toString());
parameters.put("Format", "JSON");
StringBuilder url = new StringBuilder();
url.append("http://domain.aliyuncs.com/?"); //变量
parameters.forEach((k, v) -> {
url.append(k).append("=").append(v).append("&");
});
// 获取签名字符串
String stringToSign = getStringToSign(parameters);
System.out.println(stringToSign);
System.out.println();
// 签名
String signature = signature(stringToSign);
System.out.println(signature);
System.out.println();
// 添加签名到原始url
url.append("Signature=" + signature);
System.out.println(url.toString());
}
private static String signature(String stringToSign) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
String key = "testsecret&";
Mac mac = Mac.getInstance(ALGORITHM);
mac.init(new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM));
byte[] signData = mac.doFinal(stringToSign.getBytes(ENCODING));
String signature = new String(Base64Utils.encodeToString(signData));
return percentEncode(signature);
}
private static String getStringToSign(Map<String, String> parameters) throws UnsupportedEncodingException {
final String HTTP_METHOD = "GET";
// 排序请求参数
String[] sortedKeys = parameters.keySet().toArray(new String[]{});
Arrays.sort(sortedKeys);
final String SEPARATOR = "&";
// 构造 stringToSign 字符串
StringBuilder stringToSign = new StringBuilder();
stringToSign.append(HTTP_METHOD).append(SEPARATOR);
stringToSign.append(percentEncode("/")).append(SEPARATOR);
StringBuilder canonicalizedQueryString = new StringBuilder();
for(String key : sortedKeys) {
// 这里注意编码 key 和 value
canonicalizedQueryString.append("&")
.append(percentEncode(key)).append("=")
.append(percentEncode(parameters.get(key)));
}
// 这里注意编码 canonicalizedQueryString
stringToSign.append(percentEncode(
canonicalizedQueryString.toString().substring(1)));
return stringToSign.toString();
}
}