Edge での SNI の使用

Server Name Indication(SNI)を利用すると、複数の HTTPS ターゲットで同じ TLS 証明書を使用しなくても、これらのターゲットに同一の IP アドレスとポートを使用できます。SNI が有効なクライアントは、初期 TLS handshake の一部としてターゲット エンドポイントのホスト名を渡します。これにより TLS サーバーは、どの TLS 証明書を使ってリクエストを検証するかを決定できます。

たとえば、リクエストのターゲットが https://example.com/request/path である場合、TLS クライアントは次のように TLS handshake リクエストに server_name 拡張を追加します。

Edge は、以下のリクエストで SNI をサポートしています。

  • クライアント アプリから API プロキシへのリクエスト。この場合、Edge は TLS サーバーとして動作します。
  • Edge からバックエンドへのリクエスト。この場合、Edge は TLS クライアントとして動作します。

SNI の詳細については、以下を参照してください。

Edge 上の API プロキシへのリクエストに関する SNI サポート

API プロキシへのリクエストに関する SNI サポートは、ホスト エイリアスと仮想ホストにより制御されます。

仮想ホストとホスト エイリアスについて

Edge における仮想ホストは、API プロキシが公開されている IP アドレスとポート(または DNS 名とポート)を定義します。またそれを拡張して、API プロキシへのアクセスにアプリで使用する URL も定義します。IP アドレス / DNS 名は Edge Router に対応しており、ポート番号は Router 上のオープンポートです。

仮想ホストの作成時には、仮想ホストのホスト エイリアスも指定します。通常、これは仮想ホストの DNS 名です。リクエストを処理する API プロキシを決定する際、Router は、受信リクエストの Host ヘッダーを、すべての仮想ホストで定義されている使用可能なホスト エイリアスのリストと比較します。

仮想ホストのホスト エイリアスとポート番号の組み合わせは、Edge インストール環境のすべての仮想ホストで一意でなければなりません。つまり、複数の仮想ホストの間でホスト エイリアスが異なっていれば、これらの仮想ホストは同じポート番号を使用できます

また仮想ホストは、HTTP プロトコルと、TLS を使用する暗号化 HTTPS プロトコルのどちらを使って API プロキシにアクセスするかも定義します。HTTPS を使うように仮想ホストを構成する場合は、TLS handshake 時に仮想ホストで使用する証明書と秘密鍵が入っているキーストアに、仮想ホストを関連付けます。

仮想ホストの詳細については、以下をご覧ください。

SNI とホスト エイリアスの連携の仕組み

SNI により、それぞれ異なる TLS 証明書と鍵を持つ複数の仮想ホストを同じポートで定義できます。Edge はその後、TLS handshake リクエスト内の server_name 拡張に基づいて、仮想ホストと、TLS で使われる証明書 / 鍵ペアを決定します。

Edge Router は TLS handshake リクエスト内の server_name 拡張を読み取り、それを使用してすべての仮想ホストからホスト エイリアスを検索します。ホスト エイリアスとの一致が検出されると、Router はそのホスト エイリアスに関連付けられている仮想ホストの TLS 証明書と鍵を使用します。一致が見つからない場合、TLS handshake は失敗します。

TLS handshake の失敗を防ぐには、デフォルトの証明書 / 鍵ペアを定義できます。これについては以降のセクションで説明します。

Edge for the Cloud でのデフォルト証明書 / 鍵ペアの定義

Apigee には、HTTPS をサポートするための TLS 証明書と秘密鍵があります。多くのお客様はデプロイ時に独自の証明書と秘密鍵を使用することを好みますが、Agipee 証明書と鍵を使用して API をデプロイすることもできます。

Edge for the Cloud では、Router が SNI ヘッダーとホスト エイリアスを照合できない場合、またはクライアントで SNI がサポートされない場合、Router は Agipee 提供のデフォルト証明書(*.apigee.net)を使用します。

Edge for the Private Cloud でのデフォルト証明書 / 鍵ペアの定義

Edge for the Private Cloud では、server_name 拡張とすべての仮想ホストのホスト エイリアスの間で一致が見つからない場合、またはリクエスト側クライアントが SNI をサポートしていない場合に、ポートのデフォルト仮想ホストからの証明書 / 鍵を使用するように Router を構成できます。デフォルト仮想ホストは、組織名、環境名、仮想ホスト名を次の形式で組み合わせて定義されます。

orgName_envName_vhName

