Il traffico di rete avviato da Dialogflow per le richieste webhook viene inviato su una rete pubblica. Per garantire che il traffico sia sicuro e attendibile in entrambe le direzioni, Dialogflow supporta facoltativamente l'autenticazione TLS reciproca (mTLS). Durante l'handshake TLS standard di Dialogflow: il server webhook presenta un certificato che può essere convalidato da Dialogflow, seguendo la catena di autorità di certificazione o confrontandolo con un certificato CA personalizzato. Se attivi mTLS sul tuo server webhook, sarà in grado di eseguire l'autenticazione Il certificato Google presentato da Dialogflow al server webhook per la convalida, completando la definizione la fiducia degli utenti.
Richiesta di mTLS
Per richiedere mTLS:
- Prepara il server HTTPS del webhook per richiedere il certificato client durante l'handshake TLS.
- Il server webhook deve verificare il certificato del client al momento della ricezione.
- Installa una catena di certificati per il server webhook che possono essere reciprocamente attendibili sia dal client che dal server. Applicazioni che si connettono ai servizi Google devono fidarsi di tutte le autorità di certificazione elencate Google Trust Services. Puoi scaricare i certificati radice da: https://pki.goog/.
Esempio di chiamata a un server webhook che utilizza mTLS
In questo esempio viene utilizzato l'agente mostrato nella guida rapida con un
server webhook
corsa
openssl
- Configurazione di esempio
- Un agente Dialogflow CX che accetta gli ordini di camicie e li invia a un webhook che rimanda a un server web autonomo.
- Una chiave privata per la comunicazione TLS in un file denominato
key.pem
. - Una catena di certificati firmata da un'autorità di certificazione (CA) ritenuta attendibile pubblicamente in un file denominato
fullchain.pem
.
-
Esegui il programma
openssl s_server
nella macchina server.sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
- Viene inviata una richiesta all'agente da un computer client. Per questo esempio, la richiesta è: "Voglio acquistare una camicia rossa di taglia grande". Questa richiesta può essere inviata tramite Console Dialogflow o tramite una chiamata API.
-
Output di
openssl s_server
nella macchina server.verify depth is 1 Using default temp DH parameters ACCEPT depth=2 C = US, O = Google Trust Services LLC, CN = GTS Root R1 verify return:1 depth=1 C = US, O = Google Trust Services LLC, CN = GTS CA 1D4 verify return:1 depth=0 CN = *.dialogflow.com verify return:1 -----BEGIN SSL SESSION PARAMETERS----- MII... -----END SSL SESSION PARAMETERS----- Client certificate -----BEGIN CERTIFICATE----- MII... -----END CERTIFICATE----- subject=CN = *.dialogflow.com issuer=C = US, O = Google Trust Services LLC, CN = GTS CA 1D4 Shared ciphers:TLS_AES_128_GCM_SHA256:... Signature Algorithms: ECDSA+SHA256:... Shared Signature Algorithms: ECDSA+SHA256:... Peer signing digest: SHA256 Peer signature type: RSA-PSS Supported Elliptic Groups: 0xEAEA:... Shared Elliptic groups: X25519:... CIPHER is TLS_AES_128_GCM_SHA256 Secure Renegotiation IS NOT supported POST /shirts-agent-webhook HTTP/1.1 authorization: Bearer ey... content-type: application/json Host: www.example.com Content-Length: 1595 Connection: keep-alive Accept: */* User-Agent: Google-Dialogflow Accept-Encoding: gzip, deflate, br { "detectIntentResponseId": "a7951ce2-2f00-4af5-a508-4c2cb45698b0", "intentInfo": { "lastMatchedIntent": "projects/PROJECT_ID/locations/REGION/agents/AGENT_ID/intents/0adebb70-a727-4687-b8bc-fbbc2ac0b665", "parameters": { "color": { "originalValue": "red", "resolvedValue": "red" }, "size": { "originalValue": "large", "resolvedValue": "large" } }, "displayName": "order.new", "confidence": 0.9978873 }, "pageInfo": { "currentPage": "projects/PROJECT_ID/locations/REGION/agents/AGENT_ID/flows/00000000-0000-0000-0000-000000000000/pages/06e6fc4d-c2f2-4830-ab57-7a318f20fd90", "displayName": "Order Confirmation" }, "sessionInfo": { "session": "projects/PROJECT_ID/locations/REGION/agents/AGENT_ID/sessions/session-test-001", "parameters": { "color": "red", "size": "large" } }, "fulfillmentInfo": { "tag": "confirm" }, "messages": [{ "text": { "text": ["Ok, let\u0027s start a new order."], "redactedText": ["Ok, let\u0027s start a new order."] }, "responseType": "ENTRY_PROMPT", "source": "VIRTUAL_AGENT" }, { "text": { "text": ["You have selected a large, red shirt."], "redactedText": ["You have selected a large, red shirt."] }, "responseType": "HANDLER_PROMPT", "source": "VIRTUAL_AGENT" }], "text": "I want to buy a large red shirt", "languageCode": "en" }ERROR shutting down SSL CONNECTION CLOSED
Certificato client personalizzato
I certificati client personalizzati possono essere configurati a livello di agente per essere utilizzati da tutti i webhook. Al momento dell'invocazione dell'webhook, i certificati configurati verranno presentati durante l'handshake.
La chiave privata e la passphrase sono configurate come risorsa Secret Manager. All'agente di servizio Dialogflow verrà assegnato il secret Autorizzazioni della funzione di accesso al secret del gestore per il secret.
Affinché l'handshake vada a buon fine, i certificati client devono essere firmati da un'autorità di certificazione.
Best practice
Per assicurarti che le richieste webhook vengano avviate dai tuoi agenti Dialogflow, devi verificare l'identità token di identità del servizio dall'intestazione Autorizzazione della richiesta. In alternativa, puoi verificare un parametro sessione fornito in precedenza da un server di autenticazione di tua proprietà.
Errori
Se la convalida del certificato client non va a buon fine (ad esempio, il server webhook non considera attendibile il certificato client), la procedura di handshake TLS non va a buon fine e la sessione termina.
Messaggi di errore comuni:
Messaggio di errore | Spiegazione |
---|---|
Impossibile verificare il certificato del client: x509: certificato firmato da un'autorità sconosciuta | Dialogflow invia il proprio certificato client al webhook esterno, ma quest'ultimo non può verificarlo. Il motivo potrebbe essere che il webhook esterno non ha installato correttamente la catena di CA. Tutte le CA radice di Google devono essere attendibili. |