APIデプロイメントへのmTLSサポートの追加
リクエスト・ポリシーを使用して、APIゲートウェイを使用したAPIデプロイメントにmTLSサポートを追加する方法をご紹介します。
APIゲートウェイ・サービスで作成するAPIゲートウェイは、TLS暗号化および検証によって保護されます。APIゲートウェイは、TLSハンドシェイク中にサーバー証明書をAPIクライアントに提示し、APIクライアントがAPIゲートウェイの信頼性を検証できるようにします。APIゲートウェイを認証するAPIクライアントのプロセスは、一方向TLSと呼ばれます。
多くの場合、認証されたAPIクライアントのみがAPIにアクセスできるようにする必要があります。このような状況では、APIクライアントによって提示されたTLS証明書を検証して、APIゲートウェイでAPIクライアントの信頼性を検証する必要があります。APIクライアントを認証するAPIゲートウェイのプロセスは、相互TLS (mTLS)と呼ばれます。
mTLSでは、APIゲートウェイとAPIクライアントの両方がTLSハンドシェイク中に証明書を交換および検証します。APIゲートウェイは、カスタム認証局(CA)ルート証明書、およびルート証明書と中間証明書のカスタムCAバンドルを使用して、APIクライアントによって提示されるTLS証明書を検証します。カスタムCAおよびCAバンドルは、よく知られたパブリックCAの証明書を含むデフォルトのCAバンドルとともに、APIゲートウェイのトラスト・ストアに格納されます。mTLSハンドシェイクでは、APIゲートウェイはカスタムCAおよびカスタムCAバンドルのみを使用してAPIクライアント証明書を検証することに注意してください。APIゲートウェイは、APIクライアント証明書の検証にデフォルトのCAバンドルを使用しません。そのため、APIゲートウェイでmTLSをサポートする場合は、APIゲートウェイのトラスト・ストアにカスタムCAおよびCAバンドルを追加する必要があります(TLS証明書検証のためのトラスト・ストアのカスタマイズを参照)。
さらに制御するために、APIクライアントからAPIゲートウェイに提示される証明書に、証明書の「電子メール・アドレス」、「URL」または「ドメイン名」フィールドに特定の値を含める必要があることも指定できます。APIゲートウェイのmTLSを設定するときにこれらのフィールドの値を指定すると、APIゲートウェイは、それらを含まない証明書を示すAPIクライアントからのリクエストを拒否します。mTLSの設定時にこれらのフィールドに値を指定しない場合、APIゲートウェイは、証明書を提供しているAPIクライアントからのすべてのリクエストを受け入れます。APIデプロイメントごとに最大10値を指定できます。
APIゲートウェイとAPIクライアントの間のmTLSハンドシェイクが成功すると、APIクライアントによって提示される証明書のBase64エンコード・バージョンが、request.cert[client_base64]
という名前のコンテキスト変数としてrequest.cert
コンテキスト表に保存されます。APIデプロイメントを定義する場合、${request.cert[client_base64]}
という形式を使用して証明書を参照できます(ポリシーおよびHTTPバック・エンド定義へのコンテキスト変数の追加を参照)。APIクライアントが(Base64でエンコードされた後に)サイズが8KBを超えるTLS証明書を提示した場合、証明書はコンテキスト変数として保存されません。
APIデプロイメント仕様のリクエスト・ポリシーを使用して、mTLSサポートをAPIに追加します(APIデプロイメント仕様へのリクエスト・ポリシーとレスポンス・ポリシーの追加を参照)。mTLSリクエスト・ポリシーは、APIデプロイメント仕様内のすべてのルートにグローバルに適用されます。
- APIクライアントがAPIゲートウェイにTLS証明書を提示し、APIデプロイメントがmTLS対応でない場合、APIゲートウェイは提示されたTLS証明書を無視します。この場合、
request.cert[client_base64]
コンテキスト変数は設定されません。 - APIゲートウェイがAPIクライアントによって提示されたTLS証明書を検証できない場合、APIゲートウェイはHTTP 401エラー・ステータス・レスポンス・コードでリクエストを拒否します。
- APIゲートウェイがカスタムCAバンドルを使用してAPIクライアントによって提示されたTLS証明書を検証する場合、検証中に証明書チェーンの任意の時点でトラバースできるCA証明書は3つまでです。つまり、チェーン内のCA証明書が有効になるには、それ自体がAPIゲートウェイのトラスト・ストアに存在するカスタムCAによって直接署名されるか、そのようなカスタムCAによって署名された証明書から2つ以下の中間証明書である必要があります。より中間証明書を許可する場合は、お問い合せください。
次を実行して、mTLSリクエスト・ポリシーをAPIデプロイメント仕様に追加できます:
- コンソールの使用
- JSONファイルの編集
コンソールを使用したmTLSリクエスト・ポリシーの追加
コンソールを使用してAPIデプロイメント仕様にmTLSリクエスト・ポリシーを追加するには:
-
コンソールを使用してAPIデプロイメントを作成または更新し、「最初から」オプションを選択して、「基本情報」ページで詳細を入力します。
詳細は、APIデプロイメントの作成によるAPIゲートウェイへのAPIのデプロイおよびAPIゲートウェイまたはAPIデプロイメントの更新を参照してください。
-
「基本情報」ページの「APIリクエスト・ポリシー」セクションの「相互TLS」で、「mTLsの有効化」オプションを選択し、オプションで次を指定します:
- サブジェクト代替名(SAN)/共通名: APIゲートウェイがクライアントからのリクエストを受け入れるためにAPIクライアントによって提示される証明書の次のフィールドの1つ以上に表示される必要がある値:
- 電子メール・アドレス
- URL
- ドメイン名
たとえば、
example.com
です。最大10個の値を指定できます。APIデプロイメントにmTLSを設定するときに値を指定すると、APIゲートウェイは、それらを含まない証明書を示すAPIクライアントからのリクエストを拒否します。mTLSの設定時に値を指定しない場合、APIゲートウェイは、証明書が有効であることを示すAPIクライアントからのすべてのリクエストを受け入れます。
- サブジェクト代替名(SAN)/共通名: APIゲートウェイがクライアントからのリクエストを受け入れるためにAPIクライアントによって提示される証明書の次のフィールドの1つ以上に表示される必要がある値:
- 「確認」をクリックして、APIデプロイメントに入力した詳細を確認します。
- APIデプロイメントを作成または更新するには、「作成」または「変更の保存」をクリックします。
- (オプション) コールしてAPIが正常にデプロイされていることを確認します(APIゲートウェイにデプロイされたAPIのコールを参照)。
JSONファイルを編集してmTLSリクエスト・ポリシーを追加
JSONファイルのAPIデプロイメント仕様にmTLSリクエスト・ポリシーを追加するには:
-
任意のJSONエディタを使用して、mTLSサポートを追加する既存のAPIデプロイメント仕様を編集するか、新しいAPIデプロイメント仕様を作成します(APIデプロイメント仕様の作成を参照)。
たとえば、次の基本的なAPIデプロイメント仕様では、OCI Functionsの単純なHello Worldサーバーレス・ファンクションを単一のバック・エンドとして定義しています:
{ "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] }
-
APIデプロイメント内のすべてのルートにグローバルに適用するmTLSリクエスト・ポリシーを指定するには:
-
routes
セクションの前にrequestPolicies
セクションを挿入します(まだ存在しない場合)。例:{ "requestPolicies": {}, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] }
-
新しい
requestPolicies
セクションに次のmutualTLS
ポリシーを追加して、APIデプロイメント内のすべてのルートにグローバルに適用します:{ "requestPolicies": { "mutualTls":{ "isVerifiedCertificateRequired": true|false, "allowedSans": [<list-of-values>] } }, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] }
ここでは:
"isVerifiedCertificateRequired": true|false
は、APIデプロイメントに対してmTLSが有効になっているかどうかを示すtrue
またはfalse
です。指定しない場合、デフォルトはfalse
です。"allowedSans": [<list-of-values>]
は、APIゲートウェイがクライアントからのリクエストを受け入れるためにAPIクライアントによって提示される証明書の次のフィールドの1つ以上に表示される、オプションのカンマ区切り値リストです。- 電子メール・アドレス
- URL
- ドメイン名
たとえば、
example.com
です。最大10個の値を指定できます。APIデプロイメントにmTLSを設定するときに値を指定すると、APIゲートウェイは、それらを含まない証明書を示すAPIクライアントからのリクエストを拒否します。mTLSの設定時に値を指定しない場合、APIゲートウェイは、証明書が有効であることを示すAPIクライアントからのすべてのリクエストを受け入れます。
例:
{ "requestPolicies": { "mutualTls":{ "isVerifiedCertificateRequired": true, "allowedSans": [ "example.com", "example.co.uk" ] } }, "routes": [ { "path": "/hello", "methods": ["GET"], "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] }
-
- APIデプロイメント仕様を含むJSONファイルを保存します。
-
APIデプロイメント仕様は、次の方法でAPIデプロイメントを作成または更新するときに使用します:
- 「既存のAPIのアップロード」オプションを選択して、コンソールでJSONファイルを指定します
- APIゲートウェイREST APIへのリクエストでJSONファイルを指定します
詳細は、APIデプロイメントの作成によるAPIゲートウェイへのAPIのデプロイおよびAPIゲートウェイまたはAPIデプロイメントの更新を参照してください。
- (オプション) コールしてAPIが正常にデプロイされていることを確認します(APIゲートウェイにデプロイされたAPIのコールを参照)。