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)로 지정한다.
- 비공개 키는 자신만 갖고 있고 공개키를 타인에게 제공한다.
동작 방식
- 공개키를 제공 받은 타인은 공개키를 이용해서 정보를 암호화 한다.
- 암호화한 정보를 비공개 키를 갖고 있는 사람에게 전송한다.
- 비공개 키를 갖고 있는 사람은 이 키를 이용해서 암호화된 정보를 복호화 한다.
- 이 과정에서 공개키가 유출 돼도 비공개 키를 모르면 복호화를 할 수 없기 떄문에 안전하다.
응용 방식
- 비공개 키 소유자 비공개 키로 정보 암호화 후 공개키와 함께 암호화된 정보 전송
- 암호화된 정보와 공개키를 받은 사람은 공개키를 이용해서 암호화된 정보를 복호화 한다.
- 이 과정에서 공개키 유출 위험이 있는데 비공개 키를 이용해서 암호화를 하는 이유는 데이터를 보호하는 목적이 아니기 때문이다.
- 암호화된 데이터를 공개키를 가지고 복호화를 할 수 있다는 것은 그 데이터가 공개키와 쌍을 이루는 비공개 키에 의해서 암호화 되었다는 것을 의미한다.
- 즉 공개키 데이터를 제공한 사람의 신원을 보장해주게 된다. 이러한 것을 전자 서명 이라고 부른다.
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 인증서
핵심
- 클라이언트가 접속한 서버가 신뢰 할 수 있는 서버임을 보장
- 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