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 예제 패킷은 다음 사이트에서 확인 해 볼 수 있다.
'IT 생활 > TLS & Mbedtls' 카테고리의 다른 글
openssl로 ssl/tls 통신 절차 확인하기 (6) | 2018.11.22 |
---|