Dialogflow가 웹훅 요청을 위해 시작한 네트워크 트래픽은 공개 네트워크를 통해 전송됩니다. 트래픽이 양방향에서 안전하고 신뢰할 수 있도록 하기 위해 Dialogflow는 상호 TLS 인증(mTLS)을 선택적으로 지원합니다. Dialogflow의 표준 TLS 핸드셰이크 중에 웹훅 서버는 인증 기관 체인에 따라 또는 인증서를 커스텀 CA 인증서와 비교하여 Dialogflow에서 유효성을 검사할 수 있는 인증서를 제공합니다. 웹훅 서버에서 mTLS를 사용 설정하면 검증을 위해 Dialogflow가 웹훅 서버에 제공한 Google 인증서를 인증하여 상호 트러스트 설정을 완료할 수 있습니다.
mTLS 요청
mTLS를 요청하려면 다음 안내를 따르세요.
- TLS 핸드셰이크 중에 클라이언트 인증서를 요청하도록 웹훅 HTTPS 서버를 준비합니다.
- 웹훅 서버는 클라이언트 인증서를 받으면 이를 확인해야 합니다.
클라이언트와 서버가 모두 신뢰할 수 있는 웹훅 서버의 인증서 체인을 설치합니다. Google 서비스에 연결하는 애플리케이션은 Google Trust Services에 나열된 모든 인증 기관을 신뢰해야 합니다. 루트 인증서를 https://pki.goog/에서 다운로드할 수 있습니다.
mTLS를 사용한 웹훅 서버에 대한 샘플 호출
이 예시에서는 openssl
을 실행하는 웹훅 서버와 함께 빠른 시작에 표시된 에이전트를 사용합니다.
- 샘플 설정
- 셔츠 주문을 가져와 독립형 웹 서버를 가리키는 웹훅에 전송하는 Dialogflow CX 에이전트
key.pem
이라는 파일에 있는 TLS 통신의 비공개 키입니다.fullchain.pem
파일에 공개적으로 신뢰할 수 있는 CA(인증 기관)가 서명한 인증서 체인
-
서버 머신에서
openssl s_server
프로그램을 실행합니다.sudo openssl s_server -key key.pem -cert fullchain.pem -accept 443 -verify 1
- 클라이언트 머신에서 에이전트로 요청이 전송됩니다. 이 예시에서 요청은 '빨간색 셔츠(L)를 사고 싶습니다'입니다. 이 요청은 Dialogflow Console을 사용하거나 API 호출을 통해 전송할 수 있습니다.
-
서버 머신의
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를 신뢰할 수 있어야 합니다. |