프로그래밍 노트
  • SSL/TLS란?
    2024년 12월 02일 14시 37분 33초에 업로드 된 글입니다.
    작성자: Jeyeon

    SSL(Secure Sockets Layer)와 TLS(Transport Layer Security)는 다른 프로토콜이다. 메시지 인증 방식과 Cipher Suite의 차이가 있지만, TLS가 SSL에 기반하여 보안 취약점을 해결한 프로토콜이고, 현재는 SSL을 완전 대체하여 SSL은 더 이상 사용되지 않아 사람들은 거의 동의어처럼 사용한다.

     

    우선 TLS는 보안 연결을 위해 사용하는 프로토콜인데 TLS를 말하기에 앞서 TCP 3-Way Handshake, 대칭키 암호화, 비대칭키 암호화 이 3가지를 먼저 짚고 넘어가고자 한다.


    TCP

    TLS는 TCP 위에서 작동하는 보안 프로토콜이기 때문에 TCP의 연결 수립 이후에 TLS 보안 연결 수립이 진행된다.

    우선 TCP는 3-Way handshake로 연결 수립이 되는데 과정은 아래 사진과 같다.

    Node Direction Node
    Client SYN Server
    Client SYN/ACK Server
    Client ACK Server

     

    연결을 시도하는 Client에서 Server로 SYN 신호를 보내 통신하고 싶다는 의사를 보낸다.

    그리고 Server에서 이를 수락하면 SYN/ACK로 수락 의사를 보낸다.

    만약 거절하게 된다면 RST(Reset) 신호로 통신을 종료하게 된다.

    마지막으로 수락 의사를 받은 Client가 수락 의사를 확인했다는 의미로 ACK를 보내면 TCP 연결 수립이 완료된다.

     

    하지만 TCP 3-way handshake만 하여 연결을 수립한 통신은 양측에서 암호화된 암호문이 아닌 평문을 주고받기 때문에 패킷을 감청할 경우 내용이 그대로 보인다는 보안 취약점이 있다. 이를 보완해 주는 것이 TLS이다.


    비대칭키 암호화 & 대칭키 암호화

    암호화 방식을 나누면 크게 대칭키 암호화비대칭키 암호화, 해시 암호화로 나눌 수 있다. 다만, 본 게시글에서는 해시 암호화에 대해 다루지 않으므로 생략한다.

     

    • 대칭키 암호화

    대칭키 암호화는 암호화할 때 사용한 Key를 이용해 복호화가 가능한 방식이다.

    종류 암호   결과
    암호화 '1234' 'Hello World' HERGNOBF#$T(암호문)
    복호화 '1234' HERGNOBF#$T(암호문) 'Hello World'

    위처럼 1개의 암호를 사용하여 암/복호화가 가능한 방식인데, 이 방식은 구현도 쉽고 속도도 빠르다. 하지만 가장 큰 문제인 "키 배송 문제(Key distribution problem)"가 있다. 키를 하나만 가지고 관리하며 암/복호화하기 때문에 유출 시 큰 문제가 발생하는데, 이 키를 송신 노드, 발신 노드 양 측에 안전하게 전달하여 가질 수 있게 하는 방법이 반드시 필요하다는 점이고 이를 "키 배송 문제 (Key distribution problem)"라고 한다.

     

    • 비대칭키 암호화

    비대칭키 암호화는 공개키(Public Key), 비밀키(Private Key)로 두 개를 한 쌍으로 하는 암호를 사용한다. 한 개의 키로 암호화 하면 반드시 다른 한 개의 키로만 복호화가 가능한 방식이다. 공개키는 공공에 배포하도록하고 비밀키는 서버에서 유출되지 않도록 관리한다.

    종류 암호   결과
    암호화 공개키 'Hello World' 암호문
    복호화 비밀키 암호문 'Hello World'

    공개키를 가지고 암호화하여 전송하면 공개키에 대응되는 비밀키를 가지고 있는 노드만 복호화하여 평문을 볼 수 있다. 이 방식은 대칭키 암호화 방식보다 구현이 어렵고 속도도 느리지만 공개키를 이용하여 키 배송 문제가 발생하지 않는 특징이 있다.

    그래서 비대칭키는 어떠한 데이터를 암/복호화하는 데 사용하기보다 대칭키의 키 배송 문제를 해결하거나 인증 목적으로 사용하는 것이 일반적이다.


    TLS

    이제 이 글의 본론인 TLS의 동작 원리이다. TLS는 앞서 말했던 내용을 모두 이용한다. 기본적으로 대칭키 암호화 방식을 이용해서 보안 통신을 구현하는 것이고, 대칭키 암호화 방식을 사용하기 위해 키 배송 문제를 비대칭키 암호화로 해결하는 과정이 TLS Handshake이다.

    Node Direction Node
    Client Client Hello ( Cipher Suite, TLS Version, Client Random) Server
    Client Server Hello ( Cipher, Server Random, SSL/TLS Certification ) Server
    Client Client Key Exchange ( Encrypted PreMasterSecret) Server
    Client Change Cipher Spec Server

    3-Way Handshake 이후 TLS 보안 연결인 경우 위와 같은 단계들이 수행된다.

     

    1. 클라이언트에서 Client Hello 메시지를 보낸다.

    해당 메시지는 클라이언트에서 지원이 가능한 암호화 알고리즘 종류 (Cipher Suite), TLS 버전, 클라이언트 측에서 생성한 난수가 포함되어 있다.

    만약 서버에서 해당 메시지를 수신하였는데 모든 암호화 알고리즘이 서버에서 지원되지 않거나 TLS 버전이 상이한 경우 보안 통신을 수행할 수 없으므로 연결이 종료된다.

     

    2. 서버에서 Server Hello 메시지를 보낸다.

    서버는 클라이언트로부터 전달받은 암호화 알고리즘 중에 서버에서 사용할 알고리즘을 하나 선택한다. Server Hello 메시지에는 그렇게 선택된 암호화 알고리즘, 서버 측에서 생성한 난수 그리고 SSL/TLS 인증서(Certification)가 포함되어 있다.

     

    클라이언트에서 Server Hello를 수신받으면 SSL/TLS 인증서가 유효한지 검사를 진행한다.

     

    3. 클라이언트에서 Client Key Exchange 메시지를 보낸다.

    클라이언트 측에서 생성한 난수와 서버 측에서 수신받은 난수를 조합하여 PreMasterSecret을 생성한다.

    PreMasterSecret은 추후 통신에 사용될 대칭키인 세션키(Session Key)를 생성하기 위한 비밀키이며 이 PreMasterSecret은 아직까지는 비대칭키 암호화를 사용하여 서버에 전송한다.

     

    4. 클라이언트와 서버 각각 Session Key 생성

    클라이언트와 서버는 모두 클라이언트 생성 난수, 서버 생성 난수, PreMasterSecret를 가지고 있기 때문에 동일한 알고리즘을 거치면 같은 Session Key를 생성할 수 있다.

    f(preMasterSecret, clientRandom, serverRandom) = masterSecret
    f(masterSecret, clientRandom, serverRandom) = sessionKey

     

    이제 클라이언트와 서버는 각자 세션키를 통해 서로가 누구인지 알 수 있고, 데이터를 안전하게 암호화하여 보낼 수 있게 되었다.

     

    5. 서로 Change Cipher Spec 메시지를 보낸다.

    이제 대칭키 암호인 Session Key를 클라이언트와 서버가 안전하게 보관하게 되었으므로 속도가 느린 비대칭키 암호화를 사용할 필요가 없어졌다.

    2. Server Hello 단계에서 지정했던 암호화 알고리즘을 이용할 것이고 Session Key라는 대칭키 암호를 이용해 추후 데이터 통신을 진행할 것이라는 메시지를 서로에게 보낸다.

     

    Wireshark Packet Capture

     

    Wireshark 프로그램을 이용해 실제로 TLS Handshake가 진행되었던 로그이다.

     

    + HTTP와 같이 비연결성(Connectionless), 무상태(Stateless)한 프로토콜에서 TLS를 사용하게 되면 매번 위 단계를 수행해야 하는가 싶지만, 그렇지 않다. TLS Handshake를 통해 도출되는 Session Key는 서버 측에서 대부분 만료 기간을 정해놓는다. 그 시간 안에서는 재사용이 가능하다. 따라서 만료되지 않았다면 매번 호출 때마다 위 단계를 수행하지 않고 클라이언트에서 기억하고 있던 Session Key를 Client Hello에 함께 보내게 된다.


    SSL/TLS Version

    • SSL 2.0 - 1994 공개
    • SSL 3.0 - 1995 공개
    • TLS 1.0 - 1999 공개
    • TLS 1.1 - 2006 공개
    • TLS 1.2 - 2008 공개
    • TLS 1.3 - 2018 공개

    2020년 이후 대부분 브라우저는 TLS 1.1 이하 버전에 대한 지원 중단.

     

    댓글