Beskyt API'er ved hjælp af certifikater

Fuldført

Certifikater kan bruges til at give TLS (Transport Layer Security) gensidig godkendelse mellem klienten og API-gatewayen. Du kan konfigurere API-administrationsgatewayen til kun at tillade anmodninger med certifikater, der indeholder et bestemt aftryk. Godkendelsen på gatewayniveau håndteres via indgående politikker.

Klientgodkendelse af transportlagssikkerhed

Med TLS-klientgodkendelse kan API-administrationsgatewayen undersøge certifikatet i klientanmodningen og kontrollere, om der er egenskaber som:

Egenskab Beskrivelse
nøglecenter Tillad kun certifikater, der er signeret af et bestemt nøglecenter
aftryk Tillad certifikater, der indeholder et angivet aftryk
emne Tillad kun certifikater med et angivet emne
udløbsdato Tillad ikke udløbne certifikater

Disse egenskaber udelukker ikke hinanden, og de kan blandes sammen for at danne dine egne politikkrav. Du kan f.eks. angive, at det certifikat, der sendes i anmodningen, er signeret og ikke er udløbet.

Klientcertifikater signeres for at sikre, at de ikke ændres. Når en partner sender dig et certifikat, skal du bekræfte, at det kommer fra dem og ikke en bedrager. Der er to almindelige måder at bekræfte et certifikat på:

  • Kontrollér, hvem der har udstedt certifikatet. Hvis udstederen var et nøglecenter, du har tillid til, kan du bruge certifikatet. Du kan konfigurere de nøglecentre, der er tillid til, på Azure Portal for at automatisere denne proces.
  • Sørg for, at du har tillid til kilden til alle selvsignerede certifikater.

Acceptér klientcertifikater på niveauet Forbrug

Forbrugsniveauet i API Management er designet til at overholde serveruafhængige designprincipper. Hvis du bygger dine API'er ud fra serveruafhængige teknologier, f.eks. Azure Functions, passer dette niveau godt. På niveauet Forbrug skal du eksplicit aktivere brugen af klientcertifikater, som du kan gøre på siden Brugerdefinerede domæner. Dette trin er ikke nødvendigt på andre niveauer.

Konfigurer gatewayen til at anmode om certifikater

Politikker for certifikatgodkendelse

Opret disse politikker i den indgående behandlingspolitikfil i API-administrationsgatewayen:

knap til politik for indgående behandling

Kontrollér aftrykket af et klientcertifikat

Alle klientcertifikater indeholder et aftryk, som er en hashværdi, beregnet ud fra andre certifikategenskaber. Aftrykket sikrer, at værdierne i certifikatet ikke er blevet ændret, siden certifikatet blev udstedt af nøglecenteret. Du kan kontrollere aftrykket i din politik. I følgende eksempel kontrolleres aftrykket af det certifikat, der er sendt i anmodningen:

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

Kontrollér aftrykket i forhold til certifikater, der er uploadet til API Management

I det forrige eksempel fungerer kun ét aftryk, så kun ét certifikat valideres. Normalt vil hver kunde eller partner virksomhed bestå et andet certifikat med et andet aftryk. Hvis du vil understøtte dette scenarie, skal du hente certifikaterne fra dine partnere og bruge siden Klientcertifikater på Azure Portal til at uploade dem til API Management-ressourcen. Føj derefter denne kode til din politik:

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

Kontrollér udstederen og emnet for et klientcertifikat

I dette eksempel kontrolleres udstederen og emnet for det certifikat, der er sendt i anmodningen:

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