すべてのプロダクト
Search
ドキュメントセンター

API Gateway:バックエンド署名のデモ

最終更新日:Mar 20, 2020

概要

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をご参照ください。

署名の計算方法は次のとおりです。

署名の付加に関連するデータを編成

  1. String stringToSign=
  2. HTTPMethod + "\n" + // HTTP Header はすべて大文字にします。
  3. Content-MD5 + "\n" + // Content-MD5 が空であるかを確認します。空であれば改行「\n」をつけます。
  4. Headers + // Headers が空であれば、「\n」は不要です。空でない Headers には「\n」が含まれます。詳細は、以下の編成方法をご参照ください。
  5. Url

署名の計算

  1. Mac hmacSha256 = Mac.getInstance("HmacSHA256");
  2. byte[] keyBytes = secret.getBytes("UTF-8");
  3. hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
  4. 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 でない場合にのみ計算されます。 計算方法は次のとおりです。

  1. 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 のすべての大文字を小文字に変換し、次の方法で鍵を連結します。

  1. String headers =
  2. HeaderKey1.toLowerCase() + ":" + HeaderValue1 + "\n"\+
  3. HeaderKey2.toLowerCase() + ":" + HeaderValue2 + "\n"\+
  4. ...
  5. HeaderKeyN.toLowerCase() + ":" + HeaderValueN + "\n"

URL

URL は、Path + Query + Body の Form パラメーターを示します。 編成方法は次のとおりです。Query または Form が空でない場合は、? を追加し、Query+Form の鍵を辞書順にソートし、次の方法で結合します。 Query または Form が空の場合、URL は Path と同じになります。

  1. String url =
  2. Path +
  3. "?" +
  4. Key1 + "=" + Value1 +
  5. "&" + Key2 + "=" + Value2 +
  6. ...
  7. "&" + KeyN + "=" + ValueN

Query または Form には複数の値がある場合があることにご注意ください。 複数の値がある場合は、署名計算には最初の値を使用します。

デバッグ モード

バックエンドの署名に簡単にアクセスおよびデバッグするには、デバッグ モードを有効化します。 デバッグ手順は次のとおりです。

  1. API Gateway 宛のリクエストの Header X-Ca-Request-Mode = debug を追加します。

  2. 改行は HTTP Header で許可されず、「|」に置き換えられるため、バックエンドサービスは Header 内の X-Ca-Proxy-Signature-String-To-Sign のみを読み取ります。

注意:X-Ca-Proxy-Signature-String-To-Sign は、バックエンドの署名計算には関係しません。

タイムスタンプの認証

バックエンドがリクエストのタイムスタンプを認証すると、システム パラメーター CaRequestHandleTime は API 定義で選択可能で、その値は API Gateway がリクエストを受け取ったグリニッジ標準時です。