Ćwiczenie — zabezpieczanie dostępu do interfejsu API za pomocą certyfikatów klienta

Ukończone

Konfigurujesz usługę API Management, aby akceptowała certyfikaty klienta przy użyciu zasad ruchu przychodzącego.

Załóżmy, że Twoja firma zajmująca się pogodą zdecydowała się zabezpieczyć swój interfejs API za pomocą uwierzytelniania certyfikatów dla niektórych klientów, którzy już korzystają z uwierzytelniania certyfikatów w innych systemach. Ta konfiguracja umożliwi tym klientom używanie istniejących certyfikatów do uwierzytelniania się w bramie usługi API Management.

Ta lekcja obejmuje następujące zagadnienia:

  • Tworzenie certyfikatu z podpisem własnym
  • Konfigurowanie bramy na potrzeby żądania certyfikatów klienta
  • Uzyskiwanie odcisku palca certyfikatu
  • Edytowanie zasad ruchu przychodzącego w celu akceptowania tylko klientów z określonym certyfikatem w żądaniu
  • Wywoływanie bramy usługi API Management i przekazywanie certyfikatu przy użyciu narzędzia curl

Uwaga

W tym ćwiczeniu używane są zasoby skonfigurowane w poprzednim ćwiczeniu.

Tworzenie certyfikatu z podpisem własnym

Najpierw użyj usługi Cloud Shell, aby utworzyć certyfikat z podpisem własnym, który następnie będzie używany do uwierzytelniania między klientem a bramą usługi API Management.

  1. Aby utworzyć klucz prywatny i certyfikat, uruchom następujące polecenia w usłudze Cloud Shell.

    pwd='<Enter a secure password here>'
    pfxFilePath='selfsigncert.pfx'
    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out selfsigncert.crt -subj /CN=localhost
    

    Aby ułatwić wykonanie tego przykładu, powyższe polecenia zawierają hasło używane do zabezpieczania klucza prywatnego. Za każdym razem, gdy generujesz klucz prywatny do własnego użycia, upewnij się, że wygenerujesz bezpieczne hasło i odpowiednio kontrolujesz dostęp do niego.

  2. Teraz przekonwertuj certyfikat na format PEM, którego curl narzędzie może użyć, uruchamiając następujące polecenia:

    openssl pkcs12 -export -out $pfxFilePath -inkey privateKey.key -in selfsigncert.crt -password pass:$pwd
    openssl pkcs12 -in selfsigncert.pfx -out selfsigncert.pem -nodes
    

    Po wyświetleniu monitu wprowadź bezpieczne hasło, a następnie naciśnij Enter.

Konfigurowanie bramy na potrzeby żądania certyfikatów klienta

Ponieważ używasz warstwy Zużycie dla usługi API Management, musisz skonfigurować bramę tak, aby akceptowała certyfikaty klienta. Wykonaj te czynności.

  1. W witrynie Azure Portal, która jest już otwarta, wybierz usługę API Management (apim-WeatherDataNNNN).

  2. W okienku menu po lewej stronie w obszarze Wdrażanie i infrastruktura wybierz pozycję Domeny niestandardowe. Zostanie wyświetlone okienko Domeny niestandardowe dla usługi API Management.

  3. W polu *Zażądaj certyfikatu klienta wybierz pozycję Tak, a na górnym pasku menu wybierz pozycję Zapisz.

    Skonfiguruj bramę do żądania certyfikatów.

Uzyskiwanie odcisku palca certyfikatu

W tej sekcji skonfigurujesz usługę API Management tak, aby akceptowała żądanie tylko wtedy, gdy ma certyfikat z określonym odciskiem palca (odciskiem palca). Pobierzmy ten odcisk palca z certyfikatu.

Uwaga

Odcisk palca certyfikatu SSL jest również znany jako odcisk palca certyfikatu SSL.

  1. W usłudze Cloud Shell uruchom następujący kod.

    Fingerprint="$(openssl x509 -in selfsigncert.pem -noout -fingerprint)"
    Fingerprint="${Fingerprint//:}"
    echo ${Fingerprint#*=}
    
  2. Skopiuj pełne dane wyjściowe (ciąg szesnastkowy) i wklej tę wartość odcisku palca do pliku tekstowego.

Edytowanie zasad ruchu przychodzącego, aby zezwalać tylko na żądania z prawidłowym certyfikatem

Teraz utwórz zasady uwierzytelniania w bramie usługi API Management.

  1. W witrynie Azure Portal wybierz usługę API Management. W razie potrzeby w menu zasobów platformy Azure lub na stronie głównej wybierz pozycję Wszystkie zasoby, a następnie wybierz usługę API Management.

  2. W okienku menu po lewej stronie w obszarze Interfejsy API wybierz pozycję Interfejsy API. Zostanie wyświetlone okienko Interfejsy API dla usługi API Management.

  3. W menu pomocniczym wybierz pozycję Dane pogodowe.

  4. W polu Przetwarzanie przychodzące wybierz ikonę </>, aby otworzyć edytor kodu zasad. Zostanie wyświetlony kod HTML dla węzła zasad.

    Przycisk zasad przetwarzania ruchu przychodzącego.

  5. <inbound> Zastąp węzeł pliku zasad następującym kodem XML, zastępując odcisk palca skopiowany wcześniej dla symbolu zastępczegodesired-fingerprint:

    <inbound>
        <choose>
            <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Thumbprint != "desired-fingerprint")" >
                <return-response>
                    <set-status code="403" reason="Invalid client certificate" />
                </return-response>
            </when>
        </choose>
        <base />
    </inbound>
    
  6. Wybierz pozycję Zapisz.

Wywoływanie bramy i przekazywanie certyfikatu klienta

Teraz możesz przetestować nowe zasady uwierzytelniania przy użyciu certyfikatu i bez tego certyfikatu.

  1. Aby przetestować interfejs API bez certyfikatu, uruchom następujące polecenie w usłudze Cloud Shell, zastępując wartości symboli zastępczych nazwą bramy interfejsu API i kluczem subskrypcji.

    curl -X -v GET https://[api-gateway-name].azure-api.net/api/Weather/53/-1 \
      -H 'Ocp-Apim-Subscription-Key: [Subscription Key]' 
    

    To polecenie powinno zwrócić błąd 403 certyfikatu klienta i nie powinny zostać zwrócone żadne dane.

  2. W usłudze Cloud Shell, aby przetestować interfejs API przy użyciu certyfikatu, skopiuj i wklej następujące polecenie cURL, używając podstawowego klucza subskrypcji z pierwszego ćwiczenia (możesz również uzyskać ten klucz podstawowy w okienku Subskrypcje dla usługi WeatherData API Management). Pamiętaj, aby uwzględnić nazwę bramy interfejsu API.

    curl -X GET https://[api-gateway-name].azure-api.net/api/Weather/53/-1 \
      -H 'Ocp-Apim-Subscription-Key: [subscription-key]' \
      --cert-type pem \
      --cert selfsigncert.pem
    

    To polecenie powinno spowodować pomyślną odpowiedź wyświetlającą dane pogodowe podobne do poniższych.

    {"mainOutlook":{"temperature":32,"humidity":34},"wind":{"speed":11,"direction":239.0},"date":"2019-05-16T00:00:00+00:00","latitude":53.0,"longitude":-1.0}