본문 바로가기
CS 지식

TLS(SSL) HandShake

by chanfficial 2022. 11. 15.

TLS(Transport Layer Security) HandShake

  • TLS 는 안전한 인터넷 통신을 위한 암호화 프로토콜이며, TLS HandShake 는 TLS 암호화를 사용하는 통신 세션을 실행하는 프로세스이다.
  • 통신 양측은 TLS HandShake 중에 메세지를 교환하여 서로를 인식하고 검증하며, 사용할 암호화 알고리즘을 구성하고 세션 키를 합의한다.
  • HTTPS 작동 원리의 시초이다.
  • 클라이언트와 서버가 교환하는 일련의 데이터그램(메시지) 이다.

*SSL(Secure Socket Layer)은 원래 HTTP 용으로 개발된 암호화 프로토콜이었지만 오래 전 TLS 로 대체되었다.

 

 

TLS HandShake 의 발생 타이밍

  • TLS HandShake 는 사용자가 HTTPS 를 통해 웹 사이트를 탐색하고 브라우저가 처음 해당 웹 사이트의 원본 서버를 쿼리할 때마다 발생한다.
  • 다른 통신이 API 호출 및 HTTPS 를 통한 DNS 쿼리를 포함하는 HTTPS 를 사용할 때에도 항상 발생한다.
  • TLS HandShake 는 TCP 연결이 TCP HandShake 를 통해 열린 후에 발생한다.

 

 

TLS HandShake 과정 중 클라이언트와 서버가 수행하는 것

  • 사용할 TLS 버전을 지정한다.
  • 사용할 암호 제품군을 결정한다.
  • 서버의 공개 키와 SSL 인증서 기관의 디지털 서명을 통해 서버의 ID를 인증한다.
  • HandShake 가 완료된 후에 대칭 암호화를 사용하기 위해 세션 키를 생성한다.

 

TLS HandShake 의 단계

: 정확한 단계는 사용되는 키 교환 알고리즘의 유형과 양측에서 모두 지원하는 암호 제품군의 유형에 따라 달라지며 대부분 RSA 키 교환 알고리즘이 사용된다.

* 암호 제품군은 안전한 통신 연결을 수립하는 데 사용하는 암호화 알고리즘 세트이다. 현재 널리 사용되는 여러 암호 제품군이 있으며, TLS HandShake 에서는 어떤 암호 제품군을 사용할지 반드시 합의해야 한다.

 

1. 클라이언트가 'Hello' 메시지를 보냄

 - 클라이언트가 서버로 메시지를 전송하며 HandShake 를 개시한다. 이 메시지에는 클라이언트가 지원하는 TLS 버전, 지원되는 암호 제품군과 '클라이언트 무작위' 라고 하는 무작위 바이트 문자열이 포함된다.

 

2. 서버가 'Hello' 메시지의 답장을 보냄

 - 서버가 클라이언트 메시지에 대한 응답으로 서버의 SSL 인증서, 서버에서 선택한 암호 제품군과 서버에서 생성한 또다른 무작위 바이트 문자열인 '서버 무작위' 를 포함하는 메시지를 전송한다.

 

3. 인증

 - 클라이언트가 서버의 SSL 인증서를 인증서 발행 기관을 통해 검증하여 서버가 인증서에 명시된 서버인지, 클라이언트와 상호작용중인 서버가 실제 해당 도메인의 소유자인지를 확인한다.

 

4. 클라이언트가 '예비 마스터 암호' 전송

 - 클라이언트가 '예비 마스터 암호' 라고 하는 무작위 바이트 문자열을 하나 더 전송한다. 예비 마스터 암호는 공개 키로 암호화되어 있으며, 서버가 개인 키로만 해독할 수 있다.(클라이언트는 서버의 SSL 인증서를 통해 공개 키를 받음)

 

5. 서버의 개인 키 사용

 - 서버가 보유한 개인 키를 사용하여 수신한 예비 마스터 암호를 해독한다.

 

6. 양측의 세션 키 생성

 - 양측 모두 클라이언트 무작위, 서버 무작위, 예비 마스터 암호를 이용해 세션 키를 생성한다. 이때, 모두 같은 결과가 나와야 한다.

 

7. 클라이언트 준비 완료

 - 클라이언트가 세션 키로 암호화된 '완료' 메시지를 전송한다.

 

8. 서버 준비 완료

 - 서버가 세션 키로 암호화된 '완료' 메시지를 전송한다.

 

9. 안전한 대칭 암호화 성공

 - HandShake 가 완료되고, 세션 키를 이용해 통신이 계속 진행된다.

'CS 지식' 카테고리의 다른 글

인덱스(Index)  (0) 2022.11.28
Blocking 과 Non-Blocking  (0) 2022.11.26
HTTP의 GET 과 POST  (0) 2022.11.12
HTTP 와 HTTPS  (0) 2022.11.12
대칭키와 공개키  (0) 2022.11.10