Proteggere le API usando i certificati

Completato

I certificati possono essere usati per offrire l'autenticazione reciproca TLS (Transport Layer Security) tra il client e il gateway API. È possibile configurare il gateway di Gestione API per consentire solo le richieste con certificati che contengono un'identificazione personale specifica. L'autorizzazione a livello di gateway è gestita tramite i criteri in ingresso.

Autenticazione client con Transport Layer Security

Con l'autenticazione client TLS, il gateway di Gestione API può controllare il certificato contenuto all'interno della richiesta del client e verificare le proprietà seguenti:

Proprietà Descrizione
Autorità di certificazione Consentire solo i certificati firmati da un'autorità di certificazione specifica
Identificazione personale Consentire i certificati contenenti un'identificazione personale specificata
Argomento Consentire solo i certificati con un oggetto specificato
Data di scadenza Non consentire certificati scaduti

Queste proprietà non si escludono a vicenda e possono essere usate insieme per formare i propri requisiti dei criteri. Ad esempio, è possibile specificare che il certificato passato nella richiesta è firmato e non è scaduto.

I certificati client vengono firmati per impedire che vengano manomessi. Quando un partner invia un certificato, verificare che provenga dal partner e non da un impostore. Esistono due modi comuni per verificare un certificato:

  • Controllare chi ha emesso il certificato. Se l'autorità di certificazione è considerata attendibile, è possibile usare il certificato. Per automatizzare questo processo, è possibile configurare le autorità di certificazione attendibili nel portale di Azure.
  • Se il certificato è emesso dal partner, verificare che provenga dal partner. Ad esempio, se il partner distribuisce il certificato di persona, si può essere certi dell'autenticità. Questi certificati sono chiamati certificati autofirmati.

Accettare i certificati client nel livello Consumo

Il livello Consumo in Gestione API è progettato per essere conforme alle entità di sicurezza della progettazione serverless. Se si compilano le API da tecnologie serverless, ad esempio da Funzioni di Azure, questo livello è una scelta ideale. Nel livello Consumo, è necessario abilitare esplicitamente l'uso di certificati client. Questa operazione può essere eseguita nella pagina Domini personalizzati. Questo passaggio non è necessario negli altri livelli.

Configurare il gateway per richiedere i certificati

Criteri di autorizzazione dei certificati

Creare questi criteri nel file dei criteri di elaborazione in ingresso all'interno del gateway di Gestione API:

Pulsante dei criteri di elaborazione in ingresso

Controllare l'identificazione personale di un certificato client

Tutti i certificati client includono un'identificazione personale, che è un hash, calcolata in base ad altre proprietà del certificato. L'identificazione personale assicura che i valori del certificato non siano stati alterati dopo l'emissione del certificato da parte dell'autorità di certificazione. È possibile controllare l'identificazione personale nei criteri. L'esempio seguente controlla l'identificazione personale del certificato passato nella richiesta:

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

Controllare l'identificazione personale nei certificati caricati in Gestione API

Nell'esempio precedente poiché una sola identificazione personale risulta adatta, verrà convalidato un solo certificato. In genere, ogni cliente o società partner passa un certificato diverso con un'identificazione personale diversa. Per supportare questo scenario, ottenere i certificati dai partner e usare la pagina Certificati client nel portale di Azure per caricarli nella risorsa di Gestione API. Quindi aggiungere il codice seguente ai criteri:

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

Controllare l'autorità di certificazione e l'oggetto di un certificato client

L'esempio seguente controlla l'autorità di certificazione e l'oggetto del certificato passato nella richiesta:

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