DNS サービスは、各アクセスリクエストに対して認証を実行します。したがって、HTTP あるいは HTTPS の、いずれのプロトコルで送信された場合でも、各リクエストには署名 (Signature) 情報が含まれている必要があります。DNS は AccessKey ID と AccessKey Secret の対称暗号化を使用して、リクエスト送信者の個人情報を確認します。
AccessKey ID と AccessKey Secret は、Alibaba Cloud によって訪問者に正式に発行されます (訪問者は、Alibaba Cloud の公式 Web サイトで申請し管理できます)。AccessKey ID は、訪問者の身元を示します。AccessKey Secret は、サーバー上の署名文字列を暗号化して検証するために使用される秘密鍵です。厳密に機密保持されなければならず、Alibaba Cloud とユーザーにのみ知られている必要があります。
方法
ユーザーが API を呼び出すと、次の方法でリクエストに署名します。
正規化されたクエリ文字列が、 リクエストパラメーターを使用して作成されます。
リクエストパラメーターは、パラメーター名でアルファベット順に並べられます。これには、パブリックリクエストパラメーターおよびリクエストインターフェイスに固有のパラメーターが含まれますが、「パブリックリクエストパラメーター」で説明されている Signature パラメーターは含まれません。
注意:
- ソート方法では、大文字と小文字が厳密に区別されます。
- リクエストが GET メソッドを使用して発行された場合、これらのパラメーターはリクエスト URI のパラメーターセクション (すなわち、”?” に続いて “&” で接続される URI のセクション) に入ります。
各リクエストパラメーターの名前と値はエンコードされます。名前と値は、UTF-8 文字セットを使用してURL エンコードされている必要があります。 URL エンコードルール は次のとおりです。
- 文字 A〜Z、a〜z、0〜9、ハイフン (-)、アンダースコア (_)、ピリオド (.)、およびチルダ (~) はエンコードされません。
- その他の文字は「%XY」形式でエンコードされ、XY は ASCII コードで 16 進表記されます。たとえば、英語の二重引用符 (“) は %22 としてエンコードされます。
- 拡張 UTF-8 文字は「%XY%ZA…」形式でエンコードされます。
- 英語のスペースは、プラス記号 (+) ではなく %20 としてエンコードされます。
注意: 通常、URL エンコードをサポートするライブラリ (Java の java.net.URLEncoder など) はすべて、”application/x-www-form-urlencoded” MIME タイプのルールに従ってエンコードされます。具体的には、前述のエンコードルールに従うコード化文字列を生成するには、プラス記号 (+) を %20 に、アスタリスク (*) を %2A に、%7E をチルダ (~) に置き換えます。
エンコードされたパラメーターの名前と値は、英語の等号 (=) で接続されます。
パラメーター名と値のペアはアルファベット順にソートされ、アンパサンド (&) で接続されて、正規化されたクエリ文字列 (Canonicalized Query String) を生成します。
作成した正規化されたクエリ文字列を使用して、次のルールに従って署名計算用の文字列を作成します。
StringToSign=
HTTPMethod + “&” +
percentEncode(“/”) + ”&” +
percentEncode(CanonicalizedQueryString)
ここで、
HTTPMethod
はリクエストの送信に使用されます。たとえば、GET
。percentEncode("/")
は、文字 “/“ のコード化された値 (つまり、%2F
) です。percentEncode(CanonicalizedQueryString)
は、生成された正規化クエリ文字列をエンコードした文字列で、URL エンコードルールに従って生成されます。
RFC2104 で定義されているように、署名の HMAC 値を計算するために、上記の署名文字列が使用されます。
注意: 署名の計算に使用されるキーは、ユーザーが保持する AccessKey Secret の終わりに ”&” 文字 (ASCII:38) を付けたもので、SHA1 のハッシュアルゴリズムを使用します。
Base64 エンコードルールに従って、上記の HMAC 値は文字列にエンコードされます。これにより、署名値が得られます。
得られた署名値をリクエストパラメーターに “Signature” パラメーターとして追加して、リクエストに署名します。
注意: 得られた署名値が最終的にリクエストパラメーター値として DNS サーバに送信される際に、他のパラメーターと同様、その値は RFC3986 のルールに従って URL エンコードされます。
例
例として DescribeDomainRecords を取り上げます。署名する前のリクエスト URL は次のとおりです。
http://dns.aliyuncs.com/
?TimeStamp=2014-08-15T11%3A10%3A07Z
&Format=xml&AccessKeyId=testid
&Action=DescribeDomainRecords
&SignatureMethod=HMAC-SHA1&DomainName=example.com
&SignatureNonce=1324fd0e-e2bb-4bb1-917c-bd6e437f1710
&SignatureVersion=1.0
&Version=2015-01-09
したがって、StringToSign は次のようになります。
GET
&%2F&AccessKeyId%3Dtestid
&Action%3DDescribeDomainRecords
&Format%3Dxml&DomainName%3Dexample.com
&SignatureMethod%3DHMAC-SHA1
&SignatureNonce%3D1324fd0e-e2bb-4bb1-917c-bd6e437f1710
&SignatureVersion%3D1.0
&TimeStamp%3D2014-08-15T11%253A10%253A07Z
&Version%3D2015-01-09
“AccessKey ID” が ”testid” であり、”AccessKey Secret” が ”testsecret” であり、HMAC 計算に使用されるキーが ”testsecret&” であると仮定すると、計算された署名値は次のとおりです。
SmhZuLUnXmqxSEZ/GqyiwGqmf+M=
署名されたリクエスト URL は次のとおりです (追加された Signature パラメーターに注意してください) 。
http://dns.aliyuncs.com/?TimeStamp=2014-08-15T11%3A10%3A07Z&Format=xml&AccessKeyId=testid&Action=DescribeDomainRecords&SignatureMethod=HMAC-SHA1&DomainName=example.com&SignatureNonce=1324fd0e-e2bb-4bb1-917c-bd6e437f1710&SignatureVersion=1.0&Version=2015-01-09&Signature=SmhZuLUnXmqxSEZ%2FGqyiwGqmf%2BM%3D