O tráfego de rede iniciado pelo Dialogflow para pedidos de webhook é enviado numa rede pública. Para garantir que o tráfego é seguro e fidedigno em ambas as direções, o Dialogflow suporta opcionalmente a autenticação TLS mútua (mTLS). Durante o handshake TLS padrão do Dialogflow, o servidor do webhook apresenta um certificado que pode ser validado pelo Dialogflow, seguindo a cadeia de autoridades de certificação ou comparando o certificado com um certificado de AC personalizado. Ao ativar o mTLS no servidor de webhook, este vai poder autenticar o certificado da Google apresentado pelo Dialogflow ao servidor de webhook para validação, concluindo o estabelecimento de confiança mútua.
Pedir mTLS
Para pedir mTLS:
- Prepare o servidor HTTPS do webhook para pedir o certificado de cliente durante o handshake TLS.
- O servidor do webhook deve validar o certificado do cliente após a receção.
- Instale uma cadeia de certificados para o seu servidor de webhook, que pode ser mutuamente fidedigna tanto para o cliente como para o servidor. As aplicações que se ligam aos serviços Google devem confiar em todas as autoridades de certificação indicadas pelos serviços de confiança da Google. Pode transferir certificados de raiz a partir de: https://pki.goog/.
Exemplo de chamada para um servidor de webhook através do mTLS
Este exemplo usa o agente apresentado no início rápido com um servidor de webhook em execução em openssl.
- Configuração de exemplo
- Um agente do Dialogflow ES que cumprimenta o utilizador final e consulta um webhook que aponta para um servidor Web autónomo.
- Uma chave privada para comunicação TLS num ficheiro denominado
key.pem. - Uma cadeia de certificados assinada por uma
CA (autoridade de certificação) fidedigna publicamente num ficheiro denominado
fullchain.pem.
-
Execute o programa
openssl s_serverna máquina do servidor.sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1 - É enviado um pedido ao agente a partir de um computador cliente. Para este exemplo, o pedido é "Olá". Este pedido pode ser enviado através da consola do Dialogflow ou através de uma chamada API.
-
Resultado de
openssl s_serverna 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 os pedidos de webhook são iniciados pelos seus próprios agentes do Dialogflow, deve validar o token de identidade do serviço do portador no cabeçalho de autorização do pedido. Em alternativa, pode validar 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, o servidor do webhook não confiar no certificado do cliente), a negociação TLS falha e a sessão termina.
Mensagens de erro comuns:
| Mensagem de erro | Explicação |
|---|---|
| Falha ao validar o certificado do cliente: x509: certificate signed by unknown authority | O Dialogflow envia o respetivo certificado de cliente para o webhook externo, mas o webhook externo não o consegue validar. Isto pode dever-se ao facto de o webhook externo não ter instalado corretamente a cadeia de AC. Todas as ACs de raiz da Google devem ser fidedignas. |