network - tls or ssl handshake process

배경지식

TLS 또는 SSL handshake에는 아래 두 종류 키가 혼합사용된다.

  • 대칭키 : 암호화, 복호화 할 때 같은 키를 사용
  • 비대칭키 : 암호화, 복호화 용 키가 다름

비대칭키는 아래 두가지 방법으로 사용된다.

  • 정보암호화 목적 : 공개키로 암호화, 개인키로 복호화
  • 신원확인 목적 : 개인키로 암호화, 공개키로 복호화

SSL or TLS Handshake process

1. Clinet -------------'Hello'------------->> Server

Clinet 전송내용 Server
client random client random
Clinet가 지원하는 암호화 방식
SSL 또는 TLS 버전

Clinet는 client random이라는 랜덤 데이터를 생성해 서버로 보낸다.

2. Clinet <<-------------'Hello'------------- Server

Clinet 전송내용 Server
client random Server's SSL Certificate(서버의 공개키 포함) client random
Server가 선택한 암호화 방식 server random
server random

서버도 server random이라는 랜덤 데이터를 생성해 client로 보낸다.

3. Clinet : SSL or TLS 인증서 확인

  1. Client가 가지고 있는 CA(Certificate Authority) list 확인. 서버가 보내준 인증서가 해당하는게 있는지 확인.
  2. Client가 가지고 있는 CA의 공개키(Public key)를 이용해서 서버가 준 인증서를 복호화
  3. 복호화 성공 : 인증서는 CA의 개인키(Private key)로 암호화 됐기 때문에 가능.
  4. 즉 해당 인증서를 준 서버는 믿을 수 있다.

잠깐 인증서에 관해..

인증기관은 인증한 서버의 인증서를 기관의 개인키로 암호화한 후 서버에게 준다.
인증서는 서버의 CA의 공개키로 복호화할 수 있다.
CA의 공개키는 누구나 가질 수 있다. 즉, client도 가지고 있다.
누군가 인증서라며 암호화된 내용을 보냈는데, CA가 제공한 '누군가'가 본인이라며 주장한 그 공개키로 복호화가 된다면,
그 암호화된 내용은 CA만 가지고 있는 CA의 개인키로 암호된 된 것이기 때문에, 그 서버가 누군지 확인이 되는것.
맨 위에서 언급한 비대칭키의 두번째 목적(신원확인 목적 : 개인키로 암호화, 공개키로 복호화)에 해당된다.

4. Client : The premaster secret

  • premaster secret 생성
  • 서버의 공개키(서버가 보낸 인증서에 포함)로 premaster secret를 암호화한다

Client는 premaster secret이라는 이름의 랜덤 데이터를 또 만들어서 암호화한 뒤, 서버로 전송한다.

5. Clinet --------------------------------->> Server

Clinet 전송내용 Server
client random (서버 공개키로 암호화된)premaster secret client random
server random server random
premaster secret

6. Server : Server의 공개키로 The premaster secret 복호화

Clinet Server
client random client random
server random server random
premaster secret premaster secret

7. Clinet & Server

  1. clinet random, server radom, premaster secret으로 master secret 생성
  2. master secret을 이용해서 session key 생성
  3. Client, Server가 각자 생성하지만, master secret와 session key 각 생성결과는 양측이 같아야함.
  4. 이 session key가 대칭키다. 이걸로 전송하는 측이 데이터를 암호화했다가, 받는측이 복호화한다.

8. Clinet -------------'Hello'------------->> Server

Clinet 전송내용 Server
session key (Clinet가 session key로 암호화한)'finished' 메시지 session key

핸드세이크가 완료되고 통신을 시작할 준비되었다는 의미의 완료메시지 전송

9. Clinet <<-------------'Hello'------------- Server

Clinet 전송내용 Server
session key (Server가 session key로 암호화한)'finished' 메시지 session key

서버측에서도 완료메시지 전송

10. Handshake 완료

  • Session key를 이용해서 통신을 계속한다.
  • 세션이 종료되면 Session key를 폐기


요약

  • SSL or TLS Handshake는 대칭키와 비대칭키의 혼합이다.
  • 엄밀히 따지면 TLS라고 하는게 맞다. SSL는 옛날 버전이니가 요즘은 안쓴다는 전제하에..
  • 비대칭키가 안전하지만 매번 비대칭키로 암호화, 복호화하는데 드는 리소스가 많이 들어서 이런 방법을 쓴다고 한다.
  • 위 과정에서 client data(premaster secret)가 비대칭키를 이용하여 server로 전송되었다.
  • 위 과정에서 (premaster secret을 이용해 만든)session key가 대칭키로 사용되었다.


참고

https://www.acunetix.com/blog/articles/establishing-tls-ssl-connection-part-5/ https://www.cloudflare.com/ko-kr/learning/ssl/what-happens-in-a-tls-handshake/ https://youtu.be/8R0FUF_t_zk

댓글 쓰기

0 댓글