인증서의 역할
- 클라이언트가 접속한 서버가 신뢰할 수 있는 서버임을 보장
- SSL 통신에 사용할 공개키를 클라이언트에게 제공
CA
인증서의 역할은 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지를 보장하는 역할
- 이러한 역할을 보장하는 조직 : CA (Certificate Authority) - 상당히 신뢰할 수 있는 기관
사설 인증기관
사적인 서비스를 이용하면 굳이 CA를 통해 비용을 지불하지 않더라도 개인적으로 인증과정을 거칠 수 있다.
SSL 인증서의 내용
- 서비스의 정보 (인증서를 발급한 CA, 서비스의 도메인 등등)
- 서버 측 공개키 (공개키의 내용, 공개키의 암호화 방법)
브라우저는 CA에 대해 알고 있다.
- 브라우저는 인증기관에 대한 정보를 가지고 있다. - 루트 인증기관에 대한 정보를 알고 있다.
- 브라우저가 업데이트될 때마다 해당 정보는 바뀌게 된다.
SSL 인증서가 서비스를 보증하는 방법
- 웹 브라우저가 서버에 접속할 때 서버는 인증서를 제공
- 브라우저는 해당 인증서를 자신이 가지고 있는 CA 리스트에 있는지를 확인
- 해당 리스트에 포함되어 있다면 브라우저가 CA의 공개키를 가지고 있기 때문에 해당 인증서 내용을 복호화한다.
비밀키로 암 호한 정보를 공개키로 복호화할 수 있다는 것은 해당 정보에 대한 출처를 확인하는 역할이다.
(공인된 기관에서 인증된 것을 확인 가능)
SSL 동작방법
클라이언트와 서버의 통신에서 가장 이상적인 방법은 공개키 방식이지만 실제로 사용하지 않는다.
왜냐면 암호화 복호화하는 과정에서 성능 이슈가 존재하기 때문이다.
아래의 내용이 이 글의 전반적이 내용이다.
이를 천천히 살펴보도록 하자!
- 실제 데이터 : 대칭키
- 대칭키의 키 : 공개키
핸드 셰이크 -> 전송 -> 세션정보
HandShake
클라이언트와 서버 간의 통신에서도 인간과 인간 사이의 악수와 같은 행위가 일어난다.
단계별로 살펴보자!
- 1. 클라이언트가 서버에 접속한다. - 이 단계를 ClientHello라고 일컫는다.
- 클라이언트 측에서 생성한 랜덤 데이터 전송
- 클라이언트가 지원하는 암호화 방식들을 전송
- 클라이언트와 서버가 사용하는 암호화 방식이 다를 수 있기 때문에 먼저 협상을 진행
- 이 과정에서 클라이언트 측에서는 자신이 사용하는 암호화 방식을 전송한다.
- 2. 서버는 ClientHello에 대한 응답으로 ServerHello를 하게 된다.
- 서버 측에서 생성한 랜덤 데이터를 클라이언트로 전송
- 클라이언트가 전달한 암호화 방식 중 서버 자신도 사용할 수 있는 암호화 방식을 선택해서 클라이언트로 전달한다.
- 인증서를 전송한다.
- 3. 클라이언트는 서버로부터 전송받은 인증서를 확인한다.
- 해당 인증서가 CA에 의해 발급된 것인지를 확인하기 위해서 클라이언트에 내장된 CA리스트를 확인
- 클라이언트는 CA에 대한 공개키를 이미 가지고 있다.
- 이러한 공개키로 인증서를 복호화해서 CA의 개인키로 암호화된 문서임을 신뢰할 수 있다.
- 인증서 내부에는 서버가 전송한 공개키가 담겨있다. (비밀키는 서버가 가지고 있다.)
- 클라이언트는 서버의 랜덤 데이터와 자신의 랜덤 데이터를 조합하여 pre master secret 키를 생성한다.
- 해당 키는 이전에 받은 공개키를 사용하여 암호화한다.
- 공개키가 유출되더라도 복호화할 수 있는 비밀키는 서버만이 가지고 있으므로 안전하다.
- 해당 키는 이전에 받은 공개키를 사용하여 암호화한다.
- 4. 서버는 클라이언트가 전송한 pre master secret 값을 자신의 비밀키로 복호화한다.
- 이로써 서버와 클라이언트가 모두 pre master secret 값을 공유하게 된다.
- 서버와 클라이언트는 일련의 과정을 거쳐 해당 값을 master secret 값으로 만든다.
- master secret 값은 세션 key를 생성하고 대칭키 방식으로 암호화 한 다음 서로 소통한다.
- 5. 클라이언트와 서버는 핸드 셰이크 단계의 종료를 서로에게 알린다.
세션
실제로 서버와 클라이언트가 데이터를 주고받는 단계
클라이언트와 서버가 통신할 때 이전에 서로 간에 생성해두었던 세션 key 값을 사용하여 대칭키 방식으로 암호화한다.
공개키를 쭈욱 사용하면 될 것을 왜 굳이 대칭키 방식으로 다시 한번 조합을 하는 것일까?
서론에서 언급하였듯이 공개키 방식은 컴퓨팅 파워를 너무 많이 잡아먹기 때문이다. 만약 공개키 방식만을 사용한다면 트래픽이 큰 서버는 비용이 많이 든다는 것을 예상할 수 있다.
정리하자면 공개키는 신뢰할 수 있는 암호화 기법이기 때문에 해당 방식으로 암호화를 진행하고 실제로 데이터를 주고받을 때는 대칭키를 이용해서 데이터를 주고받는 것이다.
References
'CS > Network' 카테고리의 다른 글
(Network) 3way handshaking & 4way handshaking (0) | 2020.05.10 |
---|---|
(Network) TCP vs UDP (0) | 2020.05.10 |
(Network) HTTPS와 SSL 인증서(2) - 공개키 (0) | 2020.04.28 |
(Network) HTTPS와 SSL 인증서(1) - 대칭키 (0) | 2020.04.28 |
(Network) HTTP/1.0 VS HTTP/1.1 (0) | 2020.04.19 |