API's beveiligen met behulp van certificaten

Voltooid

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.

De gateway instellen op het aanvragen van certificaten

Certificaatautorisatiebeleid

Maak deze beleidsregels in het binnenkomende bestand met het verwerkingsbeleid in de API Management-gateway:

Knop Binnenkomend verwerkingsbeleid

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>