SSL(TSL)

SSL(TSL)

SSL(Secure Socket Layer) - 웹 통신 보안을 위해 최초로 만들어짐.

TSL(Transport Layer Security) - 현재 사용되는 정식명칭은 TSL 이다.

SSL TSL 같은 의미 TSL 1.0은 SSL3.0을 계승한다.

서버와 클라이언트 간 암호화 통신을 지원한다.

SSL 핵심은 암호화

SSL은 보안과 성능상의 이유로 두가지 암호화 기법 혼용함

  • 대칭키
  • 공개키

SSL 동작 방법 이해를 위해서는 이 두가지 암호화 기법 이해 필요(이해없으면 동작방식이 추상적으로 느껴짐)


대칭키

  • 암호화 한 빌밀번호를 Key라고 한다.
  • 키를 모르면 복호화 불가능 하다.

단점

  • 암호를 주고 받는 사람들 사이에 대칭키 전달 어려움
  • 대칭키 유출시 암호화 내용을 복호화 가능하기때문에 함호화는 무용지물이된다.
  • 이런 단점으로 공개키 방식이 나옴
#openssl 을 이용한 대칭키 방식 암호화 
#test.txt 파일 생성 
echo '파일 내용 작성' > text.txt;

openssl enc -e -des3 -salt -in test.txt -out ssl_text.txt;
  • enc -e -des3 : des3 방식으로 암호화
  • -in 암호화할 파일명 -out 암호화한 파일 저장할 이름
  • 비밀번호 요구시 입력한 비밀번호가 대칭키가 된다.
#복호화
openssl enc -d -des3 -in ssl_text.txt -out dessl_text.txt;
  • end -d 옵션으로 ssl_text.txt 파일 dessl_text.txt 파일로 복호화

공개키

  • 공개키는 두 개의 키를 갖게 된다.
    • A키로 암호화를 하면 B키로 복호화를 할 수 있고, B키로 암호화하면 A키로 복호화 할 수 있는 방식.
    • 두 개의 키 중 하나를 비공개 키(private key) 개인 키, 비밀 키라고 부른다.
    • 나머지 키는 공개키(public key)로 지정한다.
  • 비공개 키는 자신만 갖고 있고 공개키를 타인에게 제공한다.

동작 방식

  1. 공개키를 제공 받은 타인은 공개키를 이용해서 정보를 암호화 한다.
  2. 암호화한 정보를 비공개 키를 갖고 있는 사람에게 전송한다.
  3. 비공개 키를 갖고 있는 사람은 이 키를 이용해서 암호화된 정보를 복호화 한다.
  • 이 과정에서 공개키가 유출 돼도 비공개 키를 모르면 복호화를 할 수 없기 떄문에 안전하다.

응용 방식

  1. 비공개 키 소유자 비공개 키로 정보 암호화 후 공개키와 함께 암호화된 정보 전송
  2. 암호화된 정보와 공개키를 받은 사람은 공개키를 이용해서 암호화된 정보를 복호화 한다.
  • 이 과정에서 공개키 유출 위험이 있는데 비공개 키를 이용해서 암호화를 하는 이유는 데이터를 보호하는 목적이 아니기 때문이다.
  • 암호화된 데이터를 공개키를 가지고 복호화를 할 수 있다는 것은 그 데이터가 공개키와 쌍을 이루는 비공개 키에 의해서 암호화 되었다는 것을 의미한다.
  • 즉 공개키 데이터를 제공한 사람의 신원을 보장해주게 된다. 이러한 것을 전자 서명 이라고 부른다.

RSA 방식 공개키 사용 예제

# private_key.pem 의 이름으로 1024bit 크기의 비공개 키 생성 
openssl genrsa -out private_key.pem 1024;

# rsa 방식으로 private_key.pem 의 비공개 키에 대한 public_key.pem 의 이름으로 공개 키 생성
# 만들어진 공개키를 자신에게 정보를 제공할 사람에게 전송하면 된다.
openssl rsa -in private_key.pem -out public_key.pem -outform PEM -pubout;

# 공개키를 가진사람이 어떤정보를 비공개키를 갖고 있는 사람에게 전송하는 상황 가정

# 암호화 할 파일 생성
echo '암호화 할 내용' > secret_text.txt

# 생성한 파일을 암호화 한 후 비공개키 소유자에게 전송
# 공개키 public_key.pem를 사용해서 secret_text.txt 내용을 RSA방식으로 암호화 한후 ssl_data.ssl로 저장
openssl rsautl -encrypt -inkey public_key.pem -pubin -in secret_text.txt -out ssl_data.ssl;

