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

完了

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

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

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

TLS クライアント認証

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

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

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

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

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

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

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

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

証明書を要求するようにゲートウェイを構成する。

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

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

受信処理のポリシー ボタン。

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

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

<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>