친구들과 어제 내가 알게된 SSL과 TLS에 대한 내용을 공유하고자 이야기를 하던 도중, 내가 생각한 것과 약간 다른 점도 있고 더 보충되어야 할 내용이 있다는 것도 알게되었다. 이전까지는 난 https는 http에 secure socket을 더하여 서버와 클라이언트 사이의 모든 통신 내용을 암호화하는 것이고, 암호화하는 방법에 쓰이는 SSL과 TLS방식이 단순히 전달하는 데이터에 대한 암호화를 위한 것이라고만 생각했다.
SSL 인증서?
쉽게 말하면, 사용자가 방문하는 사이트가 믿을 만한 사이트인가? 라는 것을 증명해주는 '정품 인증' 같은 것이다.
CA는 서버 운영 기업이 넘겨준 공개키를 인증서 발급자, CA의 이름 등과 함께 묶어서 CA가 가지고 있는 개인키로 암호화해서 SSL인증서로 발급한다.
덕분에 열띤 토론을 했다. 우선 결론적으로 'SSL, TLS 암호화는 공유키와 공개키 방식을 둘다 사용한다!'
전자 인증서에는 CA,서버에 대한 정보, 공개키, 전자서명을 가지고 있다.
1) 클라이언트가 서버에 연결 요청을 한다
2) 서버가 클라이언트에게 자신을 증명할 수 있고, 서로의 데이터를 암호화할 수 있는 전자인증서를 보낸다.
-> 몇가지 방법이 있긴 하지만 비밀키는 CA에서 주는 것으로 한다.
-> 즉, 서버가 전자인증서를 클라이언트에 보냄으로써 클라이언트와 서버가 동시에 공개키를 가지고 있게 된다.
2) 클라이언트에서 난수를 생성하고 공개키를 사용하여 난수를 암호화한다. 이 암호화된 내용이 공유키다.
3) 공유키를 서버를 보낸다. 그 다음 통신부터는 공유키로 암호화된 데이터만 주고받는다.
공유키가 없는 처음 한번만 공유키를 서버에 줄때 그 한번에 해당 공유키를 탈취당할 경우말고는 그 이후의 통신부터는 데이터만 주고받기 때문에 보안성을 어느정도 지키면서도 공유키의 장점인 빠른 속도로 통신한다는 장점으로 해당 방법을 사용했다. 공유키를 만들기 위해 공개키와 난수의 계산은 리소스가 크기 때문에 처음 통신 한번일때만 실행한다.
여기서 공유키는 대칭키이고, 공개키는 비대칭키라고 한다.