TLS (SSL)

TLS(SSL) 주요 개념

TLS

안전한 인터넷 통신을 위한 암호화 및 인증 프로토콜

TLS Handshake

TLS 암호화를 사용하는 통신 세션을 실행하는 프로세스

  1. 어떤 암호화 쓸지 협상
  2. 서버가 진짜인지 검증
  3. 안전하게 대칭키 생성
  4. 이후는 빠르게 암호화 통신

프로세스 (TLS 1.3 기준)

ClientHello

  • 클라이언트가 아래 정보를 포함하여 헬로 메시지 전달
    • 지원 TLS 버전
    • Cipher Suite 리스트
    • SNI (도메인)
    • ALPN (HTTP/2 여부)
    • Session 재사용 정보

ServerHello

  • 메시지 응답으로 서버에서 아래 정보를 포함한 메시지 전송
    • TLS 버전 선택
    • Cipher 선택
    • 무작위 바이트 문자열

인증 + 키 교환

  • 클라이언트에서 서버의 인증서를 인증서 발행 기관을 통해 검증
  • 클라이언트가 예비 마스터 암호 무작위 바이트 문자열을 암호화하여 한번 더 전송
    • 이 때 서버의 인증서를 통해 공개키를 받아서 암호화하여 전송
  • 서버가 예비 마스터 암호를 해독

검증

  • 클라이언트, 서버 모두 클라이언트 클라이언트 무작위, 서버 무작위, 예비 마스터 암호를 이용해 세션키 생성
  • 모두 같은 결과가 나오면 성공

Handshake 에러 대응

디버깅 체크리스트

문제 생기면 순서대로 확인해보자

  1. 인증서 확인
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 domainSAN 확인 + intermediate cert 필수
2SNI 문제특정 환경에서 다른 인증서 반환SNI 미전달, default cert 사용curl --resolve domain:443:IP https://domain멀티 도메인 환경이면 거의 이 문제
3TLS 버전 mismatchhandshake failureclient ↔ server 버전 불일치TLS 1.2 이상 허용레거시 클라이언트 대응 필요 여부 판단
4Cipher mismatchhandshake failure공통 cipher 없음서버 cipher 리스트 확장modern TLS config 사용
5Session Resume 실패latency 증가, CPU 상승세션 공유 안됨, ticket 불일치session cache / ticket key 공유LB 환경에서 자주 발생
6ALPN 문제HTTP/2 미사용ALPN 미설정nginx http2 설정성능 저하 원인
7Forward Secrecy 없음보안 취약RSA key exchange 사용ECDHE 강제TLS 1.3이면 자동 해결
8Mixed Content일부 요청 차단HTTPS 페이지에서 HTTP 호출모든 리소스 HTTPS화프론트에서 자주 터짐
9OCSP 지연handshake 느림CA 검증 요청 지연OCSP Stapling 활성화체감 성능 영향 큼
10Proxy/LB 설정 문제redirect loop, HTTPS 깨짐X-Forwarded-Proto 누락proxy header 설정CloudFront/ALB 뒤에서 필수