SSL vs TLS
SSL certificate란?
SSL(Secure Sockets Layer)은 public key와 private key를 생성해 웹 사이트의 정보와 묶어주는 인증서를 말한다. 이때 key pair는 각각의 connection마다 uniquely 생성된다. 이때 public key는 certificate에 의해 외부에 공개되며, private key는 서버에 보관된다.
SSL certificate는 Domain name이나 웹 사이트의 소유자를 식별한다. 만약 웹 서버의 SSL certificate가 인증된 CA(Certificate Authority)에 의해 서명되면, End user의 웹 브라우저와 OS에 의해 인증돼, end user가 안전하게 접근할 수 있게 된다.
1999년 TLS(Transport Layer Security) 1.0이 나오면서 사실상 Deprecated 되었지만 여전히 용어가 혼재 돼 사용되고 있다.
TLS ceritficate란?
간단히, SSL의 이후 버전(SSL 3.0 버전의 이후 버전)이다. SSL을 TLS로 이름을 변경한 이유는, IETF가 형식적으로 Netscape의 프로토콜을 그냥 승인하는 것처럼 보이지 않기 위함도 있다. 또한, SSL 3.0과 TLS 1.0가 호환되지 않는다는 특징도 있다. TLS의 주된 목표는 communication하고 있는 두 application에 보안과 데이터 통합을 제공하는 것이다. 해당 프로토콜은 2개의 Layer로 구성 돼 있다.
- TLS Record Protocol
- Encryption 없이도 사용될 수 있다.
- TLS Handshake Protocol
- 세션 간 어떠한 SSL/TLS 버전을 사용할지 결정한다.
- 데이터를 전달하기 전 안전한 연결을 구성한다.
TLS 1.0은 RFC 2246에 정의 돼 있는데, 현재(2023.04.26) 기준 가장 최신 버전은 TLS 1.3의 RFC 8446이다.
TLS 연결을 수립하는 과정
처음의 Handshake는 Asymmetric encryption(public key, private key) 을 사용하지만, 이후의 각 세션은 Symmetric encryption(shared key) 을 사용한다.
이는 RFC 5246에 자세히 설명 돼 있다.
이때, SSL 혹은 TLS 프로토콜은 "선택"하는 것이 아니라, 다음의 2가지 방식 중 하나를 통해 결정된다.
- Port(explicit, SSL)
- 특정한 포트에 연결함으로써 보안 연결이 가능하다.
- 이러한 포트는 서버 쪽에서 설정한다.
- Protocol(implicit, usually TLS, sometimes SSL)
- 처음 연결은 암호화되지 않은 연결을 시도하고, 성공적인 handshake 이후는 보안 연결로 전환된다.
- 만약 handshake에 실패하면 연결은 종료된다.
하지만, 어느 방식을 사용하든 서버 측에 설치된 소프트웨어가 지원하는 보안 레벨을 따르게 된다.
무엇이 같고 다를까
SSL/TLS 프로토콜은 TCP/IP Model에서 Transport Layer와 Application Layer 사이에 존재한다. 그리고 SSL과 TLS 모두 네트워크에서 인증되고 암호화된 연결을 위한 프로토콜이다. 그리고 일반적으로 443 포트번호를 표준으로 사용되지만, 어떠한 Port를 사용해도 된다.
TLS 1.0은 SSL 3.0을 기반으로 하고, 크게 다른 점은 없지만, TLS 1.0과 SSL 3.0은 상호운용될 수 없다.(물론 TLS와 SSL은 동일한 mechanism을 사용하기 때문에, Old Browser와의 동작을 위해 TLS은 SSL로의 역방향으로 적용이 가능하긴 하다.)
무엇을 사용해야 할까?
(출처: https://en.wikipedia.org/wiki/Transport_Layer_Security)
위 이미지를 보면 알겠지만, 아직도 일부 네트워크에서 SSL 3.0 혹은 그 이하 버전을 사용하는 경우가 있는데, 이는 무려 약 30년 전의 보안 레벨이고, 따라서 많은 취약점이 존재해 이미 지난 2015년에 RFC 7568에서 deprecated 되었다.
그렇다면 TLS를 사용하면 될까? 여기서 주의해야할 점은 앞서 말했지만, SSL이냐 TLS냐의 프로토콜은 "선택"되는 것이 아니라, 서버의 구성에 따라 결정된다.
https://www.ssllabs.com/ssltest에서 위와 같은 SSL certificate를 테스트할 수 있다. 위의 예시는 Amazon EC2에 Nginx를 Reverse Proxy로 구성한 뒤, certbot으로 인증서를 발급한 Spring Boot application 서버의 인증서 조회 결과이다.