상호 TLS 인증

Dialogflow가 웹훅 요청을 위해 시작한 네트워크 트래픽은 공개 네트워크를 통해 전송됩니다. 트래픽이 양방향에서 안전하고 신뢰할 수 있도록 하기 위해 Dialogflow는 상호 TLS 인증(mTLS)을 선택적으로 지원합니다. Dialogflow의 표준 TLS 핸드셰이크 중에 웹훅 서버는 인증 기관 체인에 따라 또는 인증서를 커스텀 CA 인증서와 비교하여 Dialogflow에서 유효성을 검사할 수 있는 인증서를 제공합니다. 웹훅 서버에서 mTLS를 사용 설정하면 검증을 위해 Dialogflow가 웹훅 서버에 제공한 Google 인증서를 인증하여 상호 트러스트 설정을 완료할 수 있습니다.

mTLS 요청

mTLS를 요청하려면 다음 안내를 따르세요.

  1. TLS 핸드셰이크 중에 클라이언트 인증서를 요청하도록 웹훅 HTTPS 서버를 준비합니다.
  2. 웹훅 서버는 클라이언트 인증서를 받으면 이를 확인해야 합니다.
  3. 클라이언트와 서버가 모두 신뢰할 수 있는 웹훅 서버의 인증서 체인을 설치합니다. Google 서비스에 연결하는 애플리케이션은 Google Trust Services에 나열된 모든 인증 기관을 신뢰해야 합니다. 루트 인증서를 https://pki.goog/에서 다운로드할 수 있습니다.

mTLS를 사용한 웹훅 서버에 대한 샘플 호출

이 예시에서는 openssl을 실행하는 웹훅 서버와 함께 빠른 시작에 표시된 에이전트를 사용합니다.

  1. 샘플 설정
    1. 셔츠 주문을 가져와 독립형 웹 서버를 가리키는 웹훅에 전송하는 Dialogflow CX 에이전트
    2. key.pem이라는 파일에 있는 TLS 통신의 비공개 키입니다.
    3. fullchain.pem 파일에 공개적으로 신뢰할 수 있는 CA(인증 기관)가 서명한 인증서 체인
  2. 서버 머신에서 openssl s_server 프로그램을 실행합니다.
    sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
  3. 클라이언트 머신에서 에이전트로 요청이 전송됩니다. 이 예시에서 요청은 '빨간색 셔츠(L)를 사고 싶습니다'입니다. 이 요청은 Dialogflow Console을 사용하거나 API 호출을 통해 전송할 수 있습니다.
  4. 서버 머신의 openssl s_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
          

권장사항

웹훅 요청이 자체 Dialogflow 에이전트에서 시작되도록 하려면 요청의 승인 헤더에서 Bearer 서비스 ID 토큰을 확인해야 합니다. 또는 내 측의 인증 서버에서 이전에 제공한 세션 매개변수를 확인할 수 있습니다.

오류

클라이언트 인증서 검증에 실패하면(예: 웹훅 서버가 클라이언트 인증서를 신뢰하지 않음) TLS 핸드셰이크가 실패하고 세션이 종료됩니다.

일반적인 오류 메시지:

오류 메시지 설명
클라이언트 인증서를 확인할 수 없음: x509: 알 수 없는 기관에서 서명한 인증서 Dialogflow가 클라이언트 인증서를 외부 웹훅으로 전송하지만 외부 웹훅에서 확인할 수 없습니다. 외부 웹훅에서 CA 체인을 올바르게 설치하지 않았기 때문일 수 있습니다. Google의 모든 루트 CA를 신뢰할 수 있어야 합니다.