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リクエスト・ポリシーを追加するには:

  1. コンソールを使用してAPIデプロイメントを作成または更新し、「最初から」オプションを選択して、「基本情報」ページで詳細を入力します。

    詳細は、APIデプロイメントの作成によるAPIゲートウェイへのAPIのデプロイおよびAPIゲートウェイまたはAPIデプロイメントの更新を参照してください。

  2. 「基本情報」ページの「APIリクエスト・ポリシー」セクションの「相互TLS」で、「mTLsの有効化」オプションを選択し、オプションで次を指定します:

    • サブジェクト代替名(SAN)/共通名: APIゲートウェイがクライアントからのリクエストを受け入れるためにAPIクライアントによって提示される証明書の次のフィールドの1つ以上に表示される必要がある値:
      • 電子メール・アドレス
      • URL
      • ドメイン名

      たとえば、example.comです。最大10個の値を指定できます。APIデプロイメントにmTLSを設定するときに値を指定すると、APIゲートウェイは、それらを含まない証明書を示すAPIクライアントからのリクエストを拒否します。mTLSの設定時に値を指定しない場合、APIゲートウェイは、証明書が有効であることを示すAPIクライアントからのすべてのリクエストを受け入れます。

  3. 「確認」をクリックして、APIデプロイメントに入力した詳細を確認します。
  4. APIデプロイメントを作成または更新するには、「作成」または「変更の保存」をクリックします。
  5. (オプション) コールしてAPIが正常にデプロイされていることを確認します(APIゲートウェイにデプロイされたAPIのコールを参照)。

JSONファイルを編集してmTLSリクエスト・ポリシーを追加

JSONファイルのAPIデプロイメント仕様にmTLSリクエスト・ポリシーを追加するには:

  1. 任意の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"
          }
        }
      ]
    }
  2. APIデプロイメント内のすべてのルートにグローバルに適用するmTLSリクエスト・ポリシーを指定するには:

    1. routesセクションの前にrequestPoliciesセクションを挿入します(まだ存在しない場合)。例:

      {
        "requestPolicies": {},
        "routes": [
          {
            "path": "/hello",
            "methods": ["GET"],
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            }
          }
        ]
      }
    2. 新しい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"
            }
          }
        ]
      }
  3. APIデプロイメント仕様を含むJSONファイルを保存します。
  4. APIデプロイメント仕様は、次の方法でAPIデプロイメントを作成または更新するときに使用します:

    • 「既存のAPIのアップロード」オプションを選択して、コンソールでJSONファイルを指定します
    • APIゲートウェイREST APIへのリクエストでJSONファイルを指定します

    詳細は、APIデプロイメントの作成によるAPIゲートウェイへのAPIのデプロイおよびAPIゲートウェイまたはAPIデプロイメントの更新を参照してください。

  5. (オプション) コールしてAPIが正常にデプロイされていることを確認します(APIゲートウェイにデプロイされたAPIのコールを参照)。