TLS 통신에서 가장 중요하고 복잡한 단계는 Handshake 단계라고 할 수 있다. 

이 과정에서 상호 인증 및 통신에 사용할 알고리즘과 공유키를 결정 하기 때문이다. 


각 과정은 다음의 순서로 진행된다. 


1. Client Hello 

  • 클라이언트가 서버에 Client Hello메시지를 전송한다. 
  • 메시지는 버전, Nonce,  세션 ID, Cipher Suites, Compression Methods 등의 정보를 포함한다. 

2. Server Hello 

  • Client Hello메시지를 받은 서버도 클라이언트에 Server Hello메시지를 전송한다. 
  • 포함된 정보는 Client Hello와 동일하다. 

3. Certificate 

  • 서버는 자신의 certificate를 클라이언트에게 전송한다. 
  • 필요에 따라 CA의 certificate를 함께 전송하기도 한다. 
  • 클라이언트는 서버의 인증서가 유효한지 검사한다. 
  • 필요에 따라 서버 인증서의 CN을 검사할 수도 있다. 

4. Server Key Exchange

  • 서버는 ECDHE 키 쌍을 만들어서 클라이언트에게 public키를 전송한다. 
  • 이 키는 클라이언트의 public키를 이용해서 ECDHE shared secret를 만들기 위해 사용된다. 

5. Certificate Request

  • 서버는 클라이언트의 certificate를 요청하는 메시지를 전송한다. 
  • 서버가 지원하는 certificate type 목록을 보낸다. (RSA, ECDSA, etc)

6. Server Hello Done

  • 서버가 자신의 Hand shake 절차가 완료 되었음을 알리는 메시지를 전송한다. 

7. Certificate

  • 서버의 Certificate Request를 받은 클라이언트가 자신의 certificate를 서버에게 전송한다. 
  • 클라이언트도 필요에 따라 CA의 certificate를 함께 전송하기도 한다. 
  • 서버는 클라이언트의 인증서가 유효한지 검사한다. 

8. Client Key Exchange

  • 서버와 마찬가지로 ECDHE키 쌍을 만들어서 서버에게 public 키를 전송한다. 

8.1 Encryption Keys Calculation

  • 서버와 클라이언트는 상대방으로부터 받은 public 키를 이용해서 PreMasterSecret라고 부르는 ECDHE shared secret를 생성한다. 
  • PreMasterSecret을 키로 쌍방의 Nonce값을 HMAC 연산한 결과를 이용해서 MasterSecret를 생성한다. 
  • MasterSecret 값을 가지고 다음 용도로 사용한다. 
    • 클라이언트/서버의 MAC 키
    • 클라이언트/서버의 대칭 암호 키
    • 클라이언트/서버의 CBC 암호화 용 IV(Initial Vector)값 

9. Certificate Verify

  • 클라이언트는 Handshake 한 모든 메시지의 서명된 Hash값을 전송한다. 
  • 서버도 동일한 값을 계산하여 클라이언트가 보낸 Hash값과 같은지 비교하게 된다. 

10. Change Cipher Spec

  • 클라이언트가 성공적으로 공유키를 생성했으며, 이후 메시지는 암호화 하여 전송할 것을 알리는 메시지는 전송한다. 

11. Finished(Encrypted Handshake Message)

  • 클라이언트는 서버에게 Handshake가 성공적으로 완료 되었음을 알린다. 
  • Handshake 메시지에 대한 hash를 암호화 해서 전송한다. 

12. Change Cipher Spec

  • 서버도 공유키 생성이 성공 했음을 알린다. 

13. Finished(Encrypted Handshake Message)

  • 서버도 Handshake가 성공적으로 완료 되었음을 알린다. 

14. 애플리케이션 데이터 

  • 서로 상대방에게 전송할 데이터를 암호화 해서 전송한다. 


TLS Handshake 예제 패킷은 다음 사이트에서 확인 해 볼 수 있다. 

https://tls.ulfheim.net/

Posted by KT한 KT한

댓글을 달아 주세요