Tüm Ürünler
Search
Belge Merkezi

Direct Mail:İstek imzaları

Son Güncelleme:Oct 04, 2026

Direct Mail, her API isteğini AccessKey çiftinizden türetilen bir HMAC-SHA1 imzasıyla doğrular.

Not:

  • Bir Alibaba Cloud SDK (Java, PHP ve C# için kullanılabilir) kullanıyorsanız bu konuyu atlayabilirsiniz.

  • API GET ve POST isteklerini destekler ancak StringToSign bu iki yöntem arasında farklılık gösterir.

HTTP veya HTTPS üzerinden gönderilmesine bakılmaksızın her istek bir imza içermelidir. Direct Mail, göndereni doğrulamak için bir AccessKey ID ve AccessKey secret kullanır. AccessKey çiftlerinizi Kullanıcı Bilgileri Yönetimi konsolunda yönetebilirsiniz. AccessKey ID, istekte bulunan kişiyi tanımlar; AccessKey secret ise isteği imzalar ve sunucu tarafında doğrulanmasını sağlar. AccessKey secret bilginizi gizli tutun.

İmzalama adımları

Bir isteği imzalamak için:

  1. İstek parametrelerinden kanonikleştirilmiş bir sorgu dizesi oluşturun.

    a. Parametreleri sıralayın.

    Tüm istek parametrelerini (ortak ve API'ye özel) ada göre alfabetik olarak sıralayın. Signature parametresini hariç tutun.

    Not: GET isteklerinde bu parametreler, istek URL'sinde ? işaretinden sonra gelen ve & ile ayrılan kısımdır.

    b. Her parametre adını ve değerini kodlayın.

    Adları ve değerleri UTF-8 kullanarak URL kodlamasına tabi tutun. Kurallar şunlardır:

    • A-Z, a-z, 0-9, -, _, . veya ~ karakterlerini kodlamayın.

    • Diğer karakterleri %XY biçiminde kodlayın; burada XY onaltılık ASCII değeridir. Örnek: " → %22.

    • Çok baytlı UTF-8 karakterlerini %XY%ZA… biçiminde kodlayın.

    • Boşlukları + yerine %20 olarak kodlayın.

    Önemli: Standart URL kodlama kitaplıkları (örneğin java.net.URLEncoder) application/x-www-form-urlencoded kurallarını izler. Kodlama işleminden sonra + karakterini %20, * karakterini %2A ve %7E karakterini ~ ile değiştirin.

    c. Kodlanmış her adı ve değeri = ile birleştirin.

    d. Tüm ad-değer çiftlerini, a adımındaki sıralı düzene göre & ile birleştirin. Bu işlem, kanonikleştirilmiş sorgu dizesini üretir.

  2. Aşağıdaki biçimde string-to-sign (imzalanacak dize) oluşturun:

     StringToSign=
     HTTPMethod + "&" +
     percentEncode("/") + "&" +
     percentEncode(CanonicalizedQueryString)        

    HTTPMethod, HTTP yöntemidir (GET veya POST).

    percentEncode("/"), 1.b adımındaki kurallara göre / karakterini kodlar ve sonuç %2F olur.

    percentEncode(CanonicalizedQueryString), 1. adımdaki kanonikleştirilmiş sorgu dizesini 1.b adımındaki kurallara göre kodlar. Not: Bu işlem çift kodlanmış bir sonuç üretir.

  3. HMAC değerini hesaplayın.

    StringToSign için RFC2104 standardında tanımlandığı gibi HMAC-SHA1 hesaplaması yapın.

    Not: İmzalama anahtarı, AccessKeySecret değerinizin ardından & (ASCII 38) karakterinin eklenmesiyle oluşur. Hash algoritması SHA1'dir.

  4. İmza değerini hesaplayın.

    3. adımdaki HMAC değerini Base64 ile kodlayın. Elde edilen sonuç imzadır.

  5. İmzayı, Signature parametresi olarak isteğe ekleyin.

    Not: Signature değeri, diğer parametreler gibi RFC3986 standardına uygun olarak URL kodlanmalıdır.

İmzalama örneği

Bu örnek, bir SingleSendMail POST isteğinin imzalanmasını gösterir.

İstek URL'si: http://dm.aliyuncs.com/

İstek parametreleri:

AccessKeyId=testid&AccountName=<a%b'>&Action=SingleSendMail&AddressType=1&Format=XML&HtmlBody=4&RegionId=cn-hangzhou&ReplyToAddress=true&SignatureMethod=HMAC-SHA1&SignatureNonce=c1b2c332-4cfb-4a0f-b8cc-ebe622aa0a5c&SignatureVersion=1.0&Subject=3&TagName=2&Timestamp=2016-10-20T06:27:56Z&ToAddress=1@test.com&Version=2015-11-23

StringToSign:

POST&%2F&AccessKeyId%3Dtestid%26AccountName%3D%253Ca%2525b%2527%253E%26Action%3DSingleSendMail%26AddressType%3D1%26Format%3DXML%26HtmlBody%3D4%26RegionId%3Dcn-hangzhou%26ReplyToAddress%3Dtrue%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3Dc1b2c332-4cfb-4a0f-b8cc-ebe622aa0a5c%26SignatureVersion%3D1.0%26Subject%3D3%26TagName%3D2%26Timestamp%3D2016-10-20T06%253A27%253A56Z%26ToAddress%3D1%2540test.com%26Version%3D2015-11-23

AccessKeyId testid ve AccessKeySecret testsecret olduğunda, imzalama anahtarı testsecret& olur. Ortaya çıkan imza:

llJfXJjBW3OacrVgxxsITgYaYm0=

İmzalı POST gövdesi (Signature eklendi ve Content-Type application/x-www-form-urlencoded olarak ayarlandı):

Signature=llJfXJjBW3OacrVgxxsITgYaYm0=&AccessKeyId=testid&AccountName=<a%b'>&Action=SingleSendMail&AddressType=1&Format=XML&HtmlBody=4&RegionId=cn-hangzhou&ReplyToAddress=true&SignatureMethod=HMAC-SHA1&SignatureNonce=c1b2c332-4cfb-4a0f-b8cc-ebe622aa0a5c&SignatureVersion=1.0&Subject=3&TagName=2&Timestamp=2016-10-20T06:27:56Z&ToAddress=1@test.com&Version=2015-11-23

Bu parametreler gönderilmeden önce URL kodlanmalıdır..

Kod örnekleri

Java

private static final String MAC_NAME ="HmacSHA1";
private static final String ENCODING ="UTF-8";

/**
 * Signs encryptText using the HMAC-SHA1 method.
 *
 *@param encryptText The string to be signed.
 *@param encryptKey  The key.
 *@return
 *@throws Exception
 */
public static byte[] HmacSHA1Encrypt(StringencryptText, String encryptKey) throwsException {
byte[] data = encryptKey.getBytes(ENCODING);
// Creates a key from the given byte array. The second parameter specifies the name of the key algorithm.
SecretKey secretKey = new SecretKeySpec(data,MAC_NAME);
// Generates a Mac object for the specified Mac algorithm.
Mac mac = Mac.getInstance(MAC_NAME);
// Initializes the Mac object with the given key.
mac.init(secretKey);
byte[] text = encryptText.getBytes(ENCODING);
// Completes the Mac operation.
return mac.doFinal(text);
}
@Test
public void test() throws Exception {
/*StringToSign=
                HTTPMethod + “&” +
                percentEncode(“/”) + ”&” +
percentEncode(CanonicalizedQueryString)*/
String str ="AccessKeyId=testid&AccountName=<a%b'>&Action=SingleSendMail&AddressType=1&Format=XML&HtmlBody=4&RegionId=cn-hangzhou&ReplyToAddress=true&SignatureMethod=HMAC"+
"-SHA1&SignatureNonce=c1b2c332-4cfb-4a0f-b8cc-ebe622aa0a5c&SignatureVersion=1.0&Subject=3&TagName=2&Timestamp=2016-10-20T06:27:56Z&ToAddress=1@test.com&Version=2015-11-23";
String percentStr = "";
String[] strs = str.split("&");
for (int i = 0; i < strs.length;i++) {
String[] str1 =strs[i].split("=");
if (str1.length == 1){
                percentStr = percentStr + getUtf8Encoder(str1[0])+ "=" + getUtf8Encoder("")+ "&";
}else {
                percentStr = percentStr + getUtf8Encoder(str1[0])+ "=" + getUtf8Encoder(str1[1]) + "&";
            }
}
percentStr =percentStr.substring(0,percentStr.lastIndexOf("&"));
String percent = URLEncoder.encode("/","UTF-8");
percentStr = getUtf8Encoder(percentStr);
String toSign = HttpMethod.POST + "&"+ percent +"&" + percentStr;
System.out.println("--------------"+ toSign);
/*POST&%2F&AccessKeyId%3Dtestid%26AccountName%3D%253Ca%2525b%2527%253E%26Action%3DSingleSendMail%26AddressType%3D1%26Format%3DXML%26HtmlBody%3D4%26RegionId%3Dcn-hangzhou%26ReplyToAddress%3Dtrue%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3Dc1b2c332-4cfb-4a0f-b8cc-ebe622aa0a5c%26SignatureVersion%3D1.0%26Subject%3D3%26TagName%3D2%26Timestamp%3D2016-10-20T06%253A27%253A56Z%26ToAddress%3D1%2540test.com%26Version%3D2015-11-23*/
byte[] bytes = HmacSHA1Encrypt(toSign,"testsecret&");
String base64Str = Base64.encode(bytes);
System.out.println(base64Str);//llJfXJjBW3OacrVgxxsITgYaYm0=
}
private String getUtf8Encoder(String param) throwsUnsupportedEncodingException {
return URLEncoder.encode(param, "UTF-8")
                .replaceAll("\\+","%20")
                .replaceAll("\\*","%2A")
                .replaceAll("%7E","~");
 };

Python

import hmac
import base64
# Replace StringToSign with the actual content.
message = b'StringToSign'
key = b'testsecret&'
h = hmac.new(key, message, digestmod='sha1')
# print(h.digest())
print(base64.b64encode(h.digest()))

PHP

<?php
function encryptTokey($data){
     $apikey = 'testsecret&';
     $sign = base64_encode(hash_hmac("sha1", $data, $apikey, true));
     //printf($sign);
     return $sign;
}
// Replace StringToSign with the actual content.
echo encryptTokey(StringToSign);
?>

SSS

  • Aralıklı olarak oluşan SignatureDoesNotMatch hataları genellikle kodlamadan sonra özel karakterlerin değiştirilmediğini gösterir. Yukarıdaki Önemli nota bakın.

  • Çözülmemiş imza uyumsuzluğu sorunları için İstek örneği bölümünü kullanın ve kendi parametrelerinizi yerine koyun.