배경지식
TLS 또는 SSL handshake에는 아래 두 종류 키가 혼합사용된다.
- 대칭키 : 암호화, 복호화 할 때 같은 키를 사용
- 비대칭키 : 암호화, 복호화 용 키가 다름
비대칭키는 아래 두가지 방법으로 사용된다.
- 정보암호화 목적 : 공개키로 암호화, 개인키로 복호화
- 신원확인 목적 : 개인키로 암호화, 공개키로 복호화
SSL or TLS Handshake process
1. Clinet -------------'Hello'------------->> Server
Clinet | 전송내용 | Server |
---|---|---|
client random | client random | |
Clinet가 지원하는 암호화 방식 | ||
SSL 또는 TLS 버전 |
Clinet는 client random이라는 랜덤 데이터를 생성해 서버로 보낸다.
2. Clinet <<-------------'Hello'------------- Server
Clinet | 전송내용 | Server |
---|---|---|
client random | Server's SSL Certificate(서버의 공개키 포함) | client random |
Server가 선택한 암호화 방식 | server random | |
server random |
서버도 server random이라는 랜덤 데이터를 생성해 client로 보낸다.
3. Clinet : SSL or TLS 인증서 확인
- Client가 가지고 있는 CA(Certificate Authority) list 확인. 서버가 보내준 인증서가 해당하는게 있는지 확인.
- Client가 가지고 있는 CA의 공개키(Public key)를 이용해서 서버가 준 인증서를 복호화
- 복호화 성공 : 인증서는 CA의 개인키(Private key)로 암호화 됐기 때문에 가능.
- 즉 해당 인증서를 준 서버는 믿을 수 있다.
잠깐 인증서에 관해..
인증기관은 인증한 서버의 인증서를 기관의 개인키로 암호화한 후 서버에게 준다.
인증서는 서버의 CA의 공개키로 복호화할 수 있다.
CA의 공개키는 누구나 가질 수 있다. 즉, client도 가지고 있다.
누군가 인증서라며 암호화된 내용을 보냈는데, CA가 제공한 '누군가'가 본인이라며 주장한 그 공개키로 복호화가 된다면,
그 암호화된 내용은 CA만 가지고 있는 CA의 개인키로 암호된 된 것이기 때문에, 그 서버가 누군지 확인이 되는것.
맨 위에서 언급한 비대칭키의 두번째 목적(신원확인 목적 : 개인키로 암호화, 공개키로 복호화)에 해당된다.
4. Client : The premaster secret
- premaster secret 생성
- 서버의 공개키(서버가 보낸 인증서에 포함)로 premaster secret를 암호화한다
Client는 premaster secret이라는 이름의 랜덤 데이터를 또 만들어서 암호화한 뒤, 서버로 전송한다.
5. Clinet --------------------------------->> Server
Clinet | 전송내용 | Server |
---|---|---|
client random | (서버 공개키로 암호화된)premaster secret | client random |
server random | server random | |
premaster secret |
6. Server : Server의 공개키로 The premaster secret 복호화
Clinet | Server |
---|---|
client random | client random |
server random | server random |
premaster secret | premaster secret |
7. Clinet & Server
- clinet random, server radom, premaster secret으로 master secret 생성
- master secret을 이용해서 session key 생성
- Client, Server가 각자 생성하지만, master secret와 session key 각 생성결과는 양측이 같아야함.
- 이 session key가 대칭키다. 이걸로 전송하는 측이 데이터를 암호화했다가, 받는측이 복호화한다.
8. Clinet -------------'Hello'------------->> Server
Clinet | 전송내용 | Server |
---|---|---|
session key | (Clinet가 session key로 암호화한)'finished' 메시지 | session key |
핸드세이크가 완료되고 통신을 시작할 준비되었다는 의미의 완료메시지 전송
9. Clinet <<-------------'Hello'------------- Server
Clinet | 전송내용 | Server |
---|---|---|
session key | (Server가 session key로 암호화한)'finished' 메시지 | session key |
서버측에서도 완료메시지 전송
10. Handshake 완료
- Session key를 이용해서 통신을 계속한다.
- 세션이 종료되면 Session key를 폐기
요약
- SSL or TLS Handshake는 대칭키와 비대칭키의 혼합이다.
- 엄밀히 따지면 TLS라고 하는게 맞다. SSL는 옛날 버전이니가 요즘은 안쓴다는 전제하에..
- 비대칭키가 안전하지만 매번 비대칭키로 암호화, 복호화하는데 드는 리소스가 많이 들어서 이런 방법을 쓴다고 한다.
- 위 과정에서 client data(premaster secret)가 비대칭키를 이용하여 server로 전송되었다.
- 위 과정에서 (premaster secret을 이용해 만든)session key가 대칭키로 사용되었다.
0 댓글