このトピックでは、メッセージサービス(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>