STSサービスは、アクセスリクエストするたびにID認証を行います。 それにより、HTTPまたはHTTPSを通じて送信する場合は、リクエストには署名情報が含まれる必要があります。 STSはAccessKey IDAccessKey Secret を通じての対称暗号化という方式でリクエスト送信者の個人情報を認証します。 AccessKey IDAccess Key Secretは、Alibabaクラウドよりリクエスト送信者に対して公式に発行されます(クエスト送信者はAlibabaクラウドの公式Webサイトでこれらの情報を申請し、管理できます)。 AccessKey IDはリクエスト送信者のIDを示します。 AccessKey Secretは署名文字列を暗号化するに使用される秘密鍵であり、サーバーで署名文字列を認証する際にも用いられます。 この情報は機密として厳密に取り扱い、Alibabaクラウドと認証済みリクエスト送信者以外には知られないようにしてください。

リクエスト署名プロセス

  1. リクエストパラメータを使用して、正規化クエリ文字列を作成します。
    1. すべてのリクエストパラメータ (「パブリックリクエストパラメーター」と、このドキュメントで取り上げる任意のリクエストインターフェイスに対するユーザー定義パラメータが含まれますが、「パブリックリクエストパラメータ」に説明のあるSignatureパラメータは含まれません) をパラメーター名のアルファベット順に並べ替えます。
      「GET」メソッドを使用してリクエストを送信する際に、これらのパラメータはリクエスト URL (URLのアンパーサンド 「&」 に続く疑問符 「?」の後ろの部分) に含まれます。
    2. 各リクエストパラメータの名前と値をエンコードします。 UTF-8 文字セットを使用した URL エンコードが必要です。URL エンコーディングのルールは次のとおりです。
      • 大文字 (A ~ Z)、小文字 (a ~ z)、整数 (0 ~ 9)、および一部の記号 (ハイフン “-“、アンダーバー “_”、ピリオド “.”、チルダ “~” など) はエンコードされません。
      • 他の文字は “%XY” 形式でエンコードします。この XY は、文字の ASCII コードを 16 進表記することを意味します。 たとえば、二重引用符 (“) は “%22” です。
      • 半角スペース ( ) はプラス記号 “+” ではなく、”%20” としてエンコードされることに注意してください。
      一般的に、URL エンコーディングされたライブラリ(Javaの「java.net.URLEncoder」など) は、「application/x-www-form-urlencoded」形式のMIMEタイプのルールに基づいてエンコードされます。 このエンコーディング方法を使用するには、前述のエンコーディングルールに合わせて、エンコードされた文字列内のプラス記号 「+」を「%20」に、アスタリスク「*」を「%2A」に直接置き換え、「%7E」をチルダ「~」に戻します。
    3. エンコードしたパラメーター名と値を半角の等号「=」で連結します。
    4. 等号で結んだパラメーター名と値のペアを、アンパーサンド「&」を使用してパラメーター名のアルファベット順に連結して、正規化クエリ文字列を作成します。
  2. 次のルールに従って正規化クエリ文字列を使用し、署名計算用の文字列を作成します:
    StringToSign=
    HTTPMethod + “&” +
    percentEncode(“/”) + ”&” +
    percentEncode(CanonicalizedQueryString)

    ここで「HTTPMethod」は、リクエストの送信に使用する HTTP メソッド (“GET” など) です。 「percentEncode (「/」)」 は、1.b で説明したURLエンコーディングルールに従って文字「/」をエンコードした値 (「%2F」) です。

    「percentEncode(CanonicalizedQueryString)」 は、1.b のURLエンコーディングルールに従ってエンコードした正規化クエリ文字列です。

  3. RFC2104の定義に基づいて、署名計算のための文字列を使用して署名のHMAC値を計算します。 注意: 署名計算に使用するキーは、 Access Key Secretにアンパーサンド “&” (ASCII: 38) を付加したもので、ハッシュアルゴリズムSHA1に基づいています。
  4. Base64コーディングルールに基づいて HMAC 値を文字列にエンコードし、署名値を取得します。
  5. 取得した署名値を「Signature」パラメータとしてリクエストパラメータに追加し、リクエスト署名プロセスを完了します。 注意: 取得した署名値は、最終的なリクエストパラメーター値として STS サーバーに送信する前に、他のパラメーターと同様、RFC3986ルールに基づいてURLエンコーディングする必要があります。

「AssumeRole」を例として使用した場合、署名前のリクエスト URL は次のようになります:

https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-09-01T05%3A57%3A34Z&RoleArn=acs%3Aram%3A%3A1234567890123%3Arole%2Ffirstrole&RoleSessionName=client&AccessKeyId=testid&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Action=AssumeRole&SignatureNonce=571f8fb8-506e-11e5-8e12-b8e8563dc8d2

対応するStringToSignisは:

GET&%2F&AccessKeyId%3Dtestid%26Action%3DAssumeRole%26Format%3DJSON%26RoleArn%3Dacs%253Aram%253A%253A1234567890123%253Arole%252Ffirstrole%26RoleSessionName%3Dclient%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D571f8fb8-506e-11e5-8e12-b8e8563dc8d2%26SignatureVersion%3D1.0%26Timestamp%3D2015-09-01T05%253A57%253A34Z%26Version%3D2015-04-01

AccessKeyIdパラメータ値を「testid」、 AccessKeySecretパラメータ値を「testsecret」とすると、HMACの計算に使用するKeyは「Testsecret&」、計算結果の署名値は次のようになります:

gNI7b0AyKZHxDgjBGPDgJ1Ce3L4=

署名付きリクエストURLは次のようになります(「Signature」 パラメータが追加されています)。

https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-09-01T05%3A57%3A34Z&RoleArn=acs%3Aram%3A%3A1234567890123%3Arole%2Ffirstrole&RoleSessionName=client&AccessKeyId=testid&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=gNI7b0AyKZHxDgjBGPDgJ1Ce3L4%3D&Action=AssumeRole&SignatureNonce=571f8fb8-506e-11e5-8e12-b8e8563dc8d2