TLS(SSL) 주요 개념
TLS
안전한 인터넷 통신을 위한 암호화 및 인증 프로토콜
TLS Handshake
TLS 암호화를 사용하는 통신 세션을 실행하는 프로세스
- 어떤 암호화 쓸지 협상
- 서버가 진짜인지 검증
- 안전하게 대칭키 생성
- 이후는 빠르게 암호화 통신
프로세스 (TLS 1.3 기준)
ClientHello
- 클라이언트가 아래 정보를 포함하여 헬로 메시지 전달
- 지원 TLS 버전
- Cipher Suite 리스트
- SNI (도메인)
- ALPN (HTTP/2 여부)
- Session 재사용 정보
ServerHello
- 메시지 응답으로 서버에서 아래 정보를 포함한 메시지 전송
- TLS 버전 선택
- Cipher 선택
- 무작위 바이트 문자열
인증 + 키 교환
- 클라이언트에서 서버의 인증서를 인증서 발행 기관을 통해 검증
- 클라이언트가 예비 마스터 암호 무작위 바이트 문자열을 암호화하여 한번 더 전송
- 이 때 서버의 인증서를 통해 공개키를 받아서 암호화하여 전송
- 서버가 예비 마스터 암호를 해독
검증
- 클라이언트, 서버 모두 클라이언트 클라이언트 무작위, 서버 무작위, 예비 마스터 암호를 이용해 세션키 생성
- 모두 같은 결과가 나오면 성공
Handshake 에러 대응
디버깅 체크리스트
문제 생기면 순서대로 확인해보자
- 인증서 확인
bash# 1. 인증서 확인 openssl s_client -connect domain:443 -servername domain # 2. TLS 확인 openssl s_client -tls1_2 openssl s_client -tls1_3 # 3. HTTP 레벨 확인 curl -v https://domain # 4. SNI 확인 curl --resolve domain:443:IP https://domain # 5. cipher 확인 nmap --script ssl-enum-ciphers -p 443 domain
에러 상세 내용
| # | 장애 유형 | 주요 증상 | 원인 | 해결 방법 | 비고 |
|---|---|---|---|---|---|
| 1 | 인증서 오류 | 브라우저 경고 (NET::ERR_CERT...) | 도메인 mismatch, 만료, chain 누락 | openssl s_client -connect domain:443 -servername domain | SAN 확인 + intermediate cert 필수 |
| 2 | SNI 문제 | 특정 환경에서 다른 인증서 반환 | SNI 미전달, default cert 사용 | curl --resolve domain:443:IP https://domain | 멀티 도메인 환경이면 거의 이 문제 |
| 3 | TLS 버전 mismatch | handshake failure | client ↔ server 버전 불일치 | TLS 1.2 이상 허용 | 레거시 클라이언트 대응 필요 여부 판단 |
| 4 | Cipher mismatch | handshake failure | 공통 cipher 없음 | 서버 cipher 리스트 확장 | modern TLS config 사용 |
| 5 | Session Resume 실패 | latency 증가, CPU 상승 | 세션 공유 안됨, ticket 불일치 | session cache / ticket key 공유 | LB 환경에서 자주 발생 |
| 6 | ALPN 문제 | HTTP/2 미사용 | ALPN 미설정 | nginx http2 설정 | 성능 저하 원인 |
| 7 | Forward Secrecy 없음 | 보안 취약 | RSA key exchange 사용 | ECDHE 강제 | TLS 1.3이면 자동 해결 |
| 8 | Mixed Content | 일부 요청 차단 | HTTPS 페이지에서 HTTP 호출 | 모든 리소스 HTTPS화 | 프론트에서 자주 터짐 |
| 9 | OCSP 지연 | handshake 느림 | CA 검증 요청 지연 | OCSP Stapling 활성화 | 체감 성능 영향 큼 |
| 10 | Proxy/LB 설정 문제 | redirect loop, HTTPS 깨짐 | X-Forwarded-Proto 누락 | proxy header 설정 | CloudFront/ALB 뒤에서 필수 |