すべてのプロダクト
Search
ドキュメントセンター

:リクエストの署名

最終更新日:Mar 14, 2025

このトピックでは、メッセージサービス(MNS)の署名メカニズムの要素と計算方法について説明します。この記事では、API リクエストに署名する方法の例も示します。

要素

MNS は、データセキュリティを確保するために各 API リクエストを検証します。そのため、MNS に送信される各リクエストには、Authorization ヘッダーが含まれている必要があります。MNS は、AccessKey ペアを使用した対称暗号化を実装して、リクエスト送信者の ID を検証します。MNS によって計算された署名が Authorization ヘッダーの署名と同じである場合、リクエストは有効です。そうでない場合、MNS はリクエストを拒否し、HTTP ステータスコード 403 を返します。

HTTP リクエストが有効であることを示すには、Authorization ヘッダーを HTTP リクエストに追加し、Authorization ヘッダーに署名を含める必要があります。構文:Authorization: MNS AccessKeyId:Signature

Alibaba Cloud アカウントを使用して、Resource Access Management(RAM)コンソールの AccessKey ペア ページ で AccessKey ID と AccessKey Secret を申請および管理できます。AccessKey ID はユーザーを識別します。AccessKey Secret は署名文字列を暗号化し、サーバーが署名文字列を認証するために使用するキーです。AccessKey ペアは機密にしておく必要があります。

計算方法

Authorization = base64(hmac-sha1(HTTP_METHOD + "\n" 
             + CONTENT-MD5 + "\n"     //リクエストボディのMD5ハッシュ
             + CONTENT-TYPE + "\n"  //リクエストボディのコンテンツ形式
             + DATE + "\n"          //リクエスト送信日時
             + CanonicalizedMNSHeaders //x-mns-で始まるHTTPヘッダーの組み合わせ
             + CanonicalizedResource)) //HTTPリクエストによってリクエストされるリソースのURI 
  • HTTP_METHOD:大文字の HTTP メソッド。

    例:PUT、GET、POST、DELETE。

  • Content-Md5:リクエストボディの MD5 ハッシュ。

    リクエストに CONTENT-MD5 ヘッダーが含まれていない場合は、空の文字列を入力します。

  • CONTENT-TYPE:リクエストボディのコンテンツ形式。

  • DATE:リクエストが送信された時刻。

    • 例:Thu, 07 Mar 2012 18:49:58 GMT。DATE パラメーターの代わりに x-mns-date パラメーターを使用する場合は、x-mns-date パラメーターの値を入力する必要があります。

    • このパラメーターは空の文字列にすることはできず、GMT 形式である必要があります。

    • リクエストの送信後 15 分以内に MNS がリクエストを受信しない場合、MNS はエラーコード 400 を返します。詳細については、「エラーレスポンスの構文」をご参照ください。

  • CanonicalizedMNSHeaders:x-mns- というプレフィックスが付いた HTTP ヘッダーの組み合わせ。

    CanonicalizedHeaders パラメーターの次の命名規則に注意してください。

    • ヘッダーの名前は小文字にする必要があります。

    • ヘッダーは昇順にソートする必要があります。

    • ヘッダー名と値を区切るコロン(:)の前後にスペースを追加しないでください。

    • 各ヘッダーの後には改行(\n)が続きます。x-mns- というプレフィックスが付いたヘッダーがない場合は、CanonicalizedMNSHeaders パラメーターを指定しないでください。

  • CanonicalizedResource:HTTP リクエストによってリクエストされるリソースの URI。

    例:/queues/$queueName?metaOverride=true

説明
  • 署名対象の文字列は UTF-8 形式である必要があります。

  • RFC 2104 で定義されている HMAC-SHA1 署名方式を使用し、AccessKey Secret をキーとして使用します。

  • content-type パラメーターと content-md5 パラメーターは、リクエストではオプションです。これらのパラメーターを指定する必要がない場合は、'' と入力します。

サンプルリクエスト

PUT /queues/$queueName?metaOverride=true HTTP/1.1
Host: $AccountId.mns.cn-hangzhou.aliyuncs.com
Date: Wed, 08 Mar 2012 12:00:00 GMT
Authorization: MNS 15B4D3461F177624****:xQE0diMbL****f3YB+FIEXAMPLE=

<?xml version="1.0" encoding="UTF-8"  ?>
<Queue xmlns="http://mns.aliyuncs.com/doc/v1/">
<VisibilityTimeout >60</VisibilityTimeout>
<MaximumMessageSize>1024</MaximumMessageSize>
<MessageRetentionPeriod>120</MessageRetentionPeriod>
<DelaySeconds>30</DelaySeconds>
</Queue>       

サンプルレスポンス 1

AccessKey ID が存在しないか、無効状態の場合、403 Forbidden エラーが返されます。

Content-Type: text/xml
Content-Length: 314
Date: Wed, 18Mar 2012 08:04:06 GMT
x-mns-request-id: 512B2A634403E52B1956****

<?xml version="1.0" encoding="utf-8"?>
<Error xmlns="http://mns.aliyuncs.com/doc/v1/">
<Code>AccessIDAuthError</Code>
<Message>
    AccessID authentication fail, please check your AccessID and retry.
</Message>
<RequestId>512B2A634403E52B1956****</RequestId>
<HostId>mns.cn-hangzhou.aliyuncs.com</HostId>
</Error>       

サンプルレスポンス 2

ヘッダーに Date パラメーターが指定されていないか、Date パラメーターの形式が無効な場合、403 Forbidden エラーが返されます。

Content-Type: text/xml
Content-Length: 274
Date: Wed, 18Mar 2012 08:04:06 GMT
x-mns-request-id: 512B2A634403E52B1956****

<?xml version="1.0" encoding="UTF-8"?>
<Error xmlns="http://mns.aliyuncs.com/doc/v1/">
<Code>InvalidArgument</Code>
<Message>Date Header is invalid or missing.</Message>
<RequestId>7E1A5CF258F535884403****</RequestId>
<HostId>mns.cn-hangzhou.aliyuncs.com</HostId>
</Error>         

サンプルレスポンス 3

リクエストの送信後 15 分以内に MNS がリクエストを受信しない場合、408 Request Timeout エラーが返されます。

Content-Type: text/xml
Content-Length: 283
Date: Wed, 11 May 2011 09:01:51 GMT
x-mns-request-id: 512B2A634403E52B1956****

<?xml version="1.0"  encoding="UTF-8"?>
<Error xmlns="http://mns.aliyuncs.com/doc/v1/">
<Code>TimeExpired</Code>
<Message>
        The http request you sent is expired.
</Message>
<RequestId>512B2A634403E52B1956****</RequestId>
<HostId>mns.cn-hangzhou.aliyuncs.com</HostId>
</Error>