SSL Handshake

- client, server간의 syn/syn-ack/ack 가 끝난 후에 SSL Handshake가 시작된다.
- ClientHello: client는 client hello 와 함께 프로토콜, 사용 가능한 암호화 알고리즘 방식, 키 등의 목록을 chiper suites에 담아 서버로 전송한다.
- ServerHello: server는 client hello 와 함께 전송된 cipher suits중 하나를 선택해 client에 알리고 싱크를 맞춘다. 필요에 따라 클라이언트에 인증서를 요청하기도 한다.
- client에서 인증서를 검증하고, 사용할 chiper suits를 확인한다. 또한 서버로 전송할 비밀키를 만들어 서버로 전송할 준비를 한다. 이 때 검증 결과는 hash로 만들어지며 이 값으로 SSL/TLS session을 검증할 때 사용한다. 혹시 client나 server의 정보 일부가 변경되면 hash값도 달라지게 되고, 암호화 통신에 문제가 생기니 SSL/TLS session은 끊어진다.
- client에서 준비된 인증서를 서버로 전송한다.
- 필요에 따라 서버로 클라이언트의 인증서를 전송하며, 이 인증서가 필수로 요구되는 경우에는 이 인증서에 대한 검증을 거치며, 검증이 실패하는 경우에는 SSL Handshake가 실패한다. 이 시점에는 이미 client와 server가 암호화를 위한 키를 교환하였기 때문에 이 때부터 전송되는 데이터는 암호회되어 있다.
- 서버는 클라이언트의 인증서를 검증한다.
- client는 server로 finished 를 보내어 SSL handshake가 끝났음을 알린다.
- server는 client로 finished 를 보내어 SSL handshake가 끝났음을 알린다. 이로서 client와 server간의 SSL/TLS session이 맺어지게 된다.
- 이제부터 server와 client는 SSL/TLS session 내에서 암호화된 데이터를 교환한다. SSL/TLS session 내의 데이터는 암호화되어 있어, packet snippet과 같은 작업을 하여도 실제 데이터를 볼 수 없는 상태가 된다.
Reference & References