セキュリティを確保するために、すべての API リクエストに署名する必要があります。Alibaba Cloud は、リクエスト署名を使用して API 呼び出し元の ID を検証します。各 API リクエストは、HTTP または HTTPS のどちらを使用して送信されるかに関係なく、署名を含める必要があります。
概要
RESTful API リクエストに署名するには、認証 パラメーターを次の形式でリクエストヘッダーに追加する必要があります。
Authorization:acs:AccessKeyId:Signatureacs: Alibaba Cloud Service の略です。これは固定フィールドであり、変更できません。
AccessKeyId: API の呼び出しに使用される AccessKey ID です。
署名: AccessKey シークレットを使用してリクエストが対称的に暗号化された後に生成される署名です。
署名の計算
署名アルゴリズムは、RFC 2104 の HMAC-SHA1 仕様に準拠しています。AccessKey シークレットを使用して、エンコードおよびフォーマットされたクエリ文字列の HMAC 値を計算し、HMAC 値を署名として使用します。リクエストの一部の パラメーター は署名の計算に使用されます。したがって、リクエストの署名は API リクエスト パラメーターによって異なります。
Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(
StringToSign)) )署名を計算するには、次の手順を実行します。
署名対象文字列を作成します。
署名対象文字列は、API リクエストの関連要素を使用して組み立てられた文字列です。署名の計算に使用され、次の要素が含まれます。
HTTP ヘッダー
Alibaba Cloud プロトコルヘッダー (CanonicalizedHeaders)
正規化リソース (CanonicalizedResource)
本文
署名対象文字列は、次の形式で作成する必要があります。
StringToSign = //HTTP ヘッダー HTTP-Verb + "\n" + Accept + "\n" + Content-MD5 + "\n" +//MD5 アルゴリズムを使用して暗号化されたリクエスト本文を指定します。 Content-Type + "\n" + Date + "\n" + //Alibaba Cloud プロトコルヘッダー (CanonicalizedHeaders) CanonicalizedHeaders + //正規化リソース (CanonicalizedResource) CanonicalizedResource元のサンプルリクエスト:
POST /stacks?name=test_alert&status=COMPLETE HTTP/1.1 Host: ***.aliyuncs.com Accept: application/json Content-MD5: ChDfdfwC+Tn874znq7Dw7Q== Content-Type: application/x-www-form-urlencoded;charset=utf-8 Date: Thu, 22 Feb 2018 07:46:12 GMT x-acs-signature-nonce: 550e8400-e29b-41d4-a716-446655440000 x-acs-signature-method: HMAC-SHA1 x-acs-signature-version: 1.0 x-acs-version: 2016-01-02正規化されたサンプルリクエスト:
POST application/json ChDfdfwC+Tn874znq7Dw7Q== application/x-www-form-urlencoded;charset=utf-8 Thu, 22 Feb 2018 07:46:12 GMT x-acs-signature-nonce: 550e8400-e29b-41d4-a716-446655440000 x-acs-signature-method:HMAC-SHA1 x-acs-signature-version:1.0 x-acs-version:2016-01-02 /stacks?name=test_alert&status=COMPLETE署名文字列を追加します。
計算された署名文字列を、次の形式でリクエストヘッダーに追加します。
Authorization: acs AccessKeyId:Signature
HTTP ヘッダー
署名対象文字列の HTTP ヘッダーには、次の パラメーター の値が含まれている必要があります。パラメーターはアルファベット順にソートする必要があります。パラメーターに値がない場合は、\n に設定します。
Accept: クライアントが必要とするレスポンス タイプ。有効な値: application/json および application/xml。
Content-MD5: リクエスト本文の Base64 でエンコードされた 128 ビット MD5 ハッシュ値。
Content-Type: HTTP リクエスト本文のタイプ。タイプは RFC 2616 で定義されています。
Date: HTTP 1.1 で指定された GMT 時刻。例: Wed, 05 Sep.2012 23:00:00 GMT。
説明HTTP ヘッダーに AccessKey ペアを指定する必要はありません。
元のサンプルヘッダー:
Accept: application/json
Content-MD5: ChDfdfwC+Tn874znq7Dw7Q==
Content-Type: application/x-www-form-urlencoded;charset=utf-8
Date: Thu, 22 Feb 2018 07:46:12 GMT正規化されたサンプルヘッダー:
application/json
ChDfdfwC+Tn874znq7Dw7Q==
application/x-www-form-urlencoded;charset=utf-8
Thu, 22 Feb 2018 07:46:12 GMTAlibaba Cloud プロトコルヘッダー (CanonicalizedHeaders)
CanonicalizedHeaders は、Alibaba Cloud の非標準 HTTP ヘッダーです。これらは、リクエストで x-acs- というプレフィックスが付いた パラメーター です。リクエストには、次の パラメーター が含まれている必要があります。
x-acs-signature-nonce: リプレイ攻撃を防ぐために使用される一意の乱数。異なるリクエストには異なる番号を使用する必要があります。
x-acs-signature-version: 署名暗号化アルゴリズムのバージョン。1.0 に設定します。
x-acs-version: API のバージョン番号。
Alibaba Cloud の正規化ヘッダーを作成するには、次の手順を実行します。
x-acs-というプレフィックスが付いたすべての HTTP リクエストヘッダーの名前を小文字に変換します。たとえば、X-acs-OSS-Meta-Name: TaoBaoをx-acs-oss-meta-name: TaoBaoに変換します。前の手順で取得したすべての HTTP リクエストヘッダーをアルファベット順に並べ替えます。
リクエストヘッダーとその内容の間の区切り文字の両側からスペースを削除します。たとえば、
x-acs-oss-meta-name: TaoBao,Alipayをx-acs-oss-meta-name:TaoBao,Alipayに変換します。すべてのヘッダーと内容を区切り文字 (\n) で区切って、最終的な CanonicalizedHeaders を形成します。
元のサンプルヘッダー:
x-acs-signature-nonce: 550e8400-e29b-41d4-a716-446655440000
x-acs-signature-method: HMAC-SHA1
x-acs-signature-version: 1.0
x-acs-version: 2016-01-02GMT正規化されたサンプルヘッダー:
x-acs-signature-nonce:550e8400-e29b-41d4-a716-446655440000
x-acs-signature-method:HMAC-SHA1
x-acs-signature-version:1.0
x-acs-version:2016-01-02正規化リソース (CanonicalizedResource)
CanonicalizedResource は、アクセスするリソースの正規表現です。サブリソースとクエリ パラメーター を辞書順に昇順でソートし、アンパサンド (&) で区切ってサブリソース文字列を生成します。サブリソース文字列は、疑問符 (?) の後に続くすべてのパラメーターで構成されます。
元のサンプルリクエスト:
/stacks?status=COMPLETE&name=test_alert正規化されたサンプルリクエスト:
/stacks?name=test_alert&status=COMPLETE本文
リクエスト本文を MD5 アルゴリズムを使用して暗号化し、暗号化されたリクエスト本文を Base64 でエンコードし、Base64 でエンコードされた文字列を Content-MD5 パラメーターの値に追加します。