TLS 고급 설정: TLS 1.3과 취약 암호 비활성화
최신 TLS 설정은 단순히 암호화를 켜는 것을 넘어, 취약한 알고리즘을 제거하고 Perfect Forward Secrecy를 보장하며 최신 프로토콜을 활성화하는 것까지 포함합니다.
TLS 1.3의 장점
TLS 1.3은 2018년 RFC 8446으로 표준화되었으며, TLS 1.2 대비 다음과 같이 개선되었습니다.
| 항목 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 핸드셰이크 왕복 | 2-RTT | 1-RTT |
| 0-RTT 재연결 | 없음 | 지원 (주의 필요) |
| 레거시 알고리즘 | RSA 키 교환, RC4, 3DES 등 | 모두 제거 |
| Forward Secrecy | 선택적 | 기본 필수 |
| 암호 스위트 | 수십 가지 | 5가지로 단순화 |
| 취약점 면적 | 큼 | 대폭 축소 |
TLS 1.3 전용 설정 (Nginx)
server {
listen 443 ssl;
http2 on;
server_name example.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
# TLS 1.3만 허용 (호환성 낮지만 최고 보안)
ssl_protocols TLSv1.3;
# TLS 1.3 암호 스위트는 OpenSSL이 자동 선택
# 수동 지정이 필요하다면 (OpenSSL 1.1.1+)
ssl_conf_command Ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256;
}
현실적인 권장 설정 (TLS 1.2 + 1.3 병행):
ssl_protocols TLSv1.2 TLSv1.3;
구형 기기(Android 4.x, IE 11 등)는 TLS 1.3을 지원하지 않을 수 있습니다.
취약 암호 비활성화
제거해야 할 알고리즘
RC4 — NOMORE 공격에 취약
3DES — SWEET32 공격에 취약 (64비트 블록 크기)
MD5 — 충돌 가능성
SHA-1 — 충돌 가능성 (SHAttered)
NULL — 암호화 없음
EXPORT — 40~56비트 키 (극도로 취약)
aNULL — 인증 없음
eNULL — 암호화 없음
DES — 단일 DES (취약)
IDEA — 구형
SEED — 한국 표준이나 TLS에서 제거됨
Nginx 안전한 암호 스위트 설정
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:'
'ECDHE-RSA-AES128-GCM-SHA256:'
'ECDHE-ECDSA-AES256-GCM-SHA384:'
'ECDHE-RSA-AES256-GCM-SHA384:'
'ECDHE-ECDSA-CHACHA20-POLY1305:'
'ECDHE-RSA-CHACHA20-POLY1305:'
'DHE-RSA-AES128-GCM-SHA256:'
'DHE-RSA-AES256-GCM-SHA384:'
'!DSS:'
'!aNULL:'
'!eNULL:'
'!EXPORT:'
'!RC4:'
'!3DES:'
'!MD5:'
'!PSK:'
'!aECDH';
Apache 안전한 암호 스위트 설정
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:\
ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:\
ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:\
DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:\
!DSS:!aNULL:!eNULL:!EXPORT:!RC4:!3DES:!MD5
SSLHonorCipherOrder off # TLS 1.3에서는 off
Perfect Forward Secrecy (PFS)
ECDHE 또는 DHE 키 교환만 허용하면 PFS가 보장됩니다. 위 암호 스위트에서 ECDHE-로 시작하는 것들이 PFS를 제공합니다.
# 현재 서버가 PFS를 지원하는지 확인
openssl s_client -connect example.com:443 2>/dev/null | grep "Server Temp Key"
# Server Temp Key: X25519, 253 bits ← PFS 지원 (ECDHE 키 교환)
# Server Temp Key: DH, 4096 bits ← PFS 지원 (DHE 키 교환)
# (없음) ← PFS 미지원 (RSA 키 교환)
0-RTT (TLS 1.3 Early Data)
TLS 1.3에서 이전에 접속한 서버에 재연결 시 핸드셰이크 없이 즉시 데이터를 전송할 수 있습니다. 성능은 향상되지만 재전송 공격(Replay Attack) 위험이 있습니다.
# 0-RTT 비활성화 (안전 우선)
ssl_early_data off; # 기본값
# 0-RTT 활성화 (GET 요청만 허용하는 경우)
ssl_early_data on;
# 애플리케이션에서 반드시 Early-Data 헤더 확인 필요
# 0-RTT 사용 시 재전송 방어 (Nginx)
location / {
if ($ssl_early_data) {
# Early Data로 온 요청에는 425 (Too Early) 반환
return 425;
}
proxy_pass http://backend;
}
원칙: 금융, 결제, 상태 변경 API에는 0-RTT를 사용하지 않습니다.
DH 파라미터 설정 (TLS 1.2 DHE용)
TLS 1.2에서 DHE(Diffie-Hellman Ephemeral) 키 교환을 사용할 경우, 안전한 DH 파라미터가 필요합니다. Nginx 기본값은 1024비트로 취약합니다.
# 4096비트 DH 파라미터 생성 (시간이 걸림)
openssl dhparam -out /etc/nginx/dhparam.pem 4096
# 또는 표준 파라미터 사용 (권장, 즉각 생성)
openssl dhparam -out /etc/nginx/dhparam.pem 2048
ssl_dhparam /etc/nginx/dhparam.pem;
OpenSSL 버전별 TLS 지원 확인
# 시스템 OpenSSL 버전 확인
openssl version -a
# TLS 1.3 지원 여부
openssl s_client -connect example.com:443 -tls1_3 2>&1 | grep "Protocol"
# Nginx OpenSSL 버전 확인
nginx -V 2>&1 | grep "OpenSSL"
# OpenSSL 3.0.x : TLS 1.3, 0-RTT 지원
# OpenSSL 1.1.1 : TLS 1.3 지원
# OpenSSL 1.0.2 : TLS 1.3 미지원 (업그레이드 필요)
취약점 진단 도구: testssl.sh
# testssl.sh 설치
git clone --depth 1 https://github.com/drwetter/testssl.sh.git
cd testssl.sh
# 전체 진단
./testssl.sh example.com
# 특정 항목 진단
./testssl.sh --protocols example.com # 프로토콜 버전
./testssl.sh --ciphers example.com # 암호 스위트
./testssl.sh --vulnerable example.com # 알려진 취약점 (POODLE, BEAST 등)
./testssl.sh --headers example.com # 보안 헤더
./testssl.sh --client-simulation example.com # 클라이언트 호환성
출력 예시:
Protocol Support
SSLv2 not offered (OK)
SSLv3 not offered (OK)
TLS 1 not offered (OK)
TLS 1.1 not offered (OK)
TLS 1.2 offered (OK)
TLS 1.3 offered (OK)
SSL Labs 테스트 체크리스트
ssllabs.com에서 A+ 등급을 받으려면:
✅ TLS 1.0, 1.1 비활성화
✅ SSL 2.0, 3.0 비활성화
✅ 취약 암호(RC4, 3DES, EXPORT) 비활성화
✅ Forward Secrecy (ECDHE/DHE) 지원
✅ HSTS 설정 (max-age >= 180일)
✅ 안전한 인증서 체인 (2048비트+ RSA 또는 256비트+ ECDSA)
✅ OCSP Stapling 활성화
✅ HTTP/2 활성화
다음 페이지에서는 SSL Labs A+ 달성 체크리스트와 인증서 만료 모니터링 자동화를 알아봅니다.