TLS 핸드셰이크는 HTTPS로 클라이언트와 서버가 처음 연결될때 진행되는 메시지 교환이다.
메시지를 교환하여 서로를 인식하고 검증하며 사용할 암호화 알고리즘을 구성하고 세션 키에 합의한다.
간단하게 말해서, 클라이언트와 서버가 TLS 암호화 통신을 시작할때 서로 확인하고 정보를 교환하는 과정이 악수와 비슷해서 생긴 이름이다.
이 핸드셰이크 단계에서 클라이언트는 서버의 인증서를 받아 실뢰할 수 있는 서버인지 확인하고 대칭키를 주고 받는 등의 과정을 거친다.
출처: https://www.cloudflare.com/ko-kr/learning/ssl/what-happens-in-a-tls-handshake/
TLS-Handshake는 위의 그림처럼 클라이언트와 서버가 메시지 교환을 한다.
위의 파랑색 SYN, SYN ACK, ACK는 HTTP가 TCP 기반의 통신이기 때문에 3-way handshake이고 아래의 노란색이 TLS handshake로 메시지를 교환하는 과정이다.
Wireshark를 통해서 실제 TLS 암호화 통신을 할때 어떻게 패킷이 오가는지 확인해 보려고 한다.
www.msn.com 홈페이지에 접속할때의 패킷정보이다.
클라이언트가 서버한테 Client Hello라는 메시지를 보낸다
서버가 응답하여 클라이언트한테 Server Hello 메시지를 보낸다.
서버의 인증서를 클라이언트에게 보내는 단계이다.
클라이언트는 이 메세지를 통해 서버의 인증서가 유효한지 검증한다. (OCSP는 온라인 인증서 상태 프로토콜의 약자로, 인증서 유효성 확인을 제공하는 방법)
인증서의 공개 키 정보가 키 교환에 충분하지 않은 경우 서버는 클라이언트에 서버 키 교환 메시지를 보낸다.(ECDHE라는 key 쌍을 만들어 클라이언트에 보냄)
서버가 보낼 메세지를 모두 보냈다 라는 뜻으로 클라이언트에 메시지를 보낸다.
클라이언트의 난수(Random)와 서버의 난수로 pre-master-secret(대칭키)를 생성한다.
생성한 대칭키는 서버의 공개키로 암호화해 서버로 전송한다.
협상된 키 및 알고리즘을 사용하여 암호화되어 전송될 것임을 나타내는 메시지이다.
클라이언트는 서버에게 TLS 핸드셰이크가 완료되었다는 메시지를 보낸다.
클라이언트와 서버가 서로 전송하는 데이터를 암호화해서 보낸다.
https://feel5ny.github.io/2019/12/08/HTTP_014_02/
https://www.ibm.com/docs/en/sdk-java-technology/8?topic=handshake-tls-12-protocol