Använda klientcertifikat för säker åtkomst till ett API

Slutförd

Certifikat kan användas för att tillhandahålla ömsesidig TLS-autentisering mellan klienten och API-gatewayen. Du kan konfigurera API Management-gatewayen så att den endast tillåter begäranden med certifikat som innehåller ett specifikt tumavtryck. Auktoriseringen på gateway-nivå hanteras via inkommande principer.

För din meteorologiska app har du vissa kunder som har klientcertifikat utfärdade av en certifikatutfärdare (CA) som ni båda litar på. Du vill tillåta att de kunderna kan autentisera genom att skicka certifikaten.

Här får du lära dig hur du konfigurerar API Management för att acceptera klientcertifikat.

TLS-klientautentisering

Med TLS-klientautentisering kan API Management-gatewayen visa det certifikat som ingår i klientbegäran och söka efter egenskaper som:

Property Anledning
Certifikatutfärdare (CA) Tillåt endast certifikat som signerats av en viss certifikatutfärdare.
Tumavtryck Tillåt certifikat som innehåller ett angivet tumavtryck.
Ämne Tillåt endast certifikat med ett angivet ämne.
Utgångsdatum Tillåt endast certifikat som inte har upphört att gälla.

Dessa egenskaper är inte ömsesidigt uteslutande och de kan kombineras för att bilda dina egna principkrav. Du kan till exempel ange att certifikatet som skickades i begäran inte har upphört att gälla och har signerats av en viss certifikatutfärdare.

Klientcertifikat signeras för att säkerställa att de inte manipuleras. När en partner skickar ett certifikat till dig ska du kontrollera att det kommer från partnern och inte från en bedragare. Det finns två vanliga sätt att verifiera ett certifikat:

  • Kontrollera vem som utfärdade certifikatet. Om utfärdaren var en certifikatutfärdare som du litar på kan du använda certifikatet. Du kan konfigurera betrodda certifikatutfärdare i Azure-portalen för att automatisera processen.

  • Om certifikatet har utfärdats av en partner kontrollerar du att det kom från dem. Om certifikatet exempelvis levereras personligen kan du vara säker på att det är äkta. Dessa certifikat kallas självsignerade certifikat.

Acceptera klientcertifikat på förbrukningsnivån

Förbrukningsnivån i API Management är utformad för att överensstämma med serverlösa designprinciper. Om du skapar API:er från serverlösa tekniker, som Azure Functions, är den här nivån ett bra alternativ. På förbrukningsnivån måste du uttryckligen aktivera användningen av klientcertifikat, vilket du kan göra i fönstret Anpassade domäner . Det här steget är inte nödvändigt på andra nivåer.

Configure the gateway to request certificates.

Skapa principer för certifikatauktorisering

Skapa dessa principer i den inkommande bearbetningsprincipfilen i API Management-gatewayen.

Inbound processing policy button.

Kontrollera ett klientcertifikats tumavtryck

Varje klientcertifikat innehåller ett tumavtryck, som är en hash, som har beräknats från andra egenskaper för certifikat. Tumavtrycket säkerställer att värdena i certifikatet inte har ändrats sedan certifikatet utfärdades av certifikatutfärdare. Du kan kontrollera tumavtrycket i din princip. I följande exempel kontrolleras tumavtrycket för certifikatet som skickades i begäran.

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

Kontrollera tumavtrycket mot certifikat som har laddats upp till API Management

I föregående exempel skulle endast ett tumavtryck fungera, så endast ett certifikat skulle kunna verifieras. Varje kund eller partnerföretag skulle vanligtvis skicka ett annat certifikat med ett annat tumavtryck. För att stödja det här scenariot hämtar du certifikaten från dina partner och använder fönstret Klientcertifikat i Azure-portalen för att ladda upp dem till API Management-resursen. Lägg sedan till den här koden i principen.

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

Kontrollera utfärdaren och ämnet för ett klientcertifikat

I följande exempel kontrolleras utfärdaren och certifikatets ämne som skickades i begäran.

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