Aggiunta del supporto mTLS alle distribuzioni API

Scopri come utilizzare un criterio di richiesta per aggiungere il supporto mTLS alle distribuzioni API con il gateway API.

I gateway API creati con il servizio gateway API sono protetti mediante cifratura e verifica TLS. Un gateway API presenta un certificato server a un client API durante un handshake TLS, consentendo al client API di convalidare l'autenticità del gateway API. Il processo del client API che autentica il gateway API è noto come TLS unidirezionale.

In molte situazioni, è sufficiente consentire ai client API autenticati di accedere a un'interfaccia API. In questi casi, si desidera che il gateway API convalidi l'autenticità di un client API verificando il certificato TLS presentato dal client API. Il processo del gateway API che autentica il client API è noto come mTLS (mutual TLS).

Con mTLS, sia il gateway API che il client API scambiano e verificano i certificati durante l'handshake TLS. Il gateway API verifica il certificato TLS presentato dal client API utilizzando certificati radice CA (Certificate Authority) personalizzati e bundle CA personalizzati di certificati radice e intermedi. Le CA e i bundle CA personalizzati vengono memorizzati nel truststore del gateway API, insieme a un bundle CA predefinito che contiene certificati di CA pubbliche ben note. In un handshake mTLS, il gateway API utilizza solo CA personalizzate e bundle CA personalizzati per verificare i certificati client API. Il gateway API non utilizza il bundle CA predefinito per verificare i certificati client API. Pertanto, se si desidera che un gateway API supporti mTLS, è necessario aggiungere CA e bundle CA personalizzati al truststore del gateway API (vedere Personalizzazione dei truststore per la verifica dei certificati TLS).

Per un ulteriore controllo, è inoltre possibile specificare che i certificati presentati dai client API a un gateway API devono contenere valori specifici nei campi Indirizzo e-mail, URL o Nome dominio del certificato. Se si specificano i valori per questi campi durante l'impostazione di mTLS per un gateway API, il gateway API rifiuterà le richieste dei client API che presentano certificati che non li contengono. Se non si specificano valori per questi campi durante l'impostazione di mTLS, il gateway API accetterà tutte le richieste dei client API che forniscono il certificato valido. Per impostazione predefinita, è possibile specificare fino a 10 valori per ogni distribuzione API (è possibile modificare questo limite interno).

Dopo un handshake mTLS riuscito tra il gateway API e un client API, una versione del certificato con codifica Base64 presentata dal client API viene salvata nella tabella di contesto request.cert come variabile di contesto denominata request.cert[client_base64]. Quando si definisce una distribuzione API, è possibile fare riferimento al certificato utilizzando il formato ${request.cert[client_base64]} (vedere Aggiunta di variabili di contesto ai criteri e alle definizioni backend HTTP). Si noti che se un client API presenta un certificato TLS di dimensioni superiori a 8 KB (dopo che è stato codificato con Base64), il certificato non viene salvato come variabile di contesto.

Utilizzare un criterio di richiesta nella specifica di distribuzione API per aggiungere il supporto mTLS a un'interfaccia API (vedere Aggiunta di criteri di richiesta e di risposta alle specifiche di distribuzione API). Il criterio di richiesta mTLS si applica a livello globale a tutti gli instradamenti in una specifica di distribuzione API.

Nota:
  • Se un client API presenta un certificato TLS a un gateway API e la distribuzione dell'API non è abilitata per mTLS, il gateway API ignora semplicemente il certificato TLS presentato. La variabile di contesto request.cert[client_base64] non è impostata in questa situazione.
  • Se un gateway API non è in grado di convalidare il certificato TLS presentato da un client API, il gateway API rifiuta la richiesta con un codice di risposta di stato di errore HTTP 401.
  • Se un gateway API utilizza un bundle CA personalizzato per convalidare il certificato TLS presentato da un client API, non è possibile attraversare più di tre certificati CA in qualsiasi punto della catena di certificati durante la convalida. In altre parole, per essere valido, un certificato CA nella catena deve essere firmato direttamente da una CA personalizzata presente nel truststore del gateway API oppure non deve trovarsi a più di due certificati intermedi da un certificato firmato da tale CA personalizzata. Contattaci se si desidera consentire più certificati intermedi.

È possibile aggiungere un criterio di richiesta mTLS a una specifica di distribuzione API effettuando le operazioni riportate di seguito.

  • utilizzo di Console
  • modifica di un file JSON

Utilizzo della console per aggiungere criteri di richiesta mTLS

