봄수의 연구실

핸드 쉐이크 프로토콜 본문

Computer Science/네트워크

핸드 쉐이크 프로토콜

berom 2023. 5. 17. 13:03

핸드 쉐이크 프로토콜

  • 서버와 클라이언트가 상호 인증
  • 암호, MAC 알고리즘, SSL 레코드 안 데이터를 보호하는 데 사용할 암호키 협상
  • 핸드 쉐이크 프로토콜은 클라이언트와 서버가 교환한 ;연속 된 여러 메시지로 구성 된다
    • 각 메시지는 아래 3개의 필드로 구성
    • 길이(Length)(3바이트)
    • 내용(Content)(≥0바이트)
    • 유형(Type)(1바이트)


단계 1. 보안 기능 설정

이 단계는 논리적 연결을 시작하고 이 연결과 연관될 보안 기능을 설정합니다

클라이언트는 아래 매개 변수를 갖는 client_hello_message를 보내는 것으로 교환을 시작한다

  • 버전 : 클라이언트가 수용할 수 있는 가장 높은 SSL 버전
  • 랜덤
    • 클라이언트가 생성한 랜덤값
    • 32-비트 타임스탬프와 안전한 난수 생성기로 생성한 28바이트로 구성된다
    • 이 값은 비표 역할을 하고 재전송 공격을 막기 위해 키 교환 동안 사용
  • 세션 ID : 가변 길이의 세션 식별자
    • 값이 0이 아닌 경우의 목적
      • 클라이언트가 기존 연결의 매개 변수 갱신
      • 기존 세션에서 새 연결 생성을 원한다
    • 값이 0인 경우
      • 클라이언트가 새 세션으로 새 연결을 설정하기 원한다
  • 암호 도구
    • 클라이언트가 지원하는 암호 알고리즘 도구를 포함하는 목록
    • 선호도가 감소하는 순서로 나열한다
    • 목록의 각 요소는 키 교환 알고리즘과 암호 명세를 정의
  • 압축 방법 : 클라이언트가 쓸 수 있는 압축 방법 목록

client_hello_message를 보낸 다음, 클라이언트는 같은 매개 변수를 갖는 server_hello_message를 기다린다

client_hello_message는 다음 규칙이 적용 된다.

  • 버전 필드
    • 클라이언트가 제시한 버전의 가장 낮은 것을 선택
    • 서버가 지원하는 가장 높은 버전을 택해서 버전 필드에 포함 시킴
  • 랜덤 필드 : 클라이언트의 랜덤 필드와 무관하게 생성
    • 클라이언트의 세션 ID 필드가 0이 아니면 서버는 동일한 값을 사용
    • 세션 ID가 0이라면,서버는 새 세션을 가지기 위한 값을 갖는다
  • 암호 도구
    • 클라이언트가 제안한 것들 중에서 서버가 선택한 한 개의 도구를 포함
  • 압축 필드 : 큺라이언트가 제안한 것들 중에서 서버가 선택한 압축 방법 포함

암호화 도구 - 키 교환 방법 지원 사항

단계 2. 서버 인증과 키 교환

서버는 인증이 필요하면 자신의 인증서를 보내는 것으로 단계 2를 ㄹ시작한다.

메시지는 한 개 혹은 연속된 X.509 인증서를 포함한다

인증서 메세지는 익며 Diffie-hellman만 제외하고, 모두 필요로 한다.

아래 상황에서는 server_key_exchange message를 보낼 수있다.

아래 2가지 상황에서는 server_key_exchange message를 사용하지 않는다

서명

일반적으로 서명은 메시지에 해시를 취하고, 송신자의 개인키를 이용하여 그 해시를 암호화해서 새성한다.

hash(ClientHello.random || ServerHello.random) || ServerParams)

그래서 해시는 Diffie-hellman이나 RSA는 무엇인가? 매개 변수뿐만 아니라 초기 hello message에서 얻은 두 개의 비표까지 포함시켜 적용한다.

