mTLS(Mutual TLS)는 클라이언트와 서버 양쪽이 모두 인증서로 상호 인증하는 TLS의 확장 방식이다. 서버만 인증서를 제시하는 일반 TLS와 달리, 클라이언트도 자신의 신원을 증명한다.
일반 TLS vs mTLS
일반 TLS:
Client ──→ Server (서버 인증서만 검증)
mTLS:
Client ←→ Server (서버↔클라이언트 상호 인증서 검증)
mTLS 핸드셰이크
Client Server
│── ClientHello ─────────────>│
│<── ServerHello ─────────────│
│<── Certificate (서버 인증서) ─│
│<── CertificateRequest ───────│ ← 클라이언트 인증 요청
│── Certificate (클라이언트 인증서)>│
│── CertificateVerify ────────>│
│── Finished ─────────────────>│
│<── Finished ─────────────────│
인증서 생성 및 설정
bash
# CA 생성
openssl genrsa -out ca.key 4096
openssl req -new -x509 -key ca.key -out ca.crt -days 3650
# 서버 인증서
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365
# 클라이언트 인증서
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr -subj "/CN=service-a/O=myorg"
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365
Nginx mTLS 서버 설정
nginx
server {
listen 443 ssl;
ssl_certificate /etc/ssl/server.crt;
ssl_certificate_key /etc/ssl/server.key;
ssl_client_certificate /etc/ssl/ca.crt;
ssl_verify_client on; # 클라이언트 인증 필수
ssl_verify_depth 2;
# 클라이언트 인증서 정보를 헤더로 전달
location / {
proxy_set_header X-Client-CN $ssl_client_s_dn_cn;
proxy_pass http://backend;
}
}
활용 사례
- •마이크로서비스: 서비스 간 통신 (Istio, Linkerd 자동 mTLS)
- •API 게이트웨이: 클라이언트 앱 식별
- •Zero Trust 보안: 모든 연결을 인증
관련 문서
- •[[tls-advanced|TLS 1.3 심화]]
- •[[crypto-protocols|암호 프로토콜]]
- •[[perfect-forward-secrecy|완전 순방향 비밀성 (PFS)]]