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. Während des standardmäßigen TLS-Handshakes von Dialogflow stellt Ihr Webhook-Server ein Zertifikat bereit, das von Dialogflow validiert werden kann. entweder der Zertifizierungsstellenkette folgen oder durch Vergleichen des Zertifikats mit einem benutzerdefinierten CA-Zertifikat. Wenn Sie mTLS auf Ihrem Webhook-Server aktivieren, kann er das Google-Zertifikat authentifizieren, das Dialogflow zur Validierung an Ihren Webhook-Server sendet. So wird die gegenseitige Vertrauensstellung hergestellt.

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.

Beispielaufruf an einen Webhook-Server mit mTLS

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

  1. Beispielkonfiguration
    1. Dialogflow CX-Kundenservicemitarbeiter, der T-Shirt-Bestellungen entgegennimmt und an eine Webhook, 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 einem öffentlich vertrauenswürdig Zertifizierungsstelle in einer Datei mit dem Namen fullchain.pem.
  2. Führen Sie das Programm openssl s_server auf dem Servercomputer aus.
    sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
  3. Eine Anfrage wird von einem Clientcomputer an den Agenten gesendet. In diesem Beispiel lautet die Anfrage: „Ich möchte ein rotes Hemd Größe L 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
          

Best Practice

So sorgen Sie dafür, dass Webhook-Anfragen von Ihren eigenen Dialogflow-Agents initiiert werden: sollten Sie den Inhaber überprüfen, Dienstidentitätstoken aus dem Autorisierungsheader der Anfrage. Alternativ können Sie eine Sitzung bestätigen -Parameter, der zuvor von einem Authentifizierungsserver auf Ihrer Seite bereitgestellt wurde.

Fehler

Wenn die Validierung des Clientzertifikats fehlschlägt (Beispiel: Der Webhook-Server vertraut dem Clientzertifikat nicht) 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.