본문으로 건너뛰기

TLS 고급 설정: TLS 1.3과 취약 암호 비활성화

최신 TLS 설정은 단순히 암호화를 켜는 것을 넘어, 취약한 알고리즘을 제거하고 Perfect Forward Secrecy를 보장하며 최신 프로토콜을 활성화하는 것까지 포함합니다.


TLS 1.3의 장점​

TLS 1.3은 2018년 RFC 8446으로 표준화되었으며, TLS 1.2 대비 다음과 같이 개선되었습니다.

항목TLS 1.2TLS 1.3
핸드셰이크 왕복2-RTT1-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+ 달성 체크리스트와 인증서 만료 모니터링 자동화를 알아봅니다.