SSL(Secure Socket Layer)은 netscape사의 웹 브라우저 보안 프로토콜로 3.0 버전을 표준화한 것이 TLS라고 합니다. 통상적으로 SSL과 TLS는 같은 의미로 사용됩니다.
SSL 인증서는 종종 디지털 인증서로 불리며, 브라우저(사용자의 컴퓨터)와 서버(웹사이트) 사이의 암호화된 연결을 수립하는 데 사용됩니다.
이전 포스팅에서 다룬 대칭키의 문제점을 해결하기 위해 나온 '비대칭키' 기억하시나요? 참고
우리는 처음 대칭키를 교환할 때만 비대칭키 암호를 사용하고 싶었습니다. 그리고 TLS((Transport Layer Security))가 그 역할을 수행하게 됩니다
TLS에서 제공하는 보안 서비스로는
기밀성
대칭키 암호를 사용하게 되면 남들이 데이터를 훔쳐가도 볼 수 없는 비밀을 제공함
무결성
메시지 인증 코드(MAC: Message Authentication Code)를 통해서 메시지 인증을 제공하며, 위, 변조 여부를 확인할 수 있음
인증
연결 초기 설정에서 주고 받는 인증서를 통해서 신뢰할 수 있는 개체인지 인증할 수 있음
이 그림에서 파란색 칸과 노란색 칸은 네트워크 상에서 전달되는 IP Poket을 표현한 것이며, 맨 윗줄의 SYN, SYN ACK, ACK는 TCP layer 3-way handshake로 HTTPS가 TCP 기반의 프로토콜이기 때문에 암호화된 협상에 앞서 연결을 생성하기 위해 실시하는 과정이고, 아래 노란색 상장의 패킷들이 TLS/SSH Handshake입니다.
1. Client Hello
Client가 Server에 연결을 시도하며 전송하는 패킷입니다. 자신이 사용가능한 Cipher Suite목록, Session ID, SSL Protocol Version, Random byte 등을 전달합니다.
Cipher Suite는 SSL Protocol version, 인증서 검정, 데이터 암호화 프로토콜, Hash 방식 등의 정보를 담고있는 존재로 선택된 Cipher Suite의 알고리즘에 따라 데이터를 암호화하게 됩니다.
2. Server Hello
Cilent가 보내온 CilentHello Packet을 받아 Cipher Suite중 하나를 선택한 다음 Client에게 이를 알립니다. 또한 자신의 SSL Protocol Version 등도 같이 보내게 됩니다.
3. Certifiate
Server가 자신의 SSL 인증서를 Client에게 전달합니다. 인증서 내부에는 Server가 발행한 공개키(개인키는 Server 소유)가 들어있으며, Client는 Server가 보낸 CA의 개인기로 암호화된 SSL 인증서를 이미 모두에게 공개된 CA의 공개키를 사용하여 복호화합니다. 복호화에 성공하면 이 인증서는 CA가 서명한 것이 만즌지 아닌지를 확인하는 인증서 검증 작업을 진행합니다.
또한 CLient는 데이터 암호화에 사용할 대팅키를 생성한 후 SSL인증서 내무에 들어있던 공개키를 이용해 암호화하여 Server에게 전송합니다.
이때 SSL 인증서가 어떤 알고리즘으로 암호화 되었는지, 무슨 Hash 알고리즘으로 서명되었는지 확인이 가능합니다.
4. Client Key Exchange
대칭키를 Client가 생성하여 SSL 인증서 내부에서 추출한 Server의 공개키를 이용해 암호화 한 수 Server에게 전달합니다. 이때 전달된 대칭키가 SSL Handshake의 목적이자 가장 중요한 수단인 데이터를 실제로 암호화 할 대칭키 입니다. 그리고 이 키를 통햏 Client와 Server가 교환하고자 하는 데이터를 암호화합니다.
5. ChangeCipherSpec / Finished
Client, Server 모두가 서로에게 보내는 Pacet으로 교환할 정보를 모두 교환한 뒤 통신할 준비가 다 되었음을 알리는 패킷입니다. 마지막르고 'Finished' Poket을 보내어 SSL Handshake를 종료하게 됩니다.
Cipher Suite를 잘 몰라서 이해하기 힘들었던 부분이 있었던 것 같다.
다음에는 Cipher Suite를 조금 더 공부해 보는 시간을 가져야겠다고 생각했다 :)