API's beveiligen met behulp van certificaten
Certificaten kunnen worden gebruikt voor wederzijdse verificatie van Transport Layer Security (TLS) tussen de client en de API-gateway. U kunt de API Management-gateway configureren om alleen aanvragen met certificaten die een specifieke vingerafdruk bevatten toe te staan. De autorisatie op gatewayniveau wordt afgehandeld met binnenkomende beleidsregels.
Transport Layer Security-clientverificatie
Met TLS-clientverificatie kan in de API Management-gateway het certificaat dat is opgenomen in de clientaanvraag worden geïnspecteerd en gecontroleerd op eigenschappen zoals:
Eigenschappen | Beschrijving |
---|---|
Certificeringsinstantie (CA) | Alleen certificaten die door een bepaalde CA zijn ondertekend toestaan |
Vingerafdruk | Certificaten die een opgegeven vingerafdruk bevatten toestaan |
Onderwerp | Alleen certificaten met een opgegeven onderwerp toestaan |
Vervaldatum | Verlopen certificaten niet toestaan |
Deze eigenschappen sluiten elkaar niet wederzijds uit en kunnen worden gecombineerd om uw eigen beleidsvereisten te vormen. U kunt bijvoorbeeld opgeven dat het certificaat dat is doorgegeven in de aanvraag is ondertekend en niet is verlopen.
Clientcertificaten zijn ondertekend om ervoor te zorgen dat ze niet met elkaar zijn geknoeid. Wanneer een partner u een certificaat stuurt, moet u controleren of het afkomstig van deze partner en niet van een oplichter. Er zijn twee gebruikelijke manieren om een certificaat te controleren:
- Controleer wie het certificaat heeft uitgegeven. Als de uitgever een certificeringsinstantie is die u vertrouwt is, kunt u het certificaat gebruiken. U kunt de vertrouwde certificeringsinstanties configureren in Azure Portal om dit proces te automatiseren.
- Als het certificaat is uitgegeven door de partner, moet u controleren of het ook echt afkomstig is van deze partner. Als deze het certificaat bijvoorbeeld persoonlijk overhandigt, kunt u er zeker van zijn dat het echt is. Dit staat bekend als zelfondertekende certificaten.
Clientcertificaten in de servicelaag Verbruik accepteren
De servicelaag Verbruik in API Management is ontworpen om te voldoen aan de principes van serverloos ontwerp. Als u uw API's bouwt vanuit serverloze technologieën, zoals Azure Functions, is deze servicelaag geschikt. In de servicelaag Verbruik moet u expliciet het gebruik van clientcertificaten inschakelen. Dit kunt u doen op de pagina Aangepaste domeinen. Deze stap is niet nodig in andere lagen.
Certificaatautorisatiebeleid
Maak deze beleidsregels in het binnenkomende bestand met het verwerkingsbeleid in de API Management-gateway:
De vingerafdruk van een clientcertificaat controleren
Elk clientcertificaat bevat een vingerafdruk. Dat is een hash die wordt berekend op basis van andere certificaateigenschappen. De vingerafdruk zorgt ervoor dat de waarden in het certificaat niet zijn gewijzigd sinds het certificaat is uitgegeven door de certificeringsinstantie. U kunt de vingerafdruk controleren in uw beleid. In het volgende voorbeeld wordt de vingerafdruk gecontroleerd van het certificaat dat is doorgegeven in de aanvraag:
<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>
De vingerafdruk controleren in certificaten die zijn geüpload naar API Management
In het vorige voorbeeld zou slechts één vingerafdruk werken en er dus slechts één certificaat worden gevalideerd. Gewoonlijk geeft elke klant of elk partnerbedrijf een ander certificaat met een andere vingerafdruk door. Ondersteun dit scenario door de certificaten van uw partners te verkrijgen en deze via de pagina Clientcertificaten in Azure Portal te uploaden naar de API Management-resource. Voeg vervolgens deze code toe aan uw beleid:
<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>
De certificaatverlener en het onderwerp van een clientcertificaat controleren
In dit voorbeeld worden de certificaatverlener en het onderwerp van het certificaat dat is doorgegeven in de aanvraag gecontroleerd:
<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>