Skydda API:er med hjälp av certifikat
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 inte utgångna certifikat |
Dessa egenskaper är inte ömsesidigt uteslutande och de kan blandas ihop för att bilda dina egna principkrav. Du kan till exempel ange att certifikatet som skickades i begäran är signerat och inte har upphört att gälla.
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 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 är inte nödvändigt på andra nivåer.
Auktoriseringsprinciper för certifikat
Skapa de här principerna i den inkommande principbearbetningsfilen i API Management-gatewayen:
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 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>