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 seu servidor de webhook, ele poderá autenticar o certificado do Google apresentado pelo Dialogflow ao servidor de webhook para validação, concluindo o estabelecimento de conexões confiança.
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
Neste exemplo, usamos o agente mostrado no guia de início rápido com um
Servidor webhook
correndo
openssl
.
- Exemplo de configuração
- Um agente do Dialogflow ES que cumprimenta o usuário final e consulta uma 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 um
confiável publicamente
Autoridade de certificação (AC) 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 por uma máquina cliente. Para este exemplo, a solicitação é "Olá". 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: 0x6A6A:... Shared Elliptic groups: X25519:... CIPHER is TLS_AES_128_GCM_SHA256 Secure Renegotiation IS NOT supported POST /dialogflowFulfillment HTTP/1.1 authorization: Bearer ey... content-type: application/json Host: www.example.com Content-Length: 1011 Connection: keep-alive Accept: */* User-Agent: Google-Dialogflow Accept-Encoding: gzip, deflate, br { "responseId": "96c0029a-149d-4f5d-b225-0b0bb0f0c8d9-afbcf665", "queryResult": { "queryText": "Hi", "action": "input.welcome", "parameters": { }, "allRequiredParamsPresent": true, "outputContexts": [{ "name": "projects/PROJECT-ID/agent/sessions/58ab33f3-b57a-aae9-fb23-8306242d4871/contexts/__system_counters__", "parameters": { "no-input": 0.0, "no-match": 0.0 } }], "intent": { "name": "projects/PROJECT-ID/agent/intents/399277d6-2ed7-4329-840d-8baa0f60480e", "displayName": "Default Welcome Intent" }, "intentDetectionConfidence": 1.0, "languageCode": "en", "sentimentAnalysisResult": { "queryTextSentiment": { "score": 0.2, "magnitude": 0.2 } } }, "originalDetectIntentRequest": { "source": "DIALOGFLOW_CONSOLE", "payload": { } }, "session": "projects/PROJECT-ID/agent/sessions/58ab33f3-b57a-aae9-fb23-8306242d4871" }ERROR shutting down SSL CONNECTION CLOSED
Prática recomendada
Para garantir que as solicitações de webhook sejam iniciadas pelos seus próprios agentes do Dialogflow, verifique o portador token de identidade do serviço no cabeçalho de autorização da solicitação. Também é possível verificar uma sessão fornecido anteriormente por um servidor de autenticação de 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. |