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/

'IT 생활 > TLS & Mbedtls' 카테고리의 다른 글

openssl로 ssl/tls 통신 절차 확인하기  (5) 2018.11.22
Posted by KT한
,

SSL/TLS 통신이 동작하는 원리를 이해하기 위해 opensssl로 간단하게 서버-클라이언트 통신을 확인 해 보자.


먼저 서버와 클라이언트간 상호 인증을 위해 사용할 인증서 및 키를 준비해 줘야 한다. 

별도로 만드는게 귀찮아서 Mbedtls에서 제공하는 인증서 및 키 파일들을 가져와 사용하였다. 

mbedtls 코드를 git에서 받아서 보면 tests/data_files 폴더에 여러 종류의 인증서 및 키 파일들이 존재한다. 


서버는 다음과 같은 형식으로 실행해 준다.  

옵션으로 서버의 인증서 및 키 그리고 CA의 인증서 파일을 지정해 준다.

'Verify'옵션은 상호 인증을 위해 지정해 주며 인증서 체인의 depth를 숫자로 주면 된다.

예를 들어 서버 인증서를 CA가 직접 발급해 줬다면 depth는 1로 하면 된다. 


클라이언트는 다음과 같은 형식으로 실행해 준다. 


옵션은 서버와 동일하다. 


정상적으로 TLS 연결에 성공하였다면 터미널에서 입력한 메시지가 상대방 터미널에 표시된다. 

아래 접혀져 있는 로그를 펼쳐서 확인해 보면 맨 하단에 클라이언트가 전송한 'Hello' 메시지를 서버쪽 로그에서 확인 할 수 있다. 


TLS 서버 로그 


TLS 클라이언트 로그 




'IT 생활 > TLS & Mbedtls' 카테고리의 다른 글

TLS 핸드쉐이크 (Handshake) 프로토콜 분석  (0) 2018.11.23
Posted by KT한
,