概要
API Gateway には、バックエンドの HTTP サービス署名認証機能があります。 バックエンド署名を有効化するには、署名鍵を作成し、該当する API に鍵をバインドする必要があります。( 鍵は適切に保管します。 API Gateway は、鍵のセキュリティを保証するために鍵を暗号化して格納します。) バックエンド署名が有効化されると、API Gateway は署名情報をバックエンド HTTP サービス宛てのリクエストに追加します。 バックエンド HTTP サービスは、API Gateway の署名文字列を読み取り、受信したリクエストに対してローカル署名計算を実行して、API Gateway 署名とローカル署名結果が一致するかどうかをチェックします。
定義したすべてのパラメーターが署名に付加されます。例えば:入力パラメーター、定義済みのシステム パラメーターおよび API Gateway システム パラメーター(CaClientIp など)
バックエンドサービスはVPCであり、VPC環境でAPIを公開する場合、セキュアな通信経路を使用するため、バックエンド署名の必要がありません。
API Gateway の署名を読み取る方法
- API Gateway の計算した署名をリクエストの Header に格納します。 Header名は X-Ca-Signature です。
バックエンド HTTP サービスで署名を追加する方法
署名計算のデモ(Java)の詳細については、https://github.com/aliyun/api-gateway-demo-sign-backend-javaをご参照ください。
署名の計算方法は次のとおりです。
署名の付加に関連するデータを編成
String stringToSign=
HTTPMethod + "\n" + // HTTP Header はすべて大文字にします。
Content-MD5 + "\n" + // Content-MD5 が空であるかを確認します。空であれば改行「\n」をつけます。
Headers + // Headers が空であれば、「\n」は不要です。空でない Headers には「\n」が含まれます。詳細は、以下の編成方法をご参照ください。
Url
署名の計算
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] keyBytes = secret.getBytes("UTF-8");
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
String sign = new String(Base64.encodeBase64(Sha256.doFinal(stringToSign.getBytes("UTF-8")),"UTF-8"));
secret は、API にバインドされている秘密鍵です。
説明
Content-MD5
Content-MD5 は Body の MD5 値を示します。 MD5 は、HTTPMethod が PUT または POST で、Body が Form でない場合にのみ計算されます。 計算方法は次のとおりです。
String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8")));
Header
Header は、署名計算に関連する Header の Key および Value を示します。 署名の計算に関連するすべての Header の Key をリクエストの Header から読み取ります。 Key は X-Ca-Proxy-Signature-Headers です。 複数の Key はカンマで区切ります。
Header の編成方法
署名計算に関連するすべての Header の Key を辞書順にソートし、Header の Key のすべての大文字を小文字に変換し、次の方法で鍵を連結します。
String headers =
HeaderKey1.toLowerCase() + ":" + HeaderValue1 + "\n"\+
HeaderKey2.toLowerCase() + ":" + HeaderValue2 + "\n"\+
...
HeaderKeyN.toLowerCase() + ":" + HeaderValueN + "\n"
URL
URL は、Path + Query + Body の Form パラメーターを示します。 編成方法は次のとおりです。Query または Form が空でない場合は、? を追加し、Query+Form の鍵を辞書順にソートし、次の方法で結合します。 Query または Form が空の場合、URL は Path と同じになります。
String url =
Path +
"?" +
Key1 + "=" + Value1 +
"&" + Key2 + "=" + Value2 +
...
"&" + KeyN + "=" + ValueN
Query または Form には複数の値がある場合があることにご注意ください。 複数の値がある場合は、署名計算には最初の値を使用します。
デバッグ モード
バックエンドの署名に簡単にアクセスおよびデバッグするには、デバッグ モードを有効化します。 デバッグ手順は次のとおりです。
API Gateway 宛のリクエストの Header に X-Ca-Request-Mode = debug を追加します。
改行は HTTP Header で許可されず、「|」に置き換えられるため、バックエンドサービスは Header 内の X-Ca-Proxy-Signature-String-To-Sign のみを読み取ります。
注意:X-Ca-Proxy-Signature-String-To-Sign は、バックエンドの署名計算には関係しません。
タイムスタンプの認証
バックエンドがリクエストのタイムスタンプを認証すると、システム パラメーター CaRequestHandleTime は API 定義で選択可能で、その値は API Gateway がリクエストを受け取ったグリニッジ標準時です。