SSL(Secure Sockets Layer)
은 보안 프로토콜로서, 개인정보 보호, 인증, 무결성 을 인터넷 통신에 제공한다.SSL
이란 명칭은TLS(Transport Layer Security)
로 발전했다.SSL/TLS
를 사용하는 웹사이트의URL
에는"HTTP"대신 "HTTPS" 가 있다.
SSL
이 발전되어 TLS
이라는 용어로 변경되었지만 SSL
의 인지도가 크기 때문에 현재까지 TLS
도 SSL
로 부르며 사용한다고 한다. 소유권 변경을 위해 TLS
라는 이름으로 변경 되었을 뿐 SSL
의 최종 버전(3.0) 과 TLS
첫 버전의 차이는 크지 않다.
이 글에서 SSL/TLS
의 용어 선택은 TLS
로 하겠다
TLS
은 HTTPS 의 보안을 위한 프로토콜이다. 확실한 것은 TLS
은 Transport 와 Application 사이에서 동작한다는 것이다. 하지만 이 부분에 대해서는 말이 많다. "Presentation 이 Encryption 을 맡고있기에 Presentaion Layer 에 속한다.", "아니다, Session 영역에 속한다. OSI model
은 그저 Guide line 일 뿐 엄청 과학적인 분야는 아니다.", "OSI model
의 어느 계층에서 속하는 것이 아니라 독립적인 것이다." 이 외에도 여러가지 말이 있다.
위에도 언급 했지만 어쨌든 TLS
은 Transport 와 Application 사이에서 동작한다.
Handshake
란Client
와Server
간의 대화를 뜻한다. 연결적 요소 인 셈이다.TCP
에서Server
와 연결할 때의3-way handshake
, 해제할 때의4-way handshake
가 있다.그 위 계층에서는
Server
의 SSL 인증서, 공개키,Client
의 비밀키 를 교환하는TLS Handshake
가 있다.TLS Handshake
는 암호화를 하는 일련의 과정.
Transport Layer
에 있는 프로토콜인TCP
는 신뢰성 기반이라UDP
와는 다르게 연결지향(Connection-Oriented) 프로토콜이다.TCP
의 데이터 전송 단위는 패킷 이다.
TCP
는Client
와Server
사이에서3-way handshake
방식으로 연결하며4-way handshake
방식으로 해제를 한다.
3-wayhandshake 방식
Client : 서버야 우리 통신 하자 (통신요청)
SYN
Server : 그래, 요청 잘 받았어ACK
Server : 준비는 됐어? 통신하자SYN
Client : 그래 너도 통신하자고 한 요청 잘 받았어ACK
4-way handshake 방식
Client : 서버야 이제 통신 끝내자
FIN
Server : 그래 니가 통신 끝내자는 요청 잘 받았어ACK
Server : (어디 뭐 더 보낼 메시지가 있나 확인좀 해보고..)Close_Wait
Server : 그래 끝내자FIN
Client : 그래 너도 끝내자고 응답한 것 잘 받았어ACK
SYN
: Synchronize sequence Numbers 의 약자. 연결 요청 플래그
ACK
: Acknowledgment 의 약자. 응답 플래그
FIN
: 연결종료 플래그
Client : 안녕하세요 ! 안전한 통신을 구축하고 싶습니다. 여기 제 TLS 버전 과 제가 알고있는 여러가지 암호알고리즘 이 있습니다.
ClientHello
Server : 네 안녕하세요. 귀하의 암호 알고리즘들과 TLS 버전 을 확인했습니다. 음...귀하가 갖고있는 알고리즘에서 이 알고리즘을 사용하는 것이 좋을 것 같군요 ( Client 가 제시한 알고리즘 중 하나 선택 )
ServerHello
Server : 여기 제가 갖고있는 SSL 인증서 에 제 공개키 를 써서 드리겠습니다.Certificate
Server : ( SSL 인증서에 자신의 공개키가 없을 때 ) 아차 ! 제 공개 키를 깜빡했군요. 여기 제 공개 키 입니다 ( Server 가 Client 에게 직접 공개키 전달 / 만약 SSL 인증서에 자신의 공개 키가 들어있다면 이 구간은 생략한다 )ServerHello Done (Server Key Exchange)
Client : 여기 내가 갖고있던 CA(인증기관)공개 키 로 Server 가 보내준 SSL 인증서 를 열어봐야겠다( CA 의 공개키로 복호화 가 성공했다면 이 SSL 인증서 는 CA 가 서명한 것이 맞는 셈이다 ). 이제 저와 당신만의 비밀 키 ( 공유 비밀 키 ) 를 생성하고, 이 비밀 키 를 당신이 준 공개키로 암호화 해서 보낼게요
ClientKeyExchange
이제 Server 는 자신의 비밀 키 로 Client 가 보내준 공유 비밀 키를 복호화해서 열어본다. 그 후 Client, Server 서로가 교환할 정보를 모두 교환한 뒤 통신할 준비가 다 되었음을 알리는
ChangeCipherSpec
패킷을 보낸 뒤Finished
패킷을 보내며 TLS Handshake 를 종료합니다
CA(Certificate Authority)
: 디지털 인증서를 저장, 서명 및 발급하는 인증기관Cipher Suite
: 암호화의 집합, 위 ClientHello
단계에서 서버에게 자신이 가진 암호화 알고리즘을 알리는 것. 그 암호화 알고리즘이 이 Cipher Suite
이다.아래 사진은 Client 와 Server 간 TCP 를 거쳐 TLS 까지 Handshake 하는 과정이다.
파란색 부분 은 TCP
의 3-way handshake
주황색 부분 은 TLS-handshake
가 그려져 있다.
3-way Handshake와 TLS Handshake ( 참고 : cloudflare )