이것을 통해 재전송 공격과 위장된 개체를 확실히 막을 수 있다.

  • DSS 서명의 경우 해시는 SHA-1 알고리즘을 이용해서 수행한다.
  • RSA는 무엇인가? 서명의 경우 MD5와 SHA-1로 해시를 계산하고, 이 2개의 해시를 이어붙인 것을 서버의 개인키로 암호화 한다

익명이 아닌 서버(익명 Diffie-hellman를 사용하지 않는 서버)는 클라이언트에게 인증서를 요구한다
certificate_request message는 두 매개 변수를 포함하는데, 이 두 매개 변수는 certificate_type과 certificate_authorities이다.

인증서 유형(Certificate_type) : 공개 키 알고리즘과 그 사용 목적을 나타낸다.

결론적으로 2 단계의 마지막 메세지는 Server_done Message이다.
이 메시지는 서버 hello와 연관된 메시지의 끝을 나타내기 위해 서버가 보낸다
이 메시지는 매개 변수는 없다

단계 3. 클라이언트 인증과 키 교환

server_done message를 수신하면, 인증서를 요구했을 때 클라이언트는 서버가 확실한 인증서를 제공했는지 확인해야 한다.

server_hello 매개 변수가 수용할 만한지를 검사한다.
만일 모든 조건이 만족되면, 클라이언트는 메시지를 서버로 되돌려 보낸다.

certificate message

  • 서버가 인증서를 요구했다면, 클라이언트는 certificate message를 보내는 것으로 이 단계를 시작한다.
    no_certificate
  • 만일 적합한 인증서가 없으면, 클라이언트는 대신에 no_certificate 경고를 보낸다

client_key_exchange message
해당 메시지의 유형에 따라 다르다

  • RSA는 무엇인가?
    • 사전 마스터 비밀(pre-master secret)을 생성 후, 서버의 인증서로부터 얻은 공개 키를 이용
    • server_key_exchange message에서 얻은 임시 RSA를 이용해 암호화 한다.
  • 임시 혹은 익명 Diffie-hellman
  • 고정된 Diffie-hellman
    • 클라이언트의 공개 Diffie-hellman 매개 변수는 인증 메시지 안에 보내진다
    • 이 메시지의 내용은 비어있다.

certificate_verify message
마지막으로, 이 단계에서 클라이언트는 자신의 인증서가 정확하다는 것을 확실히 하기 위해 certificate_verify message를 보낼 수 있다

이 메시지를 보내려면 서명 능력이 있는 클라이언트 인증서가 꼭 있어야 한다.

단계 4. 종료

이 단계는 안전한 연결 설정을 완성하는 단계이다.
클라이언트는 exchange_cipher_spec message를 보내고, 계류 상태 암호 명세를 현재 상태 암호 명세에 복사한다.

이 메시지는 핸드쉐이크 프로토콜의 일부로 여겨지지는 않지만, 암호 명세 변경 프로토콜을 사용해서 보낸다
클라이언트는 새 알고리즘, 키 그리고, 비밀하에 finished message를 보낸다. 키 교환과 인증 과정이 성공적으로 이루어졌음을 확인한다.

이 두 메시지에 대한 응답으로 서버는 자신의 change_cipher_spec message를 보내고, 계류 상태를 현재 상태 암호 명세로 전송한다.
그리고 자신의 finishied message를 보낸다.

이 시점에서 핸드쉐이크가 완료되면 클라이언트와 서버는 응용 계층 데이터 교환을 시작할 수 있다

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

728x90

'Computer Science > 네트워크' 카테고리의 다른 글

HTTPS  (0) 2023.05.22
TLS  (0) 2023.05.17
TLS 세션  (0) 2023.05.15
HTTP  (0) 2023.05.13
MIME(Multipurpose Internet Mail Extensions)  (0) 2023.05.13