비밀값을 만들고 이것을 서버에게 알려줘야 하는데 알려주는 것을 3단계의 client_key_exchange를 통해서 알려주게 된다. 만약에 RSA(공개키)를 이용해서 알려줄 경우에는 PMS를 만들어서 서버의 공개키(RSA)로 암호화 시켜서 보내면 이 값은 서버에 개인키가 없으면 이 값은 복호화 시켜서 볼 수가 없다. 결국 서버만이 볼 수가 있다. 그다음 DH를 쓰는 경우에는 DH파라메타 값을, 그리고 fixed DH의 경우에는 클라이언트의 DH key를 인증서에 넣어서 보내주게 된다. 그리고 클라이언트는 메시지에 MAC을 만들어 붙여서 전송을 하는 것이다.
암호 방식이 합의가 된 후 이걸 사용 해서 키를 설정하기 위한 파라메터 값을 서로 주고 받아야 된다.
서버가 자신의 인증서를 보낸다. 여기에는 자신의 공개키가 들어 가 있다. (몰론 CA가 서명한 공개키 이다)
클라이언트는 이 인증서를 받게되면 서버의 🔑 (공개키)를 갖게되고 서버 인증을 하는 것이다.
그 다음에 어떤 키 설정 방식을 사용하느냐에 따라서 server_key_exchange를 가지고 필요한 정보를 전달하게 된다.[참고 키 교환 방법] ex) Diffie-Hellman방식을 사용한다면 server_key_exchange에 다가 파라메터를 넣어서 전달을 하게 되는거다.
그리고 서버가 클라이언트에 인증 혹은 다른 정보를 위해서 클라이언트에 certificate_request를 보낸다. (이거는 optional)
모든게 제대로 되면 server_hello_done해서 단계 2의 과정이 끝난다.
여기 단계2 과정이 제대로 이루어지게 되면은 클라이언트와 서버는 서로 키를 설정할 수 있는 모든 정보를 다 갖추게 된다.
단계 2: 서버 인증과 키 설정
서버가 클라이언트에게 인증서를 보낸다. 그 때 서버의 공개키를 넣어서 보내는데 이 경우에는 키 설정을 RSA, ephemeral DH을 사용할 경우이고, 만약에 fixed DH를 사용 할 경우에는 서버가 보내는 CA(인증기관)가 인증한 DH파라메터를 넣어서 보내게 된다.
서버가 필요한 정보를 server_key_exchange 메세지를 보내는데 anonymous의 경우에는 DH 파라메터값을 그냥 보내는거고 ephemeral DH는 자신의 개인키로 서명을 해서 보내는 것이다. 주의 할 점은 fixed DH는 이미 인증서에 파라메터를 보냈기 때문에 server_key_exchange 메시지에 보낼 필요가 없다.
만약에 클라이언트에 인증서가 필요하면 certificate_request를 하게 된다.
모든것을 다 하면 server_hello_done을 보낸다.
이런 메시지를 보낼 때 메시지의 무결성과 인증을 위해서 hash(client_rand || server_rand || server parameters). 이 세개의 값을 해쉬하고 나온 값을 서버의 개인키로 서명을 해서 주고받는 메시지들에 붙인다. 이것이 MAC이다.*client_rand = 클라이언트의 nonce,server_rand = 서버의 nonce ( 이 두 개는 단계 1에서 이미 서로 hello 메시지를 주고 받으며 handshake를 하면서 갖고있는 값이다.)
여기서 말하는 세션은 TLS세션을 말하는 것이다. 이 세션은 처음에 hanshake를 하면서 클라이언트 서버 간에 인증을 하고 키를 설정한다. 설정한 키는 이 세션에서 유효한 것이다. 만약 이 키가 끝나면 다시 handshake 과정을 거쳐 키도 새로 만들고 인증도 새로 해야하는 것이다. 그래서 이 통신하는 단위를 세션이라고 한다. 이 TLS 세션을 단계 1에서 “hello 메시지를 교환하면서 설정 과정이 이루어지게 되고 그때 보안 리스트(암호화 알고리즘)를 결정하게 된다.
client_hello_message와 server_hello_message의 구성
버전: client_hello_message와 server_hello_message를 보낸다고 했는데 이것들은 버전이 있다. 가장 높은 SSL 버전이고 TLS인 경우는 1.2 버전이다.
랜덤(Random) : 이 랜덤값은 ‘nonce’ 이다. 이 값은 랜덤값을 사용할 수 있고 타임스탬프(time stamp)를 사용할 수있다.
세션ID: 메시지들을 주고 받을 때 메시지들이 어떤 세션에 속하는지는 여기 ID값으로 구분이 된다. 그래서 이 ID에 합의된 key값들이 정해져 있는 것이다.(ID가 다르면 사용하는 key가 달라진다.)
암호 방식 리스트 or 암호 알고리즘 리스트(Cipher Suite) : 먼저 client_hello_message로 클라이언트가 자기가 사용할 수 있는 암호 알고리즘을 서버한테 알려주는데, 자기가 사용하고 싶은 것 부터 순서대로 알려준다. 그러면 server_hello_message로 서버는 그 중에서 가장 적합한 것을 선택해서 그 알고리즘으로 통신 하는데 앞으로 통신하는데 사용 하는 것이다.
(Diffe-Hellman 방법) 클라이언트가 서버에 접속을 하고싶다고 서버에 말을 하면, 서버가 “내가 진짜 서버다” 라고 인증을 하는데 그 과정에서 공인인증서를 사용자에게 준다. 그러면 서버가 자신의 비밀값을 만든다. 그래서 Diffie-Hellman 파라메터를 클라이언트에게 전달하고, 클라이언트도 자신의 비밀값을 만든다. 그리고 클라이언트도 Diffie-Hellman 파라메터를 서버에게 전달한다. 그래서 클라이언트와 서버는 각자 받은 값(Diffie-Hellman 파라메터)과 각자의 비밀값을 가지고 계산을 하면은 둘만이 공유하는 비밀값이 되겠고, 계산해서 나온 값을 이용해서 세션키 혹은 다른 키를 이용해서 사용한다.