어썸오
TCP는 기본적으로 보안 기능을 제공하지 않습니다. 따라서 안전한 통신을 위해서는 애플리케이션 계층에서 TCP 소켓에 데이터를 쓰기 전에 이를 암호화하는 과정을 거치는데, 이 과정을 거치는 레이어를 Secure Socket Layer, SSL 이라고 부릅니다.
SSL은 TCP 위에서 동작하는 프로토콜이기 때문에 우선 TCP handshake를 통해 TCP 연결을 먼저 맺습니다.
그러고나서 클라이언트는 서버와 SSL 통신을 하기 위해 Client Hello를 합니다. 이때 클라이언트 측에서 생성한 랜덤 데이터, 클라이언트가 지원하는 암호화 방식 등에 대한 데이터를 전달합니다.
서버는 Client Hello에 대한 응답으로 Server Hello를 하게 됩니다. 이때 서버 측에서 생성한 랜덤 데이터, 서버가 선택한 클라이언트의 암호화 방식, 그리고 서버의 인증서를 전달합니다.
클라이언트는 서버로부터 전달받은 인증서를, 클라이언트에 내장된 CA의 공개키를 이용해 복호화합니다. 인증서 내에는 인증 기관에서 인증한 서버의 공개키가 담겨있습니다.
클라이언트는 서버의 랜덤 데이터와 클라이언트의 랜덤 데이터를 조합해 pre master secret을 생성하고 이를 서버의 공개키로 암호화해 서버에 전달합니다.
서버는 개인키로 pre master secret을 복호화하고, 서버와 클라이언트는 일련의 과정을 거쳐 pre master secret을 통해 master secret을 만듭니다. 그리고 이 master secret을 대칭키로 사용하여 서로간의 데이터를 암호화하여 주고받습니다.
CA를 통해 키를 발급하지는 않습니다. 서버는 자신의 공개키를 CA로 전달하고 CA는 자신의 비밀키로 인증서를 암호화합니다. 인증서에는 서버의 공개키가 담겨있습니다.
CA가 필요한 이유는 클라이언트 쪽에서 내가 SSL 통신을 할 대상과 그 공개키가 일치함을 보장하기 위해서입니다. 만약 CA가 없다면 제 3자가 공개키가 전달되는 과정에서 이를 자신의 공개키로 바꿔치기해도 알 수가 없습니다.
만약 클라이언트에 전달받은 인증서를 발급한 CA가 없다면, 인터넷을 통해 해당 CA의 공개키를 발급받는 과정을 거칩니다.
SSH는 Secure SHell의 약자로 SSL과 동작과정 및 사용 목적이 다릅니다. SSL은 외부에 있는 컴퓨터와 주고받는 데이터를 암호화하기 위한 목적으로 사용하는 것이고, SSH는 데이터 통신 및 명령 전달(원격 접속)을 위해 사용됩니다.
SSH에서 인증 책임을 가지는 쪽은 클라이언트입니다. 클라이언트가 password 혹은 certificate key로 자신을 인증해야합니다. 반면 SSL에서는 서버가 인증 책임을 갖습니다.
같은 키 교환 알고리즘을 쓰기 때문에 헷갈릴 수 있지만 SSH와 SSL은 서로 관련이 없는 프로토콜입니다.
보안과 효율을 위해서입니다. master secret과 session key는 그 사용 목적과 유효기간이 다릅니다. master key를 통해 session key를 생성하는데, 이 master secert은 session key 외에도 메시지 유효성 검사 등을 위한 다른 key들을 생성하는데 사용됩니다.
그리고 session key는 한 세션에서 사용되고 폐기되는 반면 master secret은 다른 세션에서도 재사용될 수 있습니다.
https://docs.oracle.com/cd/E19575-01/820-2765/6nebir7f3/index.html https://opentutorials.org/course/228/4894 https://www.whatswhyhow.com/what-is-difference-between-session-key-and-master-key/