クライアント証明書を使用して、API へのアクセスをセキュリティで保護する

完了

証明書を使用して、クライアントと API ゲートウェイの間の TLS 相互認証を提供することができます。 特定の拇印を含む証明書を使用した要求のみを許可するように、API Management ゲートウェイを構成することができます。 ゲートウェイ レベルでの承認は、受信ポリシーを介して処理されます。

あなたの会社の気象アプリでは、一部の顧客が、会社と顧客の双方が信頼する証明機関 (CA) によって発行されたクライアント証明書を持っています。 これらの証明書を渡すことで、これらの顧客を認証できるようにする必要があります。

ここでは、クライアント証明書を受け入れるように API Management を構成する方法を学習します。

TLS クライアント認証

API Management ゲートウェイでは、TLS クライアント認証を使用して、クライアント要求内に含まれる証明書を調べ、次のようなプロパティを確認することができます。

プロパティ 理由
証明機関 (CA) 特定の CA によって署名された証明書のみを許可する。
拇印 指定された拇印を含む証明書を許可する。
件名 指定されたサブジェクトの証明書のみ許可する。
有効期限 有効期限が切れていない証明書のみを許可する。

これらのプロパティは相互に排他的ではなく、組み合わせて独自のポリシー要件を形成できます。 たとえば、要求で渡された証明書が期限切れではなく、特定の証明機関によって署名されていることを示すことができます。

クライアント証明書は、改ざんされていないことを保証するために署名されます。 パートナーから証明書が送信されたときに、それがなりすましユーザーからではなく、パートナー本人からのものであることを確認します。 証明書を確認する 2 つの一般的な方法があります。

  • 証明書を発行したユーザーを確認します。 発行者が信頼できる証明機関だった場合、証明書を使用できます。 このプロセスを自動化するように、Azure portal で信頼された証明機関を構成することができます。

  • 証明書がパートナーによって発行されている場合は、発行元がパートナーであることを検証します。 たとえば、本人が直接、証明書を配信している場合は、その信頼性を確信できます。 このような証明書は、"自己署名証明書" と呼ばれます。

従量課金レベルでクライアント証明書を受け入れる

API Management の従量課金レベルは、サーバーレスの設計原則に従うように設計されています。 Azure Functions などのサーバーレス テクノロジに基づいて API をビルドする場合、このレベルが適しています。 従量課金レベルでは、クライアント証明書の使用を明示的に有効にする必要があります。これは、[カスタム ドメイン] ペインで行うことができます。 この手順は他のレベルでは必要ありません。

Configure the gateway to request certificates.

証明書の承認ポリシーを作成する

API Management ゲートウェイ内の受信処理ポリシー ファイルで、これらのポリシーを作成します。

Inbound processing policy button.

クライアント証明書の拇印を確認する

すべてのクライアント証明書には、他の証明書プロパティから計算された、ハッシュである拇印が含まれています。 拇印により、証明書が証明機関によって発行された後、その証明書の値が変更されていないことが保証されます。 拇印はポリシーで確認することができます。 次の例では、要求で渡された証明書の拇印を確認します。

<choose>
    <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Thumbprint != "desired-thumbprint")" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

API Management にアップロードされた証明書に対する拇印を確認する

前の例では、1 つの拇印のみが機能するため、1 つの証明書のみが検証されます。 通常、各顧客またはパートナー会社は、拇印が異なる別の証明書を渡します。 このシナリオをサポートするために、パートナーから証明書を取得し、Azure portal の [クライアント証明書] ペインを使用して、API Management リソースにそれらをアップロードします。 その後、このコードをポリシーに追加します。

<choose>
    <when condition="@(context.Request.Certificate == null || !context.Request.Certificate.Verify()  || !context.Deployment.Certificates.Any(c => c.Value.Thumbprint == context.Request.Certificate.Thumbprint))" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

クライアント証明書の発行者とサブジェクトを確認する

次の例では、要求で渡された証明書の発行者とサブジェクトを確認します。

<choose>
    <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Issuer != "trusted-issuer" || context.Request.Certificate.SubjectName.Name != "expected-subject-name")" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>