Skydda API:er med hjälp av certifikat

Slutförd

Certifikat kan användas för att tillhandahålla ömsesidig TLS-autentisering (Transport Layer Security) 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.

Klientautentisering för Transport Layer Security

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

Property Beskrivning
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 förfallit

De här egenskaperna är inte ömsesidigt uteslutande, och du kan blanda dem och skapa egna principkrav. Du kan till exempel ange att certifikatet som skickades i begäran ska vara signerat av en viss certifikatutfärdare och inte vara utgånget.

Klientcertifikat signeras för att garantera att de inte har manipulerats. 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 partnern kontrollerar du att det kommer från partnern. Om certifikatet exempelvis levereras personligen kan du vara säker på att det är äkta. De kallas för 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. Det kan du göra på sidan Anpassade domäner. Det här steget behövs inte för andra nivåer.

Configure the gateway to request certificates

Auktoriseringsprinciper för certifikat

Skapa de här principerna i den inkommande principbearbetningsfilen 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ärdaren. Du kan kontrollera tumavtrycket i din princip. I följande exempel kontrolleras tumavtrycket för certifikatet som skickats 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 det här scenariot ska du hämta certifikaten från dina partner och använda sidan Klientcertifikat i Azure-portalen för att ladda upp dem till API Management-resursen. Lägg sedan till koden till 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 det här exemplet kontrolleras utfärdaren och ämnet för certifikatet som skickats 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>