SSL(Secure Socket Layer)
Intro
안녕하세요. 최혜정 사원입니다.
HTTP VS HTTPS
- HTTP
- Hypertext Transfer Protocol의 약자
- 즉 Hypertext 인 HTML을 전송하기 위한 통신규약을 의미한다.
- 암호화되지 않은 방법으로 데이터를 전송한다. (악의적인 감청, 데이터 변조의 가능성)
- HTTPS
- 보안이 강화된 HTTP
- Hypertext Transfer Protocol Over Secure Socket Layer의 약자
- 모든 HTTP 요청과 응답 데이터는 네트워크로 보내지기 전에 암호화된다.
HTTPS는 SSL 프로토콜 위에서 돌아가는 프로토콜을 의미한다.
SSL과 TLS는 ‘보안 계층’이라는 독립적인 프로토콜 계층을 만들어, 응용 계층과 전송 계층 사이에 속하게 된다.
HTTPS는 SSL 또는 TLS 위에 HTTP 프로토콜을 얹어 보안된 HTTP 통신을 하는 프로토콜이다.
SSL과 TLS는 같은 의미의 단어이다. TLS가 SSL의 후속 버전이지만, SSL이 일반적으로 더 많이 사용되는 용어이다.
SSL(Secure Socket Layer)
SSL이란, 웹 서버와 클라이언트의 통신 암호화 프로토콜이다.
SSL이 적용되지 않은 통신의 경우, 평문이 그대로 전송된다.
만약 제 3자가 어떠한 방식으로든 통신 패킷을 탈취할 경우, 그 내용을 쉽게 확인할 수 있다.
SSL을 적용한다면 이러한 문제를 기술적으로 해결할 수 있다.
요청을 암호화해서 보내므로 통신 패킷이 탈취되도 복호화 키가 없으면 원래 내용을 알 수 없기 때문이다.
SSL의 암호화
암호를 만드는 행위인 암호화를 할 때 사용하는 일종의 비밀번호를 키(key) 라고 한다.
이 키에 따라서 암호화된 결과가 달라지기 때문에 키를 모르면 암호를 푸는 행위인 복호화를 할 수 없다.
대칭키
동일한 키로 암호화와 복호화를 같이 할 수 있는 방식의 암호화 기법을 의미한다.
즉 암호화를 할 때 1234라는 값을 사용했다면 복호화를 할 때 1234라는 값을 입력해야한다.
문제는 암호를 주고받는 사람들 사이에 대칭키를 전달하기가 어렵다는 점이다.
대칭키가 유출되면 키를 획득한 누구나 암호 내용을 복호화할 수 있다.
공개키
A키로 암호화를 하면 B키로 복호화를 할 수 있고, B키로 암호화 하면 A키로 복호화 할 수 있는 방식
두개의 키 중 하나를 비공개키(개인키, 비밀키), 나머지를 공개키
비공개키는 자신만이 가지고 있고, 공개키를 타인에게 제공
공개키가 유출된다고해도 비공개키를 모르면 정보를 복호화할 수 없기 때문에 안전하다.
SSL 인증서
클라이언트와 서버간의 통신을 제3자(CA)가 보증해주는 전자화된 문서
클라이언트가 서버에 접속한 직후에 서버는 클라이언트에게 이 인증서 정보를 전달하게 된다.
도메인에 SSL이 적용되어 HTTPS를 사용할 수 있는 이유
SSL 인증서의 장점
- 통신 내용이 공격자에게 노출되는 것을 막을 수 있다. -> 암호화를 통해서
- 클라이언트가 접속하려는 서버가 신뢰할 수 있는 서버인지를 판단할 수 있다.
- 통신 내용의 악의적인 변경을 방지할 수 있다.
SSL 인증서의 역할
- 클라이언트가 접속한 서버가 신뢰할 수 있는 서버임을 보장한다.
- SSL 통신에 사용할 공개키를 클라이언트에게 제공한다.
인증서는 어떻게 만드는 것인가? -> CA에 의뢰해서 구입
CA(Certificate Authority)
- 디지털 인증서를 제공하는 공인된 기업
- 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지를 보장하는 역할
SSL 인증서의 내용
인증서의 내용은 CA의 비공개 키를 이용해서 암호화 되어 웹브라우저에게 제공된다.
- 서비스의 정보 (인증서를 발급한 CA, 서비스의 도메인 등등)
- 서버 측 공개키
서비스를 제공하는 회사들(SSL을 통해서 암호화된 통신을 제공하려는 서비스)은 자신들의 사이트에 대한 자료와 공개키를 CA에 보내고
CA는 해당 자료들의 검토를 마친 후, 사이트 정보와 공개키를 인증기관의 비공개키로 암호화한다.
이 암호화된 정보가 사이트 인증서이다.
google.com 서비스는 GTS CA 라는 곳을 통해 인증이 되었고 GTS CA 는 Google Trust Services - GobalSign Root 라는 루트 인증 기관에 의해서 인증이 되었다는 것을 나타낸다.
SSL 인증서의 서비스 보증방법
- 웹브라우저가 서버에 접속하면 서버는 제일 먼저 인증서를 제공한다.
- 브라우저는 인증서를 발급한 CA가 자신이 갖고있는 CA 리스트에 있는지 확인한다.
- 리스트에 있다면 해당 CA의 공개키를 이용해서 인증서를 복호화 한다. (CA의 공개키는 브라우저가 가지고 있다)
- 인증서를 복호화 할 수 있다는 것은 이 인증서가 CA의 비공개키에 의해서 암호화 된 것을 의미한다. 즉 데이터를 제공한 사람의 신원을 보장해주게 되는 것이다.
SSL의 동작방법
“악수(Handshake) -> 전송(서버와 클라이언트가 데이터를 주고받음) -> 세션종료”
실제 데이터: 대칭키
대칭키의 키 : 공개키
악수(Handshake)
서로 상대방이 존재하는지, 또 상대방과 데이터를 주고 받기 위해서는 어떤 방법을 사용해야 하는지를 파악한다.
1. ClientHello 요청
클라이언트가 특정 주소에 접근하면, 해당하는 서버에 요청을 보낸다.
- 클라이언트 측에서 생성한 랜덤 데이터
- 클라이언트가 지원하는 암호화 방식들
- 세션 아이디
클라이언트의 주요 정보를 서버에 전송하여, 해당 클라이언트를 식별하고, 어떤 암호화를 사용할 수 있는지 등의 정보를 서버가 인지하도록 한다.
2. ServerHello 응답
서버가 ClientHello 요청을 받으면, 클라이언트에게 일종의 화답을 보낸다.
- 서버 측에서 생성한 랜덤 데이터
- 서버가 선택한 클라이언트의 암호화 방식
- 인증서
인증서 정보와 함께, 서버와의 암호화 통신을 위한 서버 공개키가 전달된다.
서버의 공개키로 데이터를 암호화하면 서버는 이를 받아 개인키로 복호화하여 요청을 분석할 수 있다.
3. 인증서 검토 (SSL 인증서의 서비스 보증방법 참고)
서버가 전달한 인증서가, 실제 해당 서버의 인증서인지, 신뢰할 수 있는 CA에서 발급된 것인지, 실제 해당 CA에서 발급받았는지 등 인증서를 검토한다.
4. Premaster Secret 송수신
클라이언트는 ClientHello, ServerHello에서 송수신한 랜덤 데이터를 조합하여 Premaster Secret을 생성한다.
이를 ServerHello에서 전달받았던 공개키(인증서 안에 들어있다)로 암호화한다. 이 데이터는 서버가 가진 개인키로만 복호화가 가능하다.
즉, 이 데이터는 탈취된다 하더라도 그 내용이 보호된다.
서버는 수신된 데이터를 복호화하여 클라이언트와 동일한 Premaster Secret을 저장할 수 있다.
5. 통신 키 생성
보유한 Premaster Secret을 토대로 Master Secret, Session Key를 생성한다.
이를 통해 클라이언트와 서버가 동일한 키를 보유하게 되므로 자신들끼리의 암호화 통신이 가능하다.
6. 데이터 송수신
필요한 데이터는 저장된 Session Key를 통한 대칭키 암호화 방식으로 암/복호화하여 통신한다.
무료 SSL/TLS 인증서 - Let’s Encrypt
Let’s Encrypt는 사용자에게 무료로 SSL 인증서를 발급해주는 기관이다.
Certbot은 Let’s Encrypt 인증서를 자동으로 발급 및 갱신을 해주는 봇 프로그램
DNS 방식 - 도메인 TXT 레코드를 이용해서 인증서를 발급 받는 방식
$ sudo certbot certonly --manual --preferred-challenges dns -d openstory.tk
- cert.pem: 인증서 파일
- chain.pem: Let’s Encrypt chain 인증서(인증서 발급자 파일)
- fullchain.pem: cert.pem + chain.pem을 하나로 합쳐놓은 파일
- privkey.pem: 인증서의 개인키
Leave a comment