阿里云API使用

阿里云获取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();
    }
}

SDK

SDK