作者:俏巴
簽名驗證工具
如果在使用過程中因為簽名問題一直無法通過,建議直接使用簽名驗證工具進行快速的測試驗證。

Code Sample
建立隊列
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.http.entity.StringEntity;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URI;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class CreateMNSQueue {
public static void main(String[] args) {
//參數設定
String AccessKeySecret = "********";//Access Key Secret
String AccessKeyId = "********";//AccessKey ID
String AccountId = "********";//Account ID
//擷取GMT英文格式時間
Date d=new Date();
DateFormat format=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z",Locale.ENGLISH);//英文格式的時間轉換時需要帶上Locale.ENGLISH,否則會轉換失敗,因為它預設的是本地化的設定,除非你的作業系統是英文的,總之時間轉換時需要時間格式與模式保持一緻。
format.setTimeZone(TimeZone.getTimeZone("GMT"));
String date = format.format(d);
String body = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
" <Queue xmlns=\"http://mns.aliyuncs.com/doc/v1/\">\n" +
" <VisibilityTimeout >60</VisibilityTimeout>\n" +
" <MaximumMessageSize>1024</MaximumMessageSize>\n" +
" <MessageRetentionPeriod>120</MessageRetentionPeriod>\n" +
" <DelaySeconds>0</DelaySeconds>\n" +
" </Queue>";
//構造簽名String
String SignString = "PUT\n" +
"\n"+
"application/xml"+
"\n"+
date + "\n"+
"x-mns-version:2015-06-06" +"\n"+
"/queues/TestQueue123";
String sign = encode(AccessKeySecret,SignString);
String Authorization = "MNS " + AccessKeyId + ":" + sign;
HttpClient httpclient = HttpClients.createDefault();
try
{
URIBuilder builder = new URIBuilder("http://" + AccountId + ".mns.cn-hangzhou.aliyuncs.com/queues/TestQueue123");//在杭州區域
URI uri = builder.build();
HttpPut request = new HttpPut(uri);
request.setHeader("Authorization", Authorization);
request.setHeader("Date", date);
request.setHeader("Host", AccountId + ".mns.cn-hangzhou.aliyuncs.com");
request.setHeader("Content-Type","application/xml");
request.setHeader("x-mns-version","2015-06-06");
// Request body
StringEntity reqEntity = new StringEntity(body,"UTF-8");
request.setEntity(reqEntity);
HttpResponse response = httpclient.execute(request);
HttpEntity entity = response.getEntity();
if (entity != null)
{
System.out.println(EntityUtils.toString(entity));
}
}
catch (Exception e)
{
System.out.println("error");
System.out.println(e.getMessage());
}
}
//寫一個md5加密的方法
public static String md5(String plainText) {
//定義一個位元組數組
byte[] secretBytes = null;
try {
// 生成一個MD5加密計算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
//對字元串進行加密
md.update(plainText.getBytes());
//獲得加密後的資料
secretBytes = md.digest();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("沒有md5這個算法!");
}
//将加密後的資料轉換為16進制數字
String md5code = new BigInteger(1, secretBytes).toString(16);// 16進制數字
// 如果生成數字未滿32位,需要前面補0
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
//計算簽名
public static String encode(String accessKey, String data) {
try {
byte[] keyBytes = accessKey.getBytes("UTF-8");
byte[] dataBytes = data.getBytes("UTF-8");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec(keyBytes, "HmacSHA1"));
return new String(Base64.encodeBase64(mac.doFinal(dataBytes)));
} catch (UnsupportedEncodingException var5) {
throw new RuntimeException("Not supported encoding method UTF-8", var5);
} catch (NoSuchAlgorithmException var6) {
throw new RuntimeException("Not supported signature method hmac-sha1", var6);
} catch (InvalidKeyException var7) {
throw new RuntimeException("Failed to calculate the signature", var7);
}
}
}
删除隊列
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URI;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class DeleteMNSQueue {
public static void main(String[] args) {
//參數設定
String AccessKeySecret = "********";//Access Key Secret
String AccessKeyId = "********";//AccessKey ID
String AccountId = "********";
//擷取GMT英文格式時間
Date d=new Date();
DateFormat format=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z",Locale.ENGLISH);//英文格式的時間轉換時需要帶上Locale.ENGLISH,否則會轉換失敗,因為它預設的是本地化的設定,除非你的作業系統是英文的,總之時間轉換時需要時間格式與模式保持一緻。
format.setTimeZone(TimeZone.getTimeZone("GMT"));
String date = format.format(d);
//構造簽名String
String SignString = "DELETE\n" +
"\n"+"\n"+
date + "\n"+
"x-mns-version:2015-06-06" +"\n"+
"/queues/TestQueue123";
String sign = encode(AccessKeySecret,SignString);
String Authorization = "MNS " + AccessKeyId + ":" + sign;
HttpClient httpclient = HttpClients.createDefault();
try
{
URIBuilder builder = new URIBuilder("http://" + AccountId + ".mns.cn-hangzhou.aliyuncs.com/queues/TestQueue123");//在青島區域建立Project
URI uri = builder.build();
HttpDelete request = new HttpDelete(uri);
request.setHeader("Authorization", Authorization);
request.setHeader("Date", date);
request.setHeader("Host", AccountId + ".mns.cn-hangzhou.aliyuncs.com");
request.setHeader("x-mns-version","2015-06-06");
HttpResponse response = httpclient.execute(request);
HttpEntity entity = response.getEntity();
if (entity != null)
{
System.out.println(EntityUtils.toString(entity));
}
}
catch (Exception e)
{
System.out.println("error");
System.out.println(e.getMessage());
}
}
//寫一個md5加密的方法
public static String md5(String plainText) {
//定義一個位元組數組
byte[] secretBytes = null;
try {
// 生成一個MD5加密計算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
//對字元串進行加密
md.update(plainText.getBytes());
//獲得加密後的資料
secretBytes = md.digest();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("沒有md5這個算法!");
}
//将加密後的資料轉換為16進制數字
String md5code = new BigInteger(1, secretBytes).toString(16);// 16進制數字
// 如果生成數字未滿32位,需要前面補0
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
//計算簽名
public static String encode(String accessKey, String data) {
try {
byte[] keyBytes = accessKey.getBytes("UTF-8");
byte[] dataBytes = data.getBytes("UTF-8");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec(keyBytes, "HmacSHA1"));
return new String(Base64.encodeBase64(mac.doFinal(dataBytes)));
} catch (UnsupportedEncodingException var5) {
throw new RuntimeException("Not supported encoding method UTF-8", var5);
} catch (NoSuchAlgorithmException var6) {
throw new RuntimeException("Not supported signature method hmac-sha1", var6);
} catch (InvalidKeyException var7) {
throw new RuntimeException("Failed to calculate the signature", var7);
}
}
}
發送消息
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URI;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class SendMessageToMNSQueue {
public static void main(String[] args) {
//參數設定
String AccessKeySecret = "******";//Access Key Secret
String AccessKeyId = "******";//AccessKey ID
String AccountId = "********";
//擷取GMT英文格式時間
Date d=new Date();
DateFormat format=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z",Locale.ENGLISH);//英文格式的時間轉換時需要帶上Locale.ENGLISH,否則會轉換失敗,因為它預設的是本地化的設定,除非你的作業系統是英文的,總之時間轉換時需要時間格式與模式保持一緻。
format.setTimeZone(TimeZone.getTimeZone("GMT"));
String date = format.format(d);
//延遲消息
String body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
" <Message xmlns=\"http://mns.aliyuncs.com/doc/v1/\">\n" +
" <MessageBody>The Test Message!</MessageBody>\n" +
" <DelaySeconds>0</DelaySeconds>\n" +
" <Priority>1</Priority>\n" +
" </Message>";
//構造簽名String
String SignString = "POST\n" +
"\n"+
"text/xml;charset=utf-8"+
"\n"+
date + "\n"+
"x-mns-version:2015-06-06" +"\n"+
"/queues/TestQueue123/messages";
String sign = encode(AccessKeySecret,SignString);
String Authorization = "MNS " + AccessKeyId + ":" + sign;
HttpClient httpclient = HttpClients.createDefault();
try
{
URIBuilder builder = new URIBuilder("http://" + AccountId + ".mns.cn-hangzhou.aliyuncs.com/queues/TestQueue123/messages");
URI uri = builder.build();
HttpPost request = new HttpPost(uri);
request.setHeader("Authorization", Authorization);
request.setHeader("Date", date);
request.setHeader("Host", AccountId + ".mns.cn-hangzhou.aliyuncs.com");
request.setHeader("Content-Type","text/xml;charset=utf-8");
request.setHeader("x-mns-version","2015-06-06");
// Request body
StringEntity reqEntity = new StringEntity(body,"UTF-8");
request.setEntity(reqEntity);
HttpResponse response = httpclient.execute(request);
HttpEntity entity = response.getEntity();
if (entity != null)
{
System.out.println(EntityUtils.toString(entity));
}
}
catch (Exception e)
{
System.out.println("error");
System.out.println(e.getMessage());
}
}
//寫一個md5加密的方法
public static String md5(String plainText) {
//定義一個位元組數組
byte[] secretBytes = null;
try {
// 生成一個MD5加密計算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
//對字元串進行加密
md.update(plainText.getBytes());
//獲得加密後的資料
secretBytes = md.digest();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("沒有md5這個算法!");
}
//将加密後的資料轉換為16進制數字
String md5code = new BigInteger(1, secretBytes).toString(16);// 16進制數字
// 如果生成數字未滿32位,需要前面補0
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
//計算簽名
public static String encode(String accessKey, String data) {
try {
byte[] keyBytes = accessKey.getBytes("UTF-8");
byte[] dataBytes = data.getBytes("UTF-8");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec(keyBytes, "HmacSHA1"));
return new String(Base64.encodeBase64(mac.doFinal(dataBytes)));
} catch (UnsupportedEncodingException var5) {
throw new RuntimeException("Not supported encoding method UTF-8", var5);
} catch (NoSuchAlgorithmException var6) {
throw new RuntimeException("Not supported signature method hmac-sha1", var6);
} catch (InvalidKeyException var7) {
throw new RuntimeException("Failed to calculate the signature", var7);
}
}
}
消費消息
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URI;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class GetMessageFromMNSQueue {
public static void main(String[] args) {
//參數設定
String AccessKeySecret = "********";//Access Key Secret
String AccessKeyId = "********";//AccessKey ID
String AccountId = "********";
//擷取GMT英文格式時間
Date d=new Date();
DateFormat format=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z",Locale.ENGLISH);//英文格式的時間轉換時需要帶上Locale.ENGLISH,否則會轉換失敗,因為它預設的是本地化的設定,除非你的作業系統是英文的,總之時間轉換時需要時間格式與模式保持一緻。
format.setTimeZone(TimeZone.getTimeZone("GMT"));
String date = format.format(d);
//構造簽名String
String SignString = "GET\n" +
"\n"+
"\n"+
date + "\n"+
"x-mns-version:2015-06-06" +"\n"+
"/queues/TestQueue123/messages?waitseconds=30";
String sign = encode(AccessKeySecret,SignString);
String Authorization = "MNS " + AccessKeyId + ":" + sign;
HttpClient httpclient = HttpClients.createDefault();
try
{
URIBuilder builder = new URIBuilder("http://" + AccountId + ".mns.cn-hangzhou.aliyuncs.com/queues/TestQueue123/messages?waitseconds=30");
URI uri = builder.build();
HttpGet request = new HttpGet(uri);
request.setHeader("Authorization", Authorization);
request.setHeader("Date", date);
request.setHeader("Host", AccountId + ".mns.cn-hangzhou.aliyuncs.com");
request.setHeader("x-mns-version","2015-06-06");
HttpResponse response = httpclient.execute(request);
HttpEntity entity = response.getEntity();
if (entity != null)
{
System.out.println(EntityUtils.toString(entity));
}
}
catch (Exception e)
{
System.out.println("error");
System.out.println(e.getMessage());
}
}
//寫一個md5加密的方法
public static String md5(String plainText) {
//定義一個位元組數組
byte[] secretBytes = null;
try {
// 生成一個MD5加密計算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
//對字元串進行加密
md.update(plainText.getBytes());
//獲得加密後的資料
secretBytes = md.digest();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("沒有md5這個算法!");
}
//将加密後的資料轉換為16進制數字
String md5code = new BigInteger(1, secretBytes).toString(16);// 16進制數字
// 如果生成數字未滿32位,需要前面補0
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
//計算簽名
public static String encode(String accessKey, String data) {
try {
byte[] keyBytes = accessKey.getBytes("UTF-8");
byte[] dataBytes = data.getBytes("UTF-8");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec(keyBytes, "HmacSHA1"));
return new String(Base64.encodeBase64(mac.doFinal(dataBytes)));
} catch (UnsupportedEncodingException var5) {
throw new RuntimeException("Not supported encoding method UTF-8", var5);
} catch (NoSuchAlgorithmException var6) {
throw new RuntimeException("Not supported signature method hmac-sha1", var6);
} catch (InvalidKeyException var7) {
throw new RuntimeException("Failed to calculate the signature", var7);
}
}
}
更多參考
RESTfulAPI概述備注: 示例代碼僅供快速測試使用,未做備援處理。