SSL handshake

Creating the dots·2022년 1월 10일
0

CS

목록 보기
11/19
post-custom-banner

📚 도서 HTTP 완벽 가이드 14장을 공부하며 정리한 내용입니다.

HTTPS 개요

  • HTTP 메시지를 TCP(전송계층)로 보내기 전 요청과 응답 데이터를 암호화해 SSL 또는 TLS(보안계층)으로 보낸다.
  • HTTPS의 보안계층은 SSL과 그것의 현대적 대체품인 TLS로 구현되었다. 관행적으로 SSL과 TLS를 모두 의미하는 단어로 'SSL'을 사용한다.

HTTPS 스킴

오늘날 HTTP는 선택적이다. 따라서, 웹 서버로의 요청을 만들때 HTTPS를 수행한다고 말할 방법이 필요한데, 이는 URL의 스킴을 통해 이루어진다.

  • HTTP는 URL의 스킴 접두사는 http이다.
    http://www.joes-hardware.com/index.html

  • HTTPS의 URL 스킴 접두사는 https이다.
    https://cajun-shop.securities.com/Merchant2/merchant.mv?Store_Code=AGCGS

웹 브라우저 등의 클라이언트는 웹 리소스에 대한 트랜잭션 수행을 요청받으면 URL 스킴을 검사하고, http 스킴을 갖고 있다면 클라이언트는 서버에 80번 포트로 연결하고, https 스킴을 갖고 있다면 443번 포트로 연결하고, 서버와 바이너리 포맷으로 된 몇몇 SSL 보안 매개변수를 교환하며 '핸드셰이크'를 하고 암호화된 HTTP 요청을 주고 받는다.

SSL 핸드셰이크

클라이언트가 443번 포트로 TCP 커넥션을 수립하고 난 뒤, 암호화된 HTTP 요청을 주고받기 위해 클라이언트와 서버는 SSL 핸드셰이크 과정이 필요하다. SSL 핸드셰이크는 서버 클라이언트가 서로의 신원을 확인하고 세션키 생성을 협상하는 과정이다.

  • Client Hello
    클라이언트가 서버에 접속해 말을 건네며 다음과 같은 정보를 보낸다.

    • 브라우저가 사용하는 SSL 혹은 TLS 버전 정보
    • 브라우저가 지원하는 암호화 방식 모음 (cipher suit)
    • 클라이언트가 생성한 랜덤 문자열
    • 만약 이전에 SSL 핸드셰이크가 완료된 상태라면, 그때 생성된 세션아이디
    • 기타 확장정보
  • Server Hello
    서버는 클라이언트의 인사에 응답하며 다음 정보를 클라이언트에 제공한다.

    • 서버가 지원하고 선택한 암호화 방식 (cipher suit)
    • 서버의 공개키가 담긴 SSL 인증서.
      • SSL 인증서를 발급한 CA는 CA의 비밀키를 이용해 인증서를 암호화했다. 그래서 SSL 인증서는 CA의 공개키를 이용해서만 복호화할 수 있다. 인증서 내부에는 서버가 발행한 공개키가 들어있고, 개인키는 서버가 소유하고 있다.
    • 서버가 생성한 랜덤 문자열
    • 클라이언트에 인증서를 요청할 수 있지만, 거의 일어나지 않음.
  • Client의 인증서 확인
    브라우저들은 여러 서명 기관(CA)의 인증서가 미리 설치된 채로 출하된다. 따라서, 서버가 보낸 SSL 인증서가 명시된 CA가 만든 것인지 확인하기 위해 브라우저에 내장된 해당 CA 공개키로 암호화된 인증서를 복호화한다. 정상적으로 복호화되었다면 CA가 발급한 것임을 확인할 수 있다. 만약, 복호화되지 않는다면, 브라우저에 경고를 보낸다. 그런데, 브라우저가 모르는 CA라면, 브라우저는 해당 CA를 신뢰해야할지 확신할 수 없으므로 대개 유저가 서명 기관을 신뢰하는지 확인하기 위한 대화상자를 보여준다.
    이때, 서버가 인증서에 명시된 서버인지, 클라이언트가 상호작용 중인 서버가 실제 해당 도메인의 소유자인지도 확인한다.

  • Client의 예비 마스터 암호 전송
    클라이언트는 예비 마스터 암호라고 하는 무작위 바이트 문자열을 전송한다. 예비 마스터 암호는 SSL 인증서를 통해 전달받은 공개키로 암호화되어있어 서버가 개인키로만 해독할 수 있다.

  • Server의 Client 예비 마스터 암호 해독
    서버는 개인키로 클라이언트에서 보낸 마스터 암호를 해독한다.

  • 세션 키 생성
    클라이언트와 서버가 모두 클라이언트 랜덤 문자열(Client Hello에서 보낸 데이터), 서버 랜덤 문자열(Server Hello에서 보낸 데이터), 예비 마스터 암호를 이용해 세션 키를 생성한다.

  • 클라이언트 준비 완료
    클라이언트가 세션 키로 암호화된 "완료" 메시지를 전송한다. (상호 키 검증)

  • 서버 준비 완료
    서버가 세션 키로 암호화된 "완료" 메시지를 전송한다. (상호 키 검증)

  • SSL 핸드셰이크가 완료되었고, HTTP 통신 시작
    클라이언트와 서버는 세션 키를 사용해 HTTP 통신을 암호화, 복호화하여 데이터를 주고받는다. HTTP 통신이 끝나면 세션 키를 폐기한다.


SSL 인증 과정에는 공개키 방식과 대칭키 방식이 모두 사용된다. SSL 핸드셰이크 단계까지는 공개키 방식을 사용하고, HTTPS 통신에서는 생성된 세션키를 공유해 대칭키 방식을 사용한다.

reference

profile
어제보다 나은 오늘을 만드는 중
post-custom-banner

0개의 댓글