Zabezpieczanie interfejsów API przy użyciu certyfikatów

Ukończone

Certyfikaty mogą służyć do zapewnienia wzajemnego uwierzytelniania protokołu Transport Layer Security (TLS) między klientem a bramą interfejsu API. Bramę usługi API Management można skonfigurować w taki sposób, aby zezwalała tylko na żądania z certyfikatami zawierającymi określony odcisk palca. Autoryzacja na poziomie bramy jest obsługiwana za pomocą zasad ruchu przychodzącego.

Uwierzytelnianie klienta usługi Transport Layer Security

Korzystając z uwierzytelniania klienta protokołu TLS, brama usługi API Management może sprawdzić certyfikat zawarty w żądaniu klienta pod kątem właściwości, takich jak:

Właściwości opis
Urząd certyfikacji (CA) Dozwolone są tylko certyfikaty podpisane przez konkretny urząd CA
Odcisk palca Dozwolone są certyfikaty zawierające określony odcisk palca
Temat Dozwolone są certyfikaty tylko z określonym podmiotem
Data ważności Nie zezwalaj na wygasłe certyfikaty

Te właściwości nie wykluczają się wzajemnie i mogą być mieszane razem w celu utworzenia własnych wymagań dotyczących zasad. Można na przykład określić, że certyfikat przekazany w żądaniu jest podpisany i nie wygasł.

Certyfikaty klienta są podpisane, aby upewnić się, że nie zostały naruszone. Gdy partner wysyła do Ciebie certyfikat, upewnij się, że pochodzi on od niego, a nie od oszusta. Istnieją dwa podstawowe sposoby weryfikacji certyfikatu:

  • Sprawdź, kto wystawił certyfikat. Jeśli wystawcą jest zaufany urząd certyfikacji, możesz użyć tego certyfikatu. Zaufane urzędy certyfikacji można skonfigurować w witrynie Azure Portal, aby zautomatyzować ten proces.
  • Jeśli certyfikat jest wystawiony przez partnera, sprawdź, czy na pewno pochodzi od niego. Jeśli na przykład certyfikat zostanie dostarczony osobiście, możesz mieć pewność co do jego autentyczności. Są one określane jako certyfikaty z podpisem własnym.

Akceptowanie certyfikatów klienta w warstwie Zużycie

Warstwa Zużycie w usłudze API Management musi spełniać zasady projektowania bezserwerowego. Jeśli tworzysz swoje interfejsy API w technologii bezserwerowej, takiej jak Azure Functions, ta warstwa jest dobrym rozwiązaniem. W warstwie Zużycie musisz jawnie włączyć korzystanie z certyfikatów klienta. Możesz to zrobić na stronie Domeny niestandardowe. Ten krok nie jest konieczny w innych warstwach.

Konfigurowanie bramy na potrzeby żądania certyfikatów

Zasady autoryzacji certyfikatu

Te zasady są tworzone w pliku zasad przetwarzania ruchu przychodzącego w bramie usługi API Management:

Przycisk zasad przetwarzania ruchu przychodzącego

Sprawdzanie odcisku palca certyfikatu klienta

Każdy certyfikat klienta zawiera odcisk palca, czyli skrót obliczany na podstawie innych właściwości certyfikatu. Odcisk palca gwarantuje, że wartości w certyfikacie nie zostały zmienione od czasu wystawienia certyfikatu przez urząd certyfikacji. Odcisk palca można sprawdzić w zasadach. W poniższym przykładzie następuje sprawdzenie odcisku palca certyfikatu przekazanego w żądaniu:

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

Sprawdzanie odcisku palca względem certyfikatów przekazanych do usługi API Management

W poprzednim przykładzie korzystano tylko z jednego odcisku palca, dlatego zweryfikowany mógł zostać tylko jeden certyfikat. Zwykle poszczególni klienci lub firmy partnerskie przekazują różne certyfikaty z różnymi odciskami palca. Aby obsłużyć ten scenariusz, uzyskaj certyfikaty od swoich partnerów i na stronie Certyfikaty klienta w witrynie Azure Portal przekaż je do zasobu usługi API Management. Następnie dodaj następujący kod do swoich zasad:

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

Sprawdzanie wystawcy i podmiotu certyfikatu klienta

W tym przykładzie następuje sprawdzenie wystawcy i podmiotu certyfikatu przekazanego w żądaniu:

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