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 Alleen certificaten die niet zijn verlopen toestaan

Deze eigenschappen sluiten elkaar niet wederzijds uit en kunnen worden gecombineerd tot uw eigen beleidsvereisten. U kunt bijvoorbeeld opgeven dat het certificaat dat wordt doorgegeven in de aanvraag moet zijn ondertekend door een bepaalde certificeringsinstantie en nog niet verlopen mag zijn.

Clientcertificaten worden ondertekend om te garanderen dat deze niet zijn gemanipuleerd. 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 van toepassing op andere servicelagen.

Configure the gateway to request certificates

Certificaatautorisatiebeleid

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

Inbound processing policy button

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 nadat 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>