証明書を使用して API をセキュリティで保護する

完了

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

トランスポート層セキュリティのクライアント認証

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>