Esercizio: Usare i certificati client per proteggere l'accesso a un'API

Completato

Viene eseguita la configurazione di Gestione API in modo che accetti i certificati client usando i criteri in ingresso.

Si supponga che la società del servizio meteo abbia deciso di proteggere le API tramite l'autenticazione dei certificati per alcuni client che già usano l'autenticazione dei certificati in altri sistemi. Questa configurazione consentirà ai client di usare i certificati esistenti per eseguire l'autenticazione al gateway di Gestione API.

In questa unità si apprenderà come:

  • Creare un certificato autofirmato
  • Configurare il gateway per richiedere certificati client
  • Ottenere l'identificazione personale del certificato
  • Modificare i criteri in ingresso per consentire solo i client con il certificato specificato nella richiesta
  • Chiamare il gateway di Gestione API e passare il certificato usando curl

Nota

Questo esercizio usa le risorse configurate nell'esercizio precedente.

Consente di creare il certificato autofirmato

In primo luogo usare Cloud Shell per creare un certificato autofirmato che verrà usato per l'autenticazione tra il client e il gateway di Gestione API.

  1. Per creare la chiave privata e il certificato, eseguire i comandi seguenti in 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
    

    Per rendere l'esempio facile da seguire, i comandi precedenti includono la password usata per proteggere la chiave privata. Ogni volta che si genera una chiave privata per uso personale, assicurarsi di generare una password sicura e di controllare l'accesso alla password in modo appropriato.

  2. È ora possibile convertire il certificato nel formato PEM che può essere usato dallo strumento curl con questi comandi:

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

    Quando viene richiesta la password, immettere Pa$$w0rd e quindi premere INVIO.

Configurare il gateway per richiedere certificati client

Poiché viene usato il livello Consumo per Gestione API, è necessario configurare il gateway in modo che accetti i certificati client. Effettuare i passaggi seguenti.

  1. Dal portale di Azure già aperto selezionare il servizio Gestione API (apim-WeatherDataNNNN).

  2. Nel riquadro dei menu a sinistra, in Distribuzione e infrastruttura selezionare Domini personalizzati. Verrà visualizzato il riquadro Domini personalizzati per il servizio Gestione API.

  3. Per *Richiedi certificato client selezionare e nella barra dei menu in alto selezionare Salva.

    Configure the gateway to request certificates.

Ottenere l'identificazione personale del certificato

In questa sezione si configurerà Gestione API in modo che accetti una richiesta solo se include un certificato con una determinata identificazione personale (impronta digitale). Come ottenere l'identificazione personale dal certificato.

Nota

Un'identificazione personale del certificato SSL è nota anche come impronta digitale del certificato SSL.

  1. Eseguire il codice seguente in Cloud Shell.

    Fingerprint="$(openssl x509 -in selfsigncert.pem -noout -fingerprint)"
    Fingerprint="${Fingerprint//:}"
    echo ${Fingerprint#*=}
    
  2. Copiare l'output completo (stringa esadecimale) e incollare questo valore di impronta digitale in un file di testo.

Modificare i criteri in ingresso per consentire solo le richieste con un certificato valido

Creare ora i criteri di autenticazione nel gateway di Gestione API.

  1. Nel portale di Azure selezionare il servizio Gestione API. Se necessario, nel menu della risorsa di Azure o nella pagina Home selezionare Tutte le risorse e quindi selezionare il servizio Gestione API.

  2. Nel riquadro dei menu a sinistra, in API selezionare API. Viene visualizzato il riquadro API per il servizio Gestione API.

  3. Nel menu secondario selezionare Weather Data.

  4. Nella casella Elaborazione in ingresso selezionare l'icona </> per aprire l'editor di codice dei criteri. Verrà visualizzato il codice HTML per il nodo dei criteri.

    Inbound processing policy button.

  5. Sostituire il nodo <inbound> del file di criteri con il codice XML seguente, sostituendo l'impronta digitale copiata in precedenza per il segnaposto desired-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. Seleziona Salva.

Chiamare il gateway e passare il certificato client

È ora possibile testare i nuovi criteri di autenticazione con e senza il certificato.

  1. Per testare l'API senza il certificato, eseguire il comando seguente in Cloud Shell, sostituendo i valori segnaposto con il nome del gateway API e la chiave di sottoscrizione.

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

    Questo comando dovrebbe restituire un errore di certificato client 403 e non verranno restituiti dati.

  2. In Cloud Shell, per testare l'API con il certificato, copiare e incollare il comando cURL seguente usando la chiave di sottoscrizione primaria del primo esercizio (è anche possibile ottenere questa chiave primaria dal riquadro Sottoscrizioni per il servizio Gestione API WeatherData). Ricordarsi di includere il nome del gateway 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
    

    Questo comando restituisce una risposta di operazione riuscita visualizzando dati meteo simili ai seguenti.

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