Övning – Använda klientcertifikat för säker åtkomst till ett API

Slutförd

Du konfigurerar API Management så att det accepterar klientcertifikat med inkommande principer.

Anta att ditt väderföretag har beslutat att skydda sitt API genom certifikatautentisering för vissa klienter som redan använder certifikatautentisering i andra system. Med den här konfigurationen kan dessa klienter använda befintliga certifikat för att autentisera sig mot API Management-gatewayen.

I den här lektionen kommer du att:

  • Skapa ett självsignerat certifikat
  • Konfigurera gatewayen så att den begär klientcertifikat
  • Hämta certifikatets tumavtryck
  • Redigerar den inkommande principen för att endast tillåta klienter med det angivna certifikatet i sin begäran
  • Anropar API Management-gatewayen och skickar certifikatet med hjälp av curl

Kommentar

I den här övningen används de resurser som du konfigurerade i föregående övning.

Skapa självsignerat certifikat

Använd först Cloud Shell för att skapa ett självsignerat certifikat, som du sedan ska använda för autentisering mellan klienten och API Management-gatewayen.

  1. Om du vill skapa den privata nyckeln och certifikatet kör du följande kommandon i Cloud Shell.

    pwd='Pa$$w0rd'
    pfxFilePath='selfsigncert.pfx'
    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out selfsigncert.crt -subj /CN=localhost
    

    För att göra det här exemplet enkelt att följa innehåller föregående kommandon lösenordet som används för att skydda den privata nyckeln. När du genererar en privat nyckel för eget bruk ska du skapa ett säkert lösenord och kontrollera åtkomsten till den på rätt sätt.

  2. Konvertera nu certifikatet till PEM-format, som curl verktyget kan använda, genom att köra följande kommandon:

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

    När du uppmanas att ange ett lösenord anger du Pa$$w 0rd och trycker sedan på Retur.

Konfigurera gatewayen så att den begär klientcertifikat

Eftersom du använder förbrukningsnivån för API Management måste du konfigurera gatewayen för att acceptera klientcertifikat. Följ dessa steg.

  1. Från Azure-portalen som redan är öppen väljer du din API Management-tjänst (apim-WeatherDataNNNN).

  2. I det vänstra menyfönstret går du till Distribution och infrastruktur och väljer Anpassade domäner. Fönstret Anpassade domäner för API Management-tjänsten visas.

  3. För *Begär klientcertifikat väljer du Ja och på den översta menyraden väljer du Spara.

    Configure the gateway to request certificates.

Hämta certifikatets tumavtryck

I det här avsnittet konfigurerar du API Management att endast acceptera en begäran om den har ett certifikat med ett visst tumavtryck (fingeravtryck). Nu ska vi hämta tumavtrycket från certifikatet.

Kommentar

Ett tumavtryck för SSL-certifikat kallas även för ett SSL-certifikatsfingret.

  1. Kör följande kod i Cloud Shell.

    Fingerprint="$(openssl x509 -in selfsigncert.pem -noout -fingerprint)"
    Fingerprint="${Fingerprint//:}"
    echo ${Fingerprint#*=}
    
  2. Kopiera de fullständiga utdata (en hexadecimal sträng) och klistra in det här fingeravtrycksvärdet i en textfil.

Redigera den inkommande principen så att den endast tillåter begäranden med ett giltigt certifikat

Skapa nu autentiseringsprincipen i API Management-gatewayen.

  1. I Azure-portalen väljer du din API Management-tjänst. Om det behövs går du till Menyn För Azure-resurser eller på startsidan väljer du Alla resurser och sedan din API Management-tjänst.

  2. I det vänstra menyfönstret går du till API:er och väljer API:er. FÖNSTRET API:er för API Management-tjänsten visas.

  3. På den sekundära menyn väljer du Väderdata.

  4. I rutan Inkommande bearbetning väljer du< ikonen/>för att öppna kodredigeraren Principer. HTML-koden för principnoden visas.

    Inbound processing policy button.

  5. <inbound> Ersätt noden i principfilen med följande XML och ersätt fingeravtrycket som du kopierade tidigare för desired-fingerprint platshållaren:

    <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. Välj Spara.

Anropa gatewayen och skicka klientcertifikatet

Nu kan du testa den nya autentiseringsprincipen med och utan certifikatet.

  1. Om du vill testa API:et utan certifikatet kör du följande kommando i Cloud Shell och ersätter platshållarvärdena med api-gatewayens namn och prenumerationsnyckel.

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

    Det här kommandot ska returnera ett 403-klientcertifikatfel, och inga data returneras.

  2. Om du vill testa API:et med certifikatet i Cloud Shell kopierar du och klistrar in följande cURL-kommando med hjälp av den primära prenumerationsnyckeln från den första övningen (du kan också hämta den här primärnyckeln från fönstret Prenumerationer för din WeatherData API Management-tjänst). Kom ihåg att inkludera ditt API-gatewaynamn.

    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
    

    Det här kommandot bör resultera i ett lyckat svar som visar väderdata som liknar följande.

    {"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}