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