Zabezpečení rozhraní API pomocí certifikátů
Certifikáty je možné použít k zajištění vzájemného ověřování TLS (Transport Layer Security) mezi klientem a bránou rozhraní API. Bránu služby API Management můžete nakonfigurovat tak, aby povolovala pouze požadavky s certifikáty obsahujícími konkrétní kryptografický otisk. Autorizace na úrovni brány probíhá prostřednictvím příchozích zásad.
Ověřování klientů Transport Layer Security
Brána služby API Management může pomocí ověřování klientů TLS zkontrolovat certifikát obsažený v požadavku klienta a ověřit vlastnosti, jako například:
| Vlastnost | Popis |
|---|---|
| Certifikační autorita (CA) | Povolit pouze certifikáty podepsané konkrétní certifikační autoritou |
| Otisk palce | Povolit certifikáty obsahující daný kryptografický otisk |
| Předmět | Povolit pouze certifikáty se zadaným předmětem |
| Datum vypršení | Nepovolit certifikáty s vypršenou platností |
Tyto vlastnosti se vzájemně nevylučují a dají se vzájemně kombinovat a vytvořit tak vlastní požadavky zásad. Můžete například zadat, že certifikát předaný v požadavku je podepsaný a jeho platnost nevypršela.
Klientské certifikáty jsou podepsané, aby se zajistilo, že nejsou manipulovány. Když vám partner pošle certifikát, ověřte, že opravdu pochází od něj a ne od podvodníka. Existují dva běžné způsoby, jak certifikát ověřit:
- Zkontrolujte, kdo certifikát vydal. Pokud je vystavitelem certifikační autorita, které důvěřujete, můžete certifikát použít. Důvěryhodné certifikační autority můžete nakonfigurovat na webu Azure Portal a proces tak automatizovat.
- Ujistěte se, že důvěřujete zdroji jakýchkoli samosignovaných certifikátů.
Přijímání klientských certifikátů na úrovni Consumption
Úroveň Consumption ve službě API Management je navržená tak, aby odpovídala principům návrhu bez serveru. Pokud vytváříte rozhraní API z bezserverových technologií, jako je například Azure Functions, je tato úroveň dobrou volbou. Na úrovni Consumption musíte explicitně povolit použití klientských certifikátů, které můžete provést na stránce Vlastní domény . Tento krok není nutný v jiných úrovních.
Zásady autorizace certifikátu
Tyto zásady vytvořte v souboru zásad zpracování na vstupu v rámci brány služby API Management:
Kontrola kryptografického otisku klientského certifikátu
Každý klientský certifikát obsahuje kryptografický otisk, což je hodnota hash vypočítaná z ostatních vlastností certifikátu. Kryptografický otisk zajišťuje, že hodnoty v certifikátu nebyly od vydání certifikátu certifikační autoritou změněny. Kryptografický otisk můžete zkontrolovat ve vašich zásadách. Následující příklad zkontroluje kryptografický otisk certifikátu předaného v požadavku:
<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>
Kontrola kryptografického otisku vzhledem k certifikátům nahraným do služby API Management
V předchozím příkladu by fungoval pouze jeden kryptografický otisk, takže by byl ověřen pouze jeden certifikát. Obvykle by každá zákaznická nebo partnerská společnost předala jiný certifikát s jiným kryptografickým otiskem. Pokud chcete tento scénář podporovat, získejte certifikáty od partnerů a pomocí stránky Klientské certifikáty na webu Azure Portal je nahrajte do prostředku služby API Management. Do zásad pak přidejte tento kód:
<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>
Kontrola vystavitele a předmětu klientského certifikátu
Tento příklad zkontroluje vystavitele a předmět certifikátu předaného v požadavku:
<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>