O tráfego de rede iniciado pelo Dialogflow para solicitações de webhook é enviado em uma rede pública. Para garantir que o tráfego seja seguro e confiável em ambas as direções, o Dialogflow é compatível com a autenticação TLS mútua (mTLS) (em inglês). Durante o handshake de TLS padrão do Dialogflow, o servidor de webhook apresenta um certificado que pode ser validado pelo Dialogflow, seguindo a cadeia de autoridades certificadoras ou comparando o certificado a um certificado de AC personalizado. Ao ativar o mTLS no servidor de webhook, ele poderá autenticar o certificado do Google apresentado pelo Dialogflow para validação, concluindo o estabelecimento de confiança mútua.
Como solicitar mTLS
Para solicitar mTLS:
- Prepare o servidor HTTPS de webhook para solicitar o certificado do cliente durante o handshake de TLS.
- O servidor de webhook verifica o certificado do cliente ao recebê-lo.
- Instale uma cadeia de certificados para seu servidor de webhook. É possível que ele seja mutuamente confiável tanto pelo cliente quanto pelo servidor. Os aplicativos que se conectam aos Serviços do Google precisam confiar em todas as autoridades de certificação listadas nos Serviços de confiança do Google. Faça o download de certificados raiz em: https://pki.goog/.
Exemplo de chamada para um servidor de webhook usando mTLS
Este exemplo usa o agente mostrado no início rápido com um servidor de webhook
executando
openssl
.
- Exemplo de configuração
- Um agente do Dialogflow CX que recebe pedidos de camisetas e os envia para um webhook que aponta para um servidor da Web independente.
- Uma chave privada para comunicação TLS em um arquivo chamado
key.pem
. - Uma cadeia de certificados assinada por uma
autoridade de certificação
publicamente confiável (CA) em um arquivo chamado
fullchain.pem
.
-
Execute o programa
openssl s_server
na máquina do servidor.sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
- Uma solicitação é enviada ao agente de uma máquina cliente. Neste exemplo, a solicitação é "Quero comprar uma camisa vermelha grande". Essa solicitação pode ser enviada usando o Console do Dialogflow ou por uma chamada de API.
-
Saída de
openssl s_server
na máquina do servidor.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
Certificado do cliente personalizado
Os certificados de cliente personalizados podem ser configurados no nível do agente para serem usados por todos os webhooks. No momento da invocação do webhook, os certificados configurados serão apresentados durante o handshake.
A chave privada e a senha longa são configuradas como um recurso do Secret Manager. O agente de serviço do Dialogflow precisa receber permissões de acesso ao secret do Secret Manager.
Os certificados do cliente precisam ser assinados por uma autoridade certificadora para que a negociação seja bem-sucedida.
Prática recomendada
Para garantir que as solicitações de webhook sejam iniciadas pelos seus próprios agentes do Dialogflow, verifique o token de identidade do serviço do Bearer no cabeçalho de autorização da solicitação. Como alternativa, é possível verificar um parâmetro de sessão fornecido anteriormente por um servidor de autenticação do seu lado.
Erros
Se a validação do certificado do cliente falhar, por exemplo, se o servidor de webhook não confiar no certificado do cliente, o handshake de TLS falhará e a sessão será encerrada.
Mensagens de erro comuns:
Mensagem de erro | Explicação |
---|---|
Falha ao verificar o certificado do cliente: x509: certificado assinado por autoridade desconhecida | O Dialogflow envia seu certificado de cliente para o webhook externo, mas o webhook não pode verificá-lo. Isso pode acontecer porque o webhook externo não instalou a cadeia de CA corretamente. Todas as CAs raiz do Google são confiáveis. |