SSL Handshake
SSL(TLS라고도 함)은 암호화 기반의 통신 프로토콜로 HTTPS는 HTTP + SSL이 결합된 개념이다.
주요 특징은 다음과 같다.
- SSL 인증서를 통해 클라이언트와 서버 간의 통신을 보증한다.
- 암호화된 데이터를 주고 받는다. 주로 대칭키(공개키) 방식, 비대칭키(비밀키) 암호화 방식이 사용된다.
- SSL 통신 과정은 handshake라는 과정을 거친다.
handshake #
브라우저에 https:// ... 이 접속한 이후의 과정이라고 생각하면 된다.
- 클라이언트 -> 서버
클라이언트는 랜덤한 데이터를 만들어서 서버에 보낸다.
추가로 클라이언트에서 사용 가능한 암호화 방식들도 서버에 같이 보낸다.
- 서버 -> 클라이언트
서버 또한 랜덤한 데이터를 만들어서 클라이언트에게 보낸다.
클라이언트가 보낸 암호화 방식들 중 사용할 방식을 선정(협상)하여 클라이언트에게 보낸다.
추가로 SSL 인증서도 함께 보낸다.
SSL 인증서에는 공개키, 인증서 발급자(CA), 도메인등등의 정보가 담겨있다.
- 클라이언트 -> CA
클라이언트는 서버로부터 받은 인증서를 CA를 통해서 확인한다.
이 작업은 이 서버가 믿을만한 서버인가를 확인하는 과정이다.
공인된 CA(브라우저에 저장된 CA리스트)에서 발급받은 인증서라면 인증서의 공개키로 복호화가 가능하다.
그 이유는 제대로된 인증서라면 공인CA의 비밀키로 암호화 되어있기 때문이다. (비대칭키 암호화)
즉, 복호화괴 된다면 이 인증서가 믿을만하다는 것이 보증되는 것이다.
+그러면 브라우저에도 안전하게 연결됐다는 표시가 뜬다.
그러나 공인된 CA가 아닌 사설 CA에서 발급받은 인증서라면? 사설 CA는 브라우저에 저장된 CA 리스트에 없을 것이며 믿을만한 인증서가 아니라고 판단된다. 그래서 https 경고 표시가 뜨게 된다.
공인CA 인증서
- 유로
- 많은 사람들에게 오픈되는 사이트일 때 사용
- 브라우저에 안전함 표시가 뜬다.
사설CA 인증서
- 무료 keytool, openssl등을 사용해 발급
- 브라우저에 안전하지 않음 표시가 뜬다.
- 공인 인증서에 금지된 정보를 포함할 수 있다.
자체서명 인증서
- CA없이 발급된 인증서
- 인증서 자체가 CA역할을 함
- 보안은 약하지만 사용이 쉽다.
- 클라이언트 1, 2에서 생성된 랜덤 데이터를 조합하여 임시 key를 만든다 (pre master key)
그리고 임시키를 인증서의 공개키로 암호화한다. (master key)
- 클라이언트 -> 서버
암호화한 임시 key를 서버에게 전송한다 그러면 이 암호화된 키를 클라이언트와 서버 둘 다 가지고있다.
- 서버 임시 key는 서버에 저장된 비밀키로 복호화할 수 있다. 왜냐하면 인증서의 공개키로 암호화되어있기 때문에 비대칭키 암호화 방식이라 복호화가 가능하다.
서버와 클라이언트는 이제 이 임시 key들을 공유하게 되었고 이후, 서버와 클라이언트에서 일련의 과정을 거친 후 최종 key를 만든다 (session key)
이 후 session key를 통해서 암호화된 데이터를 주고 받는다 (대칭키 암호화 방식)
왜 공개키, 대칭키 방식을 함께 사용할까? #
바로 공개키 방식은 보안이 안전하지만 많은 컴퓨팅 자원이 소모되기 때문이다.
그래서 비교적 가벼운 대칭키와 혼합해서 사용한다.
그렇기에 보통 처음 커넥션을 맺을때 공개키 방식을 사용하고 그 이후 데이터를 전송할 때 대칭키 방식을 사용하여 데이터를 교환하는 것이다.