본문 바로가기

OS/Security

[Security]서버-클라이언트 상호인증(SSL/TLS)

상호 인증

SSL/TLS 세션의 서버와 클라이언트가 모두 인증되는 상호 인증도 가능하며 경우에 따라 매우 유용할 수 있습니다. 상호 인증에서는 핸드셰이크 중에 서버가 인증되면 클라이언트에 인증서 요청 메시지를 보냅니다. 클라이언트는 인증을 위해 서버에 인증서를 보내 응답합니다.

  • 서버와 클라이언트 세션 마다 고유한 암호키를 공유하는 DES나 RC4와 같은 대칭키 암호화 알고리즘으로 보안을 제공
    • 암호키: SSL Handshake Protocol로 결정 (아래에서 설명)
  • 서버와 클라이언트는 상호 인증이 이루어진다.
    • RSA와 같은 공개키 암호 알고리즘, DSS와 같은 전자서명 알고리즘, X.509 공개키 인증서가 사용된다.
  • 메시지 인증 코드를 이용하여 메시지의 무결성 보장

클라이언트 인증

클라이언트 인증서는 Wi-Fi, VPN 및 웹 응용 프로그램과 같은 회사 리소스에 액세스하기 위한 인증 요소로 사용할 수 있습니다.

기존 사용자 이름 / 암호 자격 증명 대신 (또는 추가로) 사용하면 몇 가지 보안 이점을 제공합니다.

배경 지식

공개 키 암호: 사전 마스터 비밀을 암호화

일방향 해시 함수: 의사 난수 생성기를 구성

디지털 서명: 서버나 클라이언트의 인증서를 검증

SSH Handshake Protocol

  1. Client Hello
    1. 자신이 사용할 SSL의 버전 정보, Cipher suite list(대칭키 + 공개키 + 해쉬함수), 클라이언트 난수를 생성하여 전달
  2. ServerHello
    1. 암호화 방법을 선택하고 서버 난수를 생성하여 클라이언트에게 전송
  3. Certificate → 여기까지가 단방향 인증(서버 인증)
    1. CA의 공개키로 이 인증서를 해독하여 서버의 공개키를 획득
    2. 클라이언트는 클라이언트 난수, 서버 난수를 각각 사용해 PMS(Pre Master Secret, 일종의 난수) 값을 생성
    3. PMS를 서버의 공개키로 암호화해서 서버에게 보내면 서버는 개인키를 사용해 해당 암호문을 복호화한다.
    4. 암호문의 복호화가 정상적으로 이루어지면 서버는 클라이언트를 인증할 수 있다.
  4. CertificateRequest
    1. 클라이언트에게 인증서를 요구한다.
  5. Certificate
    1. 클라이언트 인증서의 개인키로 암호화하고 클라이언트 인증서 공개키를 사용해서 확인한다.
    2. Certificate Verify
      • 클라이언트의 인증서를 서버가 쉽게 확인할 수 있도록 전자서명하여 보낸다.
      • 해당 메시지를 통해서 서버는 클라이언트 인증서의 공개키가 유효한지 확인한 후 클라이언트 인증을 마친다.
    3. Client Key Exchange
      • PMS, 대칭 암호화키, 메시지 인증코드 생성에 사용되는 46바이트의 난수, 서버의 공개키로 만든 암호 등이 포함
      • PMS, Client 난수, Server 난수 이 세 값을 이용해 암호화키와 메시지 인증 코드용 공유키 생성
    4. Change Cipher Spec
      • 이후에 전송되는 모든 메세지는 서버와 협상된 알고리즘과 키를 이용해 암호화 시키겠다고 서버에 알림
  6. Finished
    1. 클라이언트와 서버간의 SSL Handshake 종료

https://www.ssl.com/ko/블로그/상호-TLS로-사용자-및-IoT-장치-인증/
https://zetawiki.com/wiki/Openssl_CA/서버/클라이언트_인증서_생성
https://babbab2.tistory.com/5
https://itsaessak.tistory.com/168
https://m.blog.naver.com/xcripts/70122755291

'OS > Security' 카테고리의 다른 글

[Security]OS 로그인 시도 로그 정리 - CentOS, Windows  (0) 2022.09.25