[개념 정리/네트워크] HTTPS와 TLS - 핸드 셰이크
SSL(Secure Socket Layer)은 SSL 1.0부터 시작하여, SSL 2.0, SSL 3.0 으로 버전이 올라가다,
TLS(Transport Layer Security Protocol)1.0 으로 명칭을 변경한 후, TLS 1.3 버전까지 업데이트 되었다.
아래 내용은 TLS 1.3을 기반으로 한다.
TLS는 전송 계층에서 보안을 제공하는 프로토콜이다.
클라이언트와 서버가 통신할 때,
TLS를 통해 제3자가 메시지를 도청하거나 변조하지 못하도록 한다.
TLS 핸드셰이크
TLS 핸드셰이크 과정을 차근 차근 살펴보자.
크게 보자면 사용할 TLS 버전을 정한 후,
사이퍼슈트, 서버의 공개 키, SSL 인증서를 기반으로
인증 작업을 수행한다.
이후, 대칭 암호화를 위해 세션 키를 생성한다.
1. Client: Hello
클라이언트는 TLS 버전, 사이퍼슈트, 클라이언트 랜덤 값(무작위 문자열), 임시 DH 매개변수를 서버에 보낸다.
2. Server: Hello, Ecrypted Extensions, Certificate, Certificate Verify
서버는 클라이언트로부터 받은 옵션을 확인한다.
서버와 클라이언트에서 지원하는 옵션 중 가장 높은 버전의 TLS로 결정하며,
사이퍼슈트의 지원 여부를 확인한다.
서버에서는 공개 키가 포함된 SSL 인증서, 서버 랜덤 값, 임시 DH 매개변수를 보낸다.
클라이언트와 서버가 서로 교환한 DH 매개변수를 사용하여 임시 암호 키인 세션 키를 생성한다.
3. Finished
클라이언트와 서버가 세션 키를 기반으로 한 대칭 암호화 통신이 시작된다.
보안 세션이 시작되었다고도 말한다.
키 교환 알고리즘으로는 대표적으로 RSA와 DH가 있는데,
RSA는 DH보다 간단하며, 보안적으로 취약점이 있어 TLS 1.3에서는 공식적으로 지원하지 않는다.
DH는 타원곡선 DH를 사용한다.
DH 매개변수
DH(Diffie-Hellman) 알고리즘은 아래의 과정을 거쳐 공통의 암호키를 만드는 알고리즘이다.
- 공개 값 공유
- 각자의 비밀 값과 공개 값 혼합
- 혼합된 값 공유
- 서로 혼합 값에 각자의 비밀 값 혼합
- 공통의 암호 키 완성
DH는 기본적인 버전의 DHE와, 타원 곡선 암호화 방법과 DH를 혼합한 ECDHE가 있다.
일반적으로 ECDHE를 사용한다.
타원 곡선 암호화 방법이란 곡선을 사용하여 개인 키 보유자만 알 수 있는 타원 곡선을 그리고,
이를 기반으로 교차점을 생성하여,
교차점의 개수를 기반으로 암호를 설정하는 방식이다.
사이퍼슈트
사이퍼슈트는 프로토콜, AEAD 사이퍼 모드, 해싱 알고리즘이 나열된 규약을 말하며,
암호 제품군이라고도 불린다.
TLS 1.3 버전에는 아래의 다섯 개가 있다.
- TLS_AES_128_GCM_SHA256
- TLS_CHACHA20_POLY1305_SHA256
- TLS_AES_128_CCM_8_SHA256
- TLS_AES_128_CCM_SHA256
- TLS_AES_256_GCM_SHA384
예를 들어, TLS_AES_128_CCM_SHA256에는 세 가지 규약을 뜻한다.
- 프로토콜: TLS
- AEAD 사이퍼 모드: AES_128_GCM
- 해싱 알고리즘: SHA256
AEAD 사이퍼 모드
AEAD(Authenticated Encryption with Associated Data)는 데이터 암호화 알고리즘이며, AES_128_GCM 등이 있다.
예컨대, AES_128_GCM이란, 128비트의 키를 사용하는 표준 블록 암호화 기술과,
병렬 계산에 용이한 GCM 암호화 알고리즘이 결합된 알고리즘을 뜻한다.
해싱 알고리즘
해싱 알고리즘은 데이터를 추정하기 힘들도록,
더 작고, 더 섞인 조각으로 만드는 알고리즘이다.
SSL/TLS 해싱 알고리즘으로 SHA-256 알고리즘과 SHA-384 알고리즘을 사용하고,
그 중 SHA-256 알고리즘을 많이 사용한다.
SHA-256 알고리즘은 해시 함수의 결과값이 256비트인 알고리즘으로,
비트코인을 비롯한 많은 블록체인 시스템에서 사용한다.
TLS에서 해싱 알고리즘의 사용 방식
TLS 절차 중 인증서가 올바른 인증서인지 확인할 때 전자 서명이 이용되는데,
이 과정에서 해싱 알고리즘이 사용된다.
- 인증 생성 작업: 전자 서명을 만드는데 서명되는 메시지를 해싱한다.
- 인증 확인 작업: 메시지를 복호화해서 해시를 서로 비교해 올바른 메시지인지 확인한다.
전자 서명
전자 서명이란 송신자가 자신의 신원을 증명하는 절차 또는 정보를 말한다.
전자 서명을 통해 인증서에 적힌 주체가 서비스 제공자인지 확인하고,
인증서에 기록된 전자 서명을 기반으로 CA의 공개키로 복호화하여 지문을 얻고,
인증서에 기록된 정보들을 해시 함수에 입력하여 해시를 얻어내, 두 해시의 일치 여부를 확인한다.
두 지문이 일치한다면 인증서가 변조된 적 없음을 의미한다.
이러한 방식으로 인증서의 유효성을 검증한다.
인증서가 변조되지 않았고, 인증서가 서비스 제공자의 것인지 확인하는 절차다.
인증서
인증서는 단순한 데이터 파일로, 아래 두 가지를 포함한다.
- 주체 (인증서 발급 CA, 도메인, 웹사이트 소유자, 인증서 소유자)
- 공개 키 (공개 키와 공개 키 암호화 방법)
자신의 웹사이트 안에서 SSL 인증서를 만들 수도 있지만,
보통은 인증 기관인 CA에서 발급한 SSL 인증서를 기반으로 인증 작업을 수행한다.
주체는 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지 확인할 때 쓰이고,
공개 키는 처음 인증 작업을 수행할 때 쓰인다.
CA
인증서는 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지 보장하는 역할이다.
인증서를 발급하는 기업들을 CA(Certificate Authority)라고 한다.
참고로 서비스의 도메인, 공개 키와 같은 정보는
서비스가 CA로부터 인증서를 구입할 때 제출해야 한다.
인증서에는 아래와 같이 다양한 유형이 있다.
- 단일 도메인: 단 하나의 도메인에 적용되는 인증서
- 와일드카드: 도메인의 하위 도메인도 포함하는 인증서
- 멀티 도메인: 서로 관련이 없는 다수의 도메인에 적용될 수 있는 인증서
RSA의 취약점
RSA의 경우, 클라이언트가 생성한 임시 암호값을 서버로 전송하지만,
DH의 경우, 클라이언트와 서버가 서로 교환한 DH 매개변수를 사용하여 개인 키를 만든다.
RSA는 클라이언트가 생성한 임시 암호값이 탈취 당하는 경우 해킹의 위험이 있다.
그러나 DH의 경우 탈취 당하더라도, 공통의 암호키를 만들 수 없기에 더 강력하게 보안된다.
0-RTT
세션 키가 생성된 이후 다시 그 사이트에 방문 한다면,
미리 만들어 둔 세션 키(PSK, pre-shared key)를 기반으로 연결을 생성하기 때문에
인증에 드는 비용이 없다.
즉, 인증에 관한 RTT가 발생하지 않기 때문에 0-RTT라는 특징을 갖는다.
*참고로, 더 안전한 비대칭 암호화를 부분적으로 수행하는 이유는
비대칭 암호화의 연산 cost가 더 높기 때문이다.
참고: inflearn 강의 'CS 지식의 정석 - 큰돌'