TLS는 Transport Layer Security로 네트워크 통신 구간에서 인증과 기밀성을 보장하는 보안 프로토콜이다.
핸드셰이크란?
아래 두 가지를 확립하는 과정을 핸드셰이크라고 한다.
- 인증(Authentication): 지금 통신하는 상대가 진짜 그 서버가 맞는지 확인
- 기밀성/무결성(Confidentiality/Integrity): 오가는 데이터를 암호화해서 도청·변조 방지
TLS는 어디에 위치할까?
Transport(전송) 계층 바로 위, Application(응용) 계층 아래에 위치한다. 그래서 그래서 상위에 HTTP를 얹으면 HTTPS, SMTP를 얹으면 SMTPS가 되는 것처럼, TLS 자체는 어떤 상위 프로토콜과도 조합 가능한 범용 계층이다.
핵심 구성요소 세 가지
- Public Key Infrastructure (공개키 기반구조): root CA → intermediate CA → leaf 인증서로 이어지는 신뢰 체계. 이걸 통해 "이 공개키가 진짜 이 도메인 것이다"를 CA가 전자서명으로 보증
- 인증서(X.509): 그 보증 결과를 담은 문서. PEM은 그걸 텍스트로 인코딩하는 표준 포맷
- 핸드셰이크: 클라이언트가 서버 인증서 체인을 자기 로컬 trust store의 root까지 검증하고, 그다음 세션키를 안전하게 교환하는 절차
SSL과의 관계
TLS는 SSL의 후속 버전이에요. SSL은 설계 결함(POODLE, DROWN 등)으로 전부 폐기됐고, 지금 쓰이는 건 사실상 TLS 1.2/1.3뿐인데 이름만 관습적으로 "SSL"이라 부르는 경우가 많아요 (ssl_protocols, SSLHandshakeException 등).
PKI의 기본구조
PKI (전체 인프라)
├── CA (인증서 발급/서명 기관)
│ ├── Root CA
│ ├── Intermediate CA
│ └── Leaf 인증서
├── 인증서 (구조/포맷 자체 - 공개키 + 신원정보를 CA가 서명한 문서)
├── CRL/OCSP (폐기 체계 - 인증서 도난/유출 시 무효화하는 메커니즘)
└── 신뢰 저장소 (OS나 애플리케이션이 어떤 root를 신뢰할지 관리하는 저장소)
CA 계층구조
- Root CA: 자기 자신을 자기 개인키로 서명(self-signed). OS/브라우저에 미리 내장돼 있어서 별도 검증 없이 신뢰됨. 개인키는 오프라인으로 엄격히 보관.
- Intermediate CA: Root가 서명한 하위 CA. 실제 서버 인증서는 root가 직접 서명하지 않고 이 중간 CA가 서명함. 이렇게 하는 이유는 root 키를 노출시키지 않으면서, 사고 발생 시 root는 그대로 두고 intermediate만 폐기(revoke)하면 되기 때문.
- Leaf(end-entity) 인증서: *.aa.co.kr 실제 도메인용. intermediate가 서명.

인증서 인코딩 방식
- .pem: 보통 PEM(Base64 텍스트) 형식이 맞음. 확장자 자체가 "PEM 형식이다"를 의도하고 붙인 이름이라 신뢰도가 높음.
- .crt: PEM(텍스트)일 수도, DER(바이너리)일 수도 있음. 특히 Windows/IIS 환경에서는 .crt가 DER 바이너리인 경우가 흔하고, Linux/nginx 환경에서는 .crt가 PEM 텍스트인 경우가 흔함. .crt는 그냥 "이건 인증서 파일이다"라는 뜻만 담고 있지, 인코딩 방식은 명시 안 함. 그래서 열어서 확인해봐야함.
file mycert.crt
# "PEM certificate" 또는 "data" (바이너리 DER인 경우 이렇게 뜸)
head -c 30 mycert.crt
# 텍스트로 -----BEGIN CERTIFICATE----- 가 보이면 PEM
# 이상한 바이너리 문자가 보이면 DER
Sectigo은 체인이 왜 4개일까?
Sectigo 인증기관에서 발급한 SSL을 사용하는데 레거시 호환성으로 인해서 체인이 4개였다.
옛날 Windows XP나 구형 클라이언트들은 최신 root인 USERTrust RSA CA를 신뢰 저장소에 안 갖고 있는 경우가 있어서, 예전부터 신뢰돼 있던 AddTrust External CA Root로 cross-sign 해둔 게 번들에 같이 들어있는 것. (이 AddTrust 루트는 2020년에 만료돼서, 지금은 사실상 3단만 실질적으로 동작하지만 번들 파일에는 호환용으로 여전히 포함되는 경우가 많음)