Per aggiungere un criterio di richiesta mTLS a una specifica di distribuzione API utilizzando la console, effettuare le operazioni riportate di seguito.

  1. Creare o aggiornare una distribuzione API utilizzando la console, selezionare l'opzione Da zero e immettere i dettagli nella pagina Informazioni di base.

    Per ulteriori informazioni, vedere Distribuzione di un'interfaccia API in un gateway API mediante la creazione di una distribuzione API e Aggiornamento di un gateway API.

  2. Nella sezione Criteri di richiesta API della pagina Informazioni di base, in Mutual-TLS selezionare l'opzione Abilita mTLs e, facoltativamente, specificare:

    • SAN (Subject Alternative Name) / Common Name: valori che devono essere visualizzati in uno o più dei seguenti campi del certificato presentato dal client API per consentire al gateway API di accettare le richieste dal client:
      • Indirizzo e-mail
      • URL
      • Nome dominio

      Ad esempio, example.com. È possibile specificare fino a 10 valori per impostazione predefinita (è possibile modificare questo limite interno). La convalida non distingue tra maiuscole e minuscole.

      È possibile includere un carattere jolly asterisco (*) all'inizio e/o alla fine di ogni valore per rappresentare zero, uno o più caratteri. Non è possibile includere un carattere jolly asterisco al centro del valore. Ad esempio:

      • *.example.com corrisponde a server.example.com
      • server.example.* corrisponde a server.example.com
      • *.example.* corrisponde a server.example.com
      • server.*.com non corrisponde a server.example.com perché il carattere jolly non può trovarsi al centro del valore

      Se si specificano valori durante l'impostazione di mTLS per una distribuzione API, il gateway API rifiuterà le richieste dei client API che presentano certificati che non li contengono. Se non si specificano valori durante l'impostazione di mTLS, il gateway API accetterà tutte le richieste dei client API che forniscono il certificato valido.

  3. Selezionare Rivedi per esaminare i dettagli immessi per la distribuzione API.
  4. Selezionare Crea o Salva modifiche per creare o aggiornare la distribuzione API.
  5. (Facoltativo) Confermare che l'interfaccia API sia stata distribuita correttamente chiamandola (vedere Chiamata di un'interfaccia API distribuita in un gateway API).

Modifica di un file JSON per aggiungere criteri di richiesta mTLS

Per aggiungere un criterio di richiesta mTLS a una specifica di distribuzione API in un file JSON, effettuare le operazioni riportate di seguito.

  1. Utilizzando l'editor JSON preferito, modificare la specifica di distribuzione API esistente alla quale si desidera aggiungere il supporto mTLS o creare una nuova specifica di distribuzione API (vedere Creazione di una specifica di distribuzione API).

    Ad esempio, la seguente specifica di distribuzione API di base definisce una semplice funzione serverless Hello World nelle funzioni OCI come un singolo backend:

    {
      "routes": [
        {
          "path": "/hello",
          "methods": ["GET"],
          "backend": {
            "type": "ORACLE_FUNCTIONS_BACKEND",
            "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
          }
        }
      ]
    }
  2. Per specificare un criterio di richiesta mTLS che si applica a livello globale a tutti gli instradamenti in una distribuzione API, effettuare le operazioni riportate di seguito.

    1. Se non esiste già, inserire una sezione requestPolicies prima della sezione routes. Ad esempio:

      {
        "requestPolicies": {},
        "routes": [
          {
            "path": "/hello",
            "methods": ["GET"],
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            }
          }
        ]
      }
    2. Aggiungere il seguente criterio mutualTLS alla nuova sezione requestPolicies da applicare a livello globale a tutti gli instradamenti in una distribuzione API:

      {
        "requestPolicies": {
          "mutualTls":{
            "isVerifiedCertificateRequired": true|false,
            "allowedSans": [<list-of-values>]
          }
        },
        "routes": [
          {
            "path": "/hello",
            "methods": ["GET"],
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            }
          }
        ]
      }

      dove:

      • "isVerifiedCertificateRequired": true|false è true o false, che indica se mTLS è abilitato per la distribuzione dell'API. Se non viene specificato, il valore predefinito è false.
      • "allowedSans": [<list-of-values>] è un elenco facoltativo di valori separati da virgole che devono essere visualizzati in uno o più dei seguenti campi del certificato presentato dal client API affinché il gateway API accetti le richieste del client:
        • Indirizzo e-mail
        • URL
        • Nome dominio

        Ad esempio, example.com. È possibile specificare fino a 10 valori per impostazione predefinita (è possibile modificare questo limite interno). La convalida non distingue tra maiuscole e minuscole.

        È possibile includere un carattere jolly asterisco (*) all'inizio e/o alla fine di ogni valore per rappresentare zero, uno o più caratteri. Non è possibile includere un carattere jolly asterisco al centro del valore. Ad esempio:

        • *.example.com corrisponde a server.example.com
        • server.example.* corrisponde a server.example.com
        • *.example.* corrisponde a server.example.com
        • server.*.com non corrisponde a server.example.com perché il carattere jolly non può trovarsi al centro del valore

        Se si specificano valori durante l'impostazione di mTLS per una distribuzione API, il gateway API rifiuterà le richieste dei client API che presentano certificati che non li contengono. Se non si specificano valori durante l'impostazione di mTLS, il gateway API accetterà tutte le richieste dei client API che forniscono il certificato valido.

      Ad esempio:

      {
        "requestPolicies": {
          "mutualTls":{
            "isVerifiedCertificateRequired": true,
            "allowedSans": [
              "example.com",
              "example.co.uk"
            ]
          }
        },
        "routes": [
          {
            "path": "/hello",
            "methods": ["GET"],
            "backend": {
              "type": "ORACLE_FUNCTIONS_BACKEND",
              "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
            }
          }
        ]
      }
  3. Salvare il file JSON contenente la specifica di distribuzione API.
  4. Utilizzare la specifica di distribuzione API quando si crea o si aggiorna una distribuzione API nei modi riportati di seguito.

    • specificando il file JSON nella console quando si seleziona l'opzione Carica un'interfaccia API esistente
    • specificando il file JSON in una richiesta all'API REST del gateway API

    Per ulteriori informazioni, vedere Distribuzione di un'interfaccia API in un gateway API mediante la creazione di una distribuzione API e Aggiornamento di un gateway API.

  5. (Facoltativo) Confermare che l'interfaccia API sia stata distribuita correttamente chiamandola (vedere Chiamata di un'interfaccia API distribuita in un gateway API).