Router は、アルファベット順で最初の orgName_envName_vhName の組み合わせから証明書 / 鍵を使用します。たとえば、ポート 443 に着信するリクエストがあり、環境 prod の組織 example で次の 2 つの仮想ホストが定義されているとします。

  • 仮想ホスト名 = default
  • 仮想ホスト名 = test

この例では、example_prod_default はアルファベット順に example_prod_test より前であるため、Router は仮想ホスト default の証明書 / 鍵を使用します。

デフォルトの仮想ホストを有効にするには:

  1. 1 番目の Router ノードで /opt/apigee/customer/application/router.properties を編集します。このファイルが存在しない場合は作成してください。
  2. デフォルト仮想ホストを定義できるようにするには、次のプロパティをファイルに追加します。
    conf_load_balancing_load.balancing.driver.nginx.fallback.conf.enabled=true
  3. Router を再起動します。
    /opt/apigee/apigee-service/bin/apigee-service edge-router restart
  4. 残りのすべての Router で、この手順を繰り返します。

デフォルト仮想ホストの証明書 / 鍵を使用する代わりに、Router でデフォルトの証明書 / 鍵を明示的に定義できます。明示的なデフォルト証明書 / 鍵ペアを定義するには、次の手順に従います。

  1. 1 番目の Router ノード上の、agipee ユーザーがアクセスできる場所に、証明書と秘密鍵をコピーします。たとえば /opt/apigee/customer/application です。
  2. ファイルの所有権を agipee ユーザーに変更します。
    chown apigee:apigee /opt/apigee/customer/application/myCert.pem
    chown apigee:apigee /opt/apigee/customer/application/myKey.pem
  3. /opt/apigee/customer/application/router.properties を編集します。このファイルが存在しない場合は作成してください。
  4. デフォルトの証明書 / 鍵を指定できるようにするには、次のプロパティをファイルに追加します。
    conf_load_balancing_load.balancing.driver.nginx.fallback.server.default.ssl.template.enabled=true
    conf_load_balancing_load.balancing.driver.nginx.fallback.conf.enabled=true
  5. router.properties で次のプロパティを設定し、証明書と鍵の場所を指定します。
    conf_load_balancing_load.balancing.driver.nginx.ssl.cert=/opt/apigee/customer/application/myCert.pem
        conf_load_balancing_load.balancing.driver.nginx.ssl.key=/opt/apigee/customer/application/myKey.pem
  6. Router を再起動します。
    /opt/apigee/apigee-service/bin/apigee-service edge-router restart
  7. 残りのすべての Router で、この手順を繰り返します。

Edge からバックエンドへのリクエストに関する SNI サポート

Edge では、Apigee Edge for Cloud と Apigee Edge for Private Cloud のデプロイ環境で、Message Processor からターゲット エンドポイントへの SNI を使用できます。デフォルトで、SNI は Edge Message Processors for the Cloud では有効、Private Cloud では無効になっています。

Edge for the Private Cloud でのバックエンド向け SNI の使用

Edge for the Private Cloud では、既存のターゲット バックエンドと下位互換性を持たせるため、デフォルトでは SNI が無効になっています。ターゲット バックエンドが SNI をサポートするように構成されている場合は、ご使用の Edge バージョンに応じて、下記の方法でこの機能を有効にできます。

その他の Edge 固有の構成は不要です。ターゲット環境で SNI が構成されている場合、Edge は SNI をサポートします。Edge はリクエスト URL からホスト名を自動的に抽出し、それを TLS handshake リクエストに追加します。

Edge とバックエンドの間で SNI を有効にする(Edge バージョン 4.15.07.0x の場合)

SNI を有効にするには、次の手順に従います。

  1. 1 番目の Message Processor ノードで、ファイル /opt/apigee4/conf/apigee/message-processor/system.properties をエディタで開きます。
  2. system.properties で次のプロパティを true に設定します。
    jsse.enableSNIExtension=true
  3. Message Processor を再起動します。
    /opt/apigee4/bin/apigee-service message-processor restart
  4. 残りのすべての Message Processor で上記の手順を繰り返します。

Edge とバックエンドの間で SNI を有効にする(Edge バージョン 4.16.01 以降)

SNI を有効にするには、次の手順に従います。

  1. 1 番目の Message Processor ノードで、/opt/apigee/customer/application/message-processor.properties を編集します。このファイルが存在しない場合は作成してください。
  2. ファイルに次のプロパティを追加します。
    conf_system_jsse.enableSNIExtension=true
  3. Message Processor を再起動します。
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
  4. 残りのすべての Message Processor で上記の手順を繰り返します。