SSL/TLS Handshake란
TLS(Transport Layer Security)는 인터넷을 통해 전달되는 데이터가 도청되거나 변조하지 못하도록 합니다. 패스워드나 신용카드 번호 등 민감한 정보가 안전하게 전달될 수 있도록 합니다.
SSL에서 개선된 것이 TLS라고 하고, 현재는 TLS 1.3 버전까지 나와있다고 합니다.
이는 Transport 계층과 Application 계층 사이에서 작동합니다.
TLS Handshake란
TLS Handshake는 서버가 신뢰 가능한지 확인하고 대칭키를 전달하는 과정입니다.
이는 TCP 커넥션이 맺어진 후 진행됩니다.
TLS Handshake 과정
- Client Hello: 클라이언트가 서버에 {TLS 버전, 클라이언트에서 생성한 난수, 세션 ID, Cipher Suite List} 내용이 담긴 메세지를 전달합니다.
- Server Hello: 서버는 Client Hello에 응답해 Server Hello를 보낸다. {서버에서 사용하는 TLS 버전, Client가 보낸 암호화 방식 중에 서버가 사용 가능한 암호화 방식 Selected Suite, Server Random Data, Session ID, SNI}을 함께 보냅니다.
- Server Certificate: 서버는 클라이언트에 인증서를 보냅니다.
- Client Key Exchange: 클라이언트는 서버가 무결한지 검사하고 검증이 잘 되었으면, 이전에 주고 받았던 클라이언트의 난수와 서버의 난수를 조합하여 pre master secret 라는 대칭키를 생성합니다.이 pre master secret(대칭키)를 서버의 공개키로 암호화 한 것을 서버에 보냅니다.
- Key Generation: 클라이언트와 서버가 통신에 사용할 키를 성공적으로 교환했습니다.
- Change Cipher Spec & Finished (Server & Client)
- 교환할 정보를 모두 교환하고 통신할 준비가 되었습니다.
- 이후로 전송되는 모든 메세지는 이 협상한 알고리즘과 키로 암호화해서 보냅니다.
- 종료 패킷을 전송합니다.
요약
TLS는 TCP Connection이 맺어진 이후 통신을 할 때 통신 내용을 함호화 하는데 사용된다. TLS Handshake를 거쳐 암호화 된 세션을 만들게 된다.
TLS Handshake는 클라이언트가 CA의 공개키로 서버가 보내온 증명서를 열어 서버의 공개키를 확하여 인증한 후, 함께 공유할 대칭키를 만들고 서버의 공개키로 다시 암호화 해서 서버에 다시 보내주는 과정이다. 즉, 비대칭 키로 대칭키를 만들어 대칭키로 통신하게 된다.
Cipher Suite의 구조 참고
위에서 Cipher Suite를 언급했는데, Cipher Suite는 다음과 같은 구조를 하고있습니다.
TLS_(1)_(2)_(3)_(4)_(5)
- 키 교환 알고리즘: Server와 Client간 Key를 교환할 방식 / 예: RSA, DH(디피 헬만), ECDH
- 인증 알고리즘: 교환한 인증서를 확인 알고리즘 / 예: RSA, DH-RSA
- 대칭 암호 알고리즘: 실제 데이터를 암호화 하는 알고리즘 / 예: 3DES, AES
- 블록 암호 운용 방식: / 예: CBC, GCM
- 해시 알고리즘: 서로 상대방이 암호화 한 것이 맞는지 확인하는 알고리즘 / 예: SHA256, SHA
구글에 openssl 명령어로 요청을 해보면
openssl s_client -connect google.com:443
다음과 같은 메시지를 받는다.
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
AES 256 비트 GCM 대칭 암호 알고리즘과 SHA-384 해시 알고리즘을 사용한다는 것이다.
많은 도움이 되었습니다, 감사합니다.