TLS 핸드셰이크 자세히 보기
두 컴퓨터가 실시간으로 주고받는 통신 절차로써, 시간 순서대로 메시지를 주고받는 프로토콜 흐름이다.
핸드셰이크는 이 두 가지를 확립하는 협상 과정이고, 흥미로운 점은 인증서(비대칭키)는 핸드셰이크 단계에서만 쓰이고, 실제 데이터 전송은 훨씬 빠른 대칭키(세션키)로 한다는 것이다.
1. ClientHello: 클라이언트가 지원 가능한 TLS 버전, 암호 스위트 목록, random 값을 보냄
2. ServerHello: 서버가 그중 하나를 골라서 응답 (버전/암호 스위트 확정), 자기 random 값도 같이 보냄
3. Certificate: 서버가 자기 인증서 체인을 보냄 — nginx가 star_cert.pem에 있는 leaf+intermediate들을 이 시점에 클라이언트로 쏘는 것. (root는 안 보냄, 클라이언트가 이미 OS 저장소에 갖고 있으니까)
4. ServerHelloDone: 서버 쪽 메시지 끝
- 체인 검증: 클라이언트가 받은 인증서 체인을 자기 OS/브라우저 신뢰 저장소의 root까지 서명 검증. 여기서 실패하면 "이 연결은 안전하지 않습니다" 뜨는 거예요.
5. ClientKeyExchange: 클라이언트가 pre-master secret을 만들어서 서버의 공개키(인증서 안에 들어있음)로 암호화해서 보냄. 이건 서버의 개인키로만 복호화 가능 — 이 지점이 진짜 인증(누가 개인키를 갖고 있나)이 실질적으로 일어나는 곳
6. Finished: 양쪽이 각자 계산한 세션키로 암호화 통신 시작. 이후 모든 데이터는 대칭키(AES 등)로 암호화됨

PKI 에서 사용하는 전자서명 메커니즘
인증서 자체가 어떻게 만들어지고 검증되는가에 대한 알고리즘적 원리이다. 수학적 절차에 해당한다.
이미 인증서를 발급할 때 한번 일어나고 검증할때마다 재사용되는거다. 실시간 대화가 아니라 이미 만들어진 문서의 진위를 확인하는 방법이다.
1. 원본 데이터를 해시해서 고정 길이 값으로 만든다.
2. 그 해시값을 개인키로 암호화한다. 이 과정을 서명이라고 부른다.
3. 받는 쪽은 같은 데이터를 다시 해시하고 서명을 공개키로 복호화해서 나온 값과 비교한다.
4. 둘이 같으면 원본이 위변조가 안됐고 그 개인키를 가진 사람이 서명한게 맞다는 게 증명된다.
1,2번은 CA가 인증서로 미리 발급해둔것이고 3,4번은 클라이언트다 핸드셰이크 중 체인 검증 단계에서 하는것이다.
CA가 자기 개인키로 이 공개키는 .aa.co.kr 도메인것이다. 라는 정보에 전자서명을 하고 그 인증서를 열어보면 안에 CA의 서명값이 들어있고 클라이언트는 CA 공개키로 그 서명을 검증한다.
'Network' 카테고리의 다른 글
| 네트워크 OSI 7계층 설명 (1) | 2026.03.01 |
|---|





