https (TLS handshake) process

agnusdei·2025년 8월 30일
0

CTF

목록 보기
70/154

HTTPS/TLS 핸드셰이크와 세션 키 생성 원리

HTTPS는 HTTP over TLS/SSL로 데이터를 안전하게 암호화해서 전송합니다.
핵심은 TLS Handshake를 통해 클라이언트와 서버가 암호화 알고리즘, 키, 인증서 등을 안전하게 교환하는 것입니다.

핵심 단계:

  1. Client Hello
  2. Server Hello + Certificate + Key Exchange
  3. Client Key Exchange
  4. Change Cipher Spec / Finished
  5. Encrypted Application Data

1️⃣ 시간 순서로 TLS 1.2 기준 설명 (트래픽 캡처 관점)

Step 1: Client Hello (클라이언트 → 서버)

  • 목적: TLS 연결 시작

  • 내용:

    • 지원 TLS 버전 (예: TLS 1.2)
    • 지원 암호화 스위트 (예: AES128-GCM-SHA256)
    • 랜덤 값(Client Random) 생성 및 전송
    • 세션 재개 가능 여부

트래픽 캡처 예시:

Frame 1: Client Hello
TLSv1.2 Record Layer: Handshake Protocol: Client Hello

💡 어린이 비유:
“나는 안전한 상자를 만들 준비가 됐어. 내 주사위 숫자(Client Random)도 보낼게.”


Step 2: Server Hello + Certificate (서버 → 클라이언트)

  • 목적: 서버 설정 선택 및 신원 증명

  • 내용:

    • TLS 버전 선택
    • 암호화 스위트 선택
    • 서버 랜덤 값(Server Random) 생성 및 전송
    • 서버 인증서(Certificate) 전송
    • (옵션) 서버 키 교환, 클라이언트 인증서 요청

트래픽 캡처 예시:

Frame 2: Server Hello
TLSv1.2 Record Layer: Handshake Protocol: Server Hello
TLS Certificate: Server X.509 Certificate

💡 어린이 비유:
“좋아요, 우리 이 방식으로 하자. 내 주사위(Server Random) 숫자도 보내고, 내 신분증(Certificate)도 보여줄게. 진짜 서버 맞지?”

🔑 핵심 원리:

  • 서로 랜덤 값(Client Random / Server Random) 교환 → 세션 키 계산 재료
  • 인증서 전송 → 서버 신원 확인, 공개키 안전하게 확보

Step 3: Client Key Exchange (클라이언트 → 서버)

  • 목적: 세션 키 안전하게 공유

  • 내용:

    • 클라이언트가 Premaster Secret 생성
    • 서버 공개키로 암호화 후 전송 (RSA)
    • TLS 1.3에서는 Diffie-Hellman(ECDHE) 기반 키 교환

트래픽 캡처 예시:

Frame 3: Client Key Exchange
Encrypted PreMasterSecret

💡 어린이 비유:
“내가 만든 비밀 조각(Premaster Secret)을 안전하게 보내면, 너(서버)만 열 수 있어.”


Step 4: Change Cipher Spec & Finished

  • 목적: 이후 트래픽부터 암호화 적용

  • 내용:

    • 클라이언트 → 서버: Change Cipher Spec
    • 클라이언트 → 서버: Finished (핸드셰이크 무결성 확인)
    • 서버 → 클라이언트: Change Cipher Spec + Finished

트래픽 캡처 예시:

Frame 4: Change Cipher Spec
Frame 5: Encrypted Handshake Message: Finished

💡 어린이 비유:
“이제 우리 둘 다 같은 열쇠(Session Key)를 갖고 상자를 잠글 수 있어. 이제 메시지는 안전하게 보낼 수 있어.”


Step 5: Encrypted Application Data

  • HTTPS 요청/응답 데이터 전송
  • 캡처에서는 Application Data로 보이며 내용은 해독 불가
Frame 6: Application Data
TLSv1.2 Record Layer: Application Data (encrypted)

💡 어린이 비유:
“상자가 잠겼으니, 편지 내용을 도둑이 봐도 열 수 없어!”


2️⃣ 세션 키가 같은 이유 (원리 설명)

  1. 클라이언트와 서버는 서로 다른 랜덤 값(Client Random / Server Random) 생성 및 교환
  2. 클라이언트가 Premaster Secret 생성 후 서버 공개키로 전송
  3. 서버는 복호화하여 동일한 Premaster Secret 획득
  4. 두 쪽 모두 같은 수학 공식(f) 사용:
Session Key=f(Premaster Secret,Client Random,Server Random)\text{Session Key} = f(\text{Premaster Secret}, \text{Client Random}, \text{Server Random})

결과: 같은 세션 키(Session Key) 획득 → 안전하게 암호화 통신 가능

💡 어린이 버전 비유:

  • 클라이언트와 서버가 같은 마법책 공식 사용
  • 클라이언트: “내 숫자 + 서버 숫자 → 계산 → 열쇠 완성”
  • 서버: “내 숫자 + 클라이언트 숫자 → 계산 → 열쇠 완성”
  • 결과: 같은 열쇠 생성
  • 도둑이 랜덤 숫자만 봐도 열쇠를 만들 수 없음

3️⃣ Server Hello에서 인증서 전송 이유

  • 클라이언트가 연결하려는 서버가 진짜 서버인지 확인 필요

  • 서버 인증서 안의 정보:

    1. 서버 도메인 이름 (예: www.example.com)
    2. 서버 공개키(Public Key)
    3. 인증서 발급자(CA)
    4. 유효 기간
    5. 디지털 서명(CA 서명 → 변조 방지)

원리:

  1. 클라이언트가 Client Hello 전송
  2. 서버가 Server Hello + Certificate 전송 → “내 공개키와 신원 확인해”
  3. 클라이언트는 인증서 검증 → 도메인, CA 서명 확인
  4. 클라이언트는 Premaster Secret을 안전하게 서버 공개키로 암호화 후 전송 → 세션 키 생성

💡 어린이 비유:

  • 서버 = 친구 집
  • 클라이언트 = 놀러 가는 사람
  • 인증서 = 친구 집 신분증, 경찰(CA)이 확인
  • 검증 후 안전하게 열쇠(세션 키) 전달

4️⃣ 전체 정리: 트래픽 캡처 + 키 생성 + 인증서

순서메시지주체기능캡처 특징
1Client Hello클라이언트TLS 시작, 지원 암호화 알림, Client Random 전송Handshake, Client Hello
2Server Hello + Certificate서버TLS 버전/암호화 선택, Server Random 전송, 서버 신원 인증Server Hello, Certificate
3Client Key Exchange클라이언트Premaster Secret 전송, 세션 키 생성 재료 공유Encrypted PreMasterSecret
4Change Cipher Spec + Finished양쪽이후 트래픽 암호화 시작Change Cipher Spec, Finished
5Application Data양쪽HTTPS 데이터 암호화 전송Application Data (encrypted)

💡 핵심 요약

  1. 클라이언트와 서버는 서로 랜덤 값 공유
  2. Premaster Secret + 랜덤 값 → 같은 세션 키 생성
  3. 인증서로 서버 신원 확인 + 공개키 안전 확보
  4. 이후 통신은 대칭키 암호화 → 도중 공격자가 봐도 안전

profile
DevSecOps ⚙️ + CTF🚩

0개의 댓글