Gegenseitige TLS-Authentifizierung

Der von Dialogflow für Webhook-Anfragen initiierte Netzwerkverkehr wird über ein öffentliches Netzwerk gesendet. Dialogflow unterstützt optional die gegenseitige TLS-Authentifizierung (mTLS), um sicherzustellen, dass der Traffic in beide Richtungen sicher und vertrauenswürdig ist. Dialogflow unterstützt optional die gegenseitige TLS-Authentifizierung (mTLS). Während des standardmäßigen TLS-Handshakes von Dialogflow präsentiert Ihr Webhook-Server ein Zertifikat, das von Dialogflow validiert werden kann. Dazu wird entweder die Zertifizierungsstellenkette verfolgt oder das Zertifikat mit einem benutzerdefinierten CA-Zertifikat verglichen. Wenn Sie mTLS auf Ihrem Webhook-Server aktivieren, kann er das Google-Zertifikat, das von Dialogflow Ihrem Webhook-Server zur Validierung präsentiert wird, authentifizieren und so das gegenseitige Vertrauen herstellen.

mTLS anfordern

So fordern Sie mTLS an:

  1. Sie konfigurieren Ihren Webhook-HTTPS-Server so, dass er während des TLS-Handshakes das Clientzertifikat anfordert.
  2. Der Webhook-Server sollte das Clientzertifikat beim Empfang bestätigen.
  3. Sie installieren für den Webhook-Server eine Zertifikatskette, die sowohl vom Client als auch vom Server als vertrauenswürdig eingestuft werden kann. Anwendungen, die eine Verbindung zu Google-Diensten herstellen, sollten allen von Google Trust Services aufgeführten Zertifizierungsstellen vertrauen. Sie können Root-Zertifikate von https://pki.goog/ herunterladen.

Beispiel für einen Aufruf an einen Webhook-Server mit mTLS

In diesem Beispiel wird der in der Kurzanleitung gezeigte Agent mit einem Webhook-Server verwendet, auf dem opensslausgeführt wird.

  1. Beispielkonfiguration
    1. Ein Dialogflow CX-Agent, der Bestellungen für T-Shirts entgegennimmt und sie an einen Webhook sendet, der auf einen eigenständigen Webserver verweist.
    2. Ein privater Schlüssel für die TLS-Kommunikation in einer Datei mit dem Namen key.pem.
    3. Eine Zertifikatskette, die von einer öffentlich vertrauenswürdigen Zertifizierungsstelle signiert wurde, in einer Datei mit dem Namen fullchain.pem.
  2. Führen Sie das openssl s_server Programm auf dem Server aus.
    sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
  3. Eine Anfrage wird von einem Clientcomputer an den Agent gesendet. In diesem Beispiel lautet die Anfrage „Ich möchte ein großes rotes T-Shirt kaufen“. Diese Anfrage kann über die Dialogflow-Konsole oder über einen API-Aufruf gesendet werden.
  4. Ausgabe von openssl s_server auf dem 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
          

Benutzerdefiniertes Clientzertifikat

Benutzerdefinierte Clientzertifikate können auf Agent-Ebene konfiguriert werden, damit sie von allen Webhooks verwendet werden können. Beim Aufruf des Webhooks werden die konfigurierten Zertifikate während des Handshakes präsentiert.

Der private Schlüssel und die Passphrase werden als Secret Manager-Ressource konfiguriert. Dem Dialogflow-Dienst-Agent muss die Berechtigung „Secret Manager Secret Accessor“ für das Secret gewährt werden.

Die Clientzertifikate müssen von einer Zertifizierungsstelle signiert sein, damit der Handshake erfolgreich ist.

Best Practice

Damit die Webhook-Anfragen von Ihren eigenen Dialogflow-Agents initiiert werden, sollten Sie das Bearer Dienstidentitätstoken aus dem Authorization-Header der Anfrage prüfen. Alternativ können Sie einen Sitzungsparameter prüfen, der zuvor von einem Authentifizierungsserver auf Ihrer Seite bereitgestellt wurde.

Fehler

Wenn die Validierung des Clientzertifikats fehlschlägt (z. B. weil der Webhook-Server dem Clientzertifikat nicht vertraut), schlägt der TLS-Handshake fehl und die Sitzung wird beendet.

Häufige Fehlermeldungen:

Fehlermeldung Erklärung
Failed to verify client's certificate: x509: certificate signed by unknown authority Dialogflow sendet das Clientzertifikat an den externen Webhook, der es jedoch nicht bestätigen kann. Das kann daran liegen, dass der externe Webhook die CA-Kette nicht korrekt installiert hat. Alle Stamm-CAs von Google sollten vertrauenswürdig sein.