# 암호화된 ssl_data.ssl을 받은 비공개키 소유자가 암호화하는 과정
# 비공개키 privatre_key.pem 을 이용해서 암호화된 파일인 ssl_data.ssl 을 de_ssl_data.txt 파일로 복호화
openssl rsautl -decrypt -inkey private_key.pem -in ssl_data.ssl -out de_ssl_data.txt

SSL 인증서

핵심

  1. 클라이언트가 접속한 서버가 신뢰 할 수 있는 서버임을 보장
  2. SSL 통신에 사용할 공개키를 클라이언트에게 제공한다.

컴퓨터 네트워크 통신 중 SSL 전달 과정

핸드쉐이크 → 전송 → 세션 종료

📌1. SSL Hendshake

  • SSL 핸드쉐이크는 TCP 연결이 성립된 상태에서 진행된다.
  • CA란?
    • 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지 보장하는 역할을 하는 민간 기업을 CA(Certificate authority) 라고 부른다.
    • CA는 신뢰성이 엄격하게 공인된 기업들만 참여 가능하다.

1. 클라이언트 → 서버(Client Hello) 과정에서 주고 받는 데이터들

랜덤데이터

  • 클라이언트에서 만든 랜덤 데이터를 서버에 전송한다.

암호화 방식

  • 클라이언트에서 지원하는 암호화 방식들 서버에 전송
  • 클라이언트와 서버가 지원하는 암호화 방식이 서로 다를 수 있음으로 어떤 암호화 방식을 사용할 것인지 먼저 정하는 과정

세션아이디

  • SSL 핸드 쉐이킹을 이미 한 상태이면 비용과 시간 절약을 위해 기존 세션을 재활용하는데 이때 사용할 연결에 대한 식별자를 서버에 전달한다.

2. 서버 → 클라이언트 (Server Hello) 과정에서 주고 받는 데이터들

랜덤데이터

  • 서버에서 만든 랜덤 데이터를 클라이언트에 전송한다.

암호화방식

  • 클라이언트가 지원하는 암호화 방식중에서 서버에서 사용가능한 암호화 방식을 선택해 클라이언트에 전송한다.

SSL 인증서

  • 인증서에는 공개키, CA(인증서 발급자) 등이 포함되어 있다.

3. 클라이언트 CA(공인/사설) List check

인증서

  • 서버에세 받은 인증서를 클라이언트에 내장된 CA리스트를 확인한다.
  • CA 리스트에 없다면, 경고 메세지 출력
  • CA 리스트에 있다면, 클라이언트에 내장된 CA 공개키를 이용해 인증서를 복호화를 성공 했다는 것이다. 따라서 인증서를 전송한 서버를 믿을 수 있게 된다.

임시키 (pre master secret) 생성

  • 이전 과정에서 클라이언트와 서버가 주고받은 서버와 클라이언트의 랜덤데이터를 조합해서 pre master secret 키를 생성한다.
  • 핸드 쉐이킹이 끝나고 세션 단계에서 데이터를 주고받을 때 암호화 하기위해서 사용되는 키이다.
  • 임시키는 대칭키 이기때문에 키 값이 노출되서는 절대 안된다.

4. 클라이언트 → 서버(임시키 전달)

pre master secret 값 전달

  • 서버로부터 받은 인증서 안에 서버의 공개키를 이용해 pre master secret 값을 암호화한 후 서버에 전송 한다.
  • 서버는 클라이언트로 부터 받은 pre master secret 값을 비공개키로 복호화 한다.
  • 서버 클라이언트 임시키(pre master sectet)값 공유 완료
  • 서버와 클라이언트는 일련의 과정을 거처서 최종 키(master secret)값으로 만든다.
  • 최종 키는 세션키(대칭키)를 생성하고 세션키 값을 이용해서 대칭키 방식으로 암호화 한 후에 데이터를 주고 받는다.
  • 클라이언트 서버 핸드 쉐이크 종료를 서로에게 알린다.

5. 세션

  • 세션 단계에서는 세션키를 활용한 대칭키 암호화방식 통신

6 세션 종료

  • 세션 종료 ssl통신이 끝났음을 알리고 통신하면서 사용한 대칭 키인 세션키를 폐기한다.

reference

참고

https://coconuts.tistory.com/773

https://it-sunny-333.tistory.com/144

https://wayhome25.github.io/cs/2018/03/11/ssl-https/