티스토리 뷰

Web/정리글

HTTPS, TLS 정리

구름뭉치 2021. 10. 19. 11:33

HTTP

Hypter Text Transfer Protocol

  • Hyper Text : 대표적으로 html이 있다.
  • 클라이언트와 서버 사이에서 이뤄지는 요청/응답 프로토콜이다.

HTTPS

Hyper Text Transfer Over Sercure Socker Layer

  • SSL/TLS 상에서 동작하는 HTTP이다.

TLS (SSL)

Transport Layer Security

  • 초기 발명되었을 때 이름이 SSL이었고, 이후 표준화 기구 IETF로 이관되면서 TLS라는 이름으로 변경되었다. 즉, 동일한 프로토콜을 지칭한다.
  • TLS는 SSL 3.0을 계승한다.
  • Application Layer와 Transport Layer 중간에서 역활을 수행한다. 응용 프로그램이 전달한 데이터를 암호화해서 TCP에 전달하거나, TCP에서 전달받은 데이터를 복호화해서 응용 프로그램에 전달한다.
    -> 응용 프로그램 <-> ( TLS 암호화/복호화 ) <-> 전송 계층 <-> 네트워크 계층 ...

암호화

대칭키 방식

어떤 파일을 암호화 하고 복호화 하는데 KEY를 사용한다. 이때 파일을 암호화하기 위해 사용한 KEY와 파일을 복호화 하기 위해 사용하는 KEY가 같다면 이를 대칭키 방식이라고 한다.

 

단점 : 서로의 키가 동일하므로 키를 전달하는 과정에서 키가 유출될 경우 암호화된 파일의 보안이 뚫린다는 단점이 존재한다.

공개키 방식

키를 두개 가진다는 특징이 있다. A키와 B키가 존재할 때 A키로 암호화를 했다면 B키로만 복호화가 가능하고, B키로 암호화를 했다면 A키로만 복호화가 가능한 방식이다.

 

이때 하나를 비공개 키 (private Key), 나머지를 공개 키 (public Key)라고 지정한다. 비공개키는 자신만이 가지는 키이고, 공개키는 타인에게 제공하는 키이다.

 

이렇게 암호화를 하는 키와 복호화를 하는 키를 별도로 둠으로서 키를 전달하는 과정에서 유출이되어도 보안에는 전혀 영향이 없는 암호화 기법이 탄생되었다.

 

예를들어보자. 공원에 공개열쇠가 뿌려져있고 열려져있는 자물쇠가 있다. 거기에 돈을 넣고 공개열쇠 아무거나 집어서 잠글 수 있다. 하지만 해당 자물쇠를 열기위해서는 누군가의 호주머니에 있는 비밀열쇠로만 열 수 있다는 것이다. 해당 사람만 그 열쇠로 열 수 있고 잠금은 누구든지 공개열쇠로 잠글 수 있는 개념이다.

 

공개키 방식 인증
  1. 비밀키를 가지고 있는 사람이 자신의 정보를 암호화 한다.
  2. 공개키를 가지고 있는 상대에게 자신의 정보를 전달한다. 참고, 공개키는 누구에게나 공개된 키이다.
  3. 공개키를 가지고 있는 사람이 복호화에 성공했다면? -> 이것은 비밀키를 가지고 있는 사람이 전송했다는 것을 틀림없이 보증할 수 있다는 의미이다.

즉, 비밀열쇠로 자물쇠를 잠그고 공개열쇠로 자물쇠를 푸는데 성공했다면 해당 자물쇠는 비밀열쇠로 잠근 자물쇠라는것을 보증할 수 있는 것이다.

 

공개키 방식 테스트

1) openssl 비밀키를 rsa방식으로 생성한다. 해당 비밀키의 길이는 1024bit, 키 이름은 private.pem

 openssl genrsa -out private.pem 1024;

length가 1024bit인 private KEY를 생성

2) openssl을 rsa 방식으로 private.pem(비밀키)에 대한 키로 public.pem (공개키)를 생성한다.

openssl rsa -in private.pem -out public.pem -outform PEM -pubout;

3) 암호화할 파일을 생성 & 해당파일을 public KEY를 이용해서 암호화한다.

// file.txt 생성
echo "hello i\'am woonsik, this is security docs" > file.txt

// file.txt를 공개키를 이용해서 암호화한다. 암호화 한 파일을 file.ssl로 생성한다.
openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out file.ssl;

암호화된 본문

4) public key로 암호화한 파일을 개인이 소유한 private key로 복호화한다.

openssl rsautl -decrypt -inkey private.pem -in file.ssl -out decrypted.txt;

복호화한 본문


TLS (SSL)

ssl 인증서

ssl 인증서는 클라이언트와 서버간의 통신을 제 3자가 보증해주는 전자화된 문서이다. 클라이언트가 서버에 접속한 직후에 서버는 클라이언트에 인증서 정보를 전달한다. 브라우저는 해당 인증서 정보가 신뢰할 수 있는 것인지 검증을 하게된다. 브라우저는 인증서를 발급한 CA가 자신이 가지고 있는 CA의 리스트에 있는지 확인한다. 해당 리스트에 포함된다면 해당 CA의 공개키로 인증서를 복호화하고 성공하면 이는 서버가 제공한 인증서가 신뢰할 수 있는 인증서임을 의미한다.

 

인증서를 사용하면 다음과 같은 이점이 있다.

  • 통신내용이 공격자에게 노출되는 것을 막을 수 있다. (by 암호화)
  • 접속하려는 서버가 신뢰할 수 있는 서버인지 판단할 수 있다.
  • 통신 내용의 악의적인 변경을 방지할 수 있다.

동작방법

암호화된 데이터를 전송하기 위해 공개키, 대칭키를 혼합하여 사용한다.

  • 실제 데이터 : 대칭키 방식으로 암호화 (공개키 방식보다 컴퓨팅 파워를 덜 소모한다. 따라서 더 빠름)
  • 대칭키의 키 : 공개키 방식으로 암호화 (대칭키 암호화를 풀기위한 키의 암호화)

서버, 클라이언트 간 통신 시 단계

  • Handshake(악수) -> 세션(실제 전송 부분) -> 세션 종료

Handshake(악수)

서버와 클라이언트가 통신하기 전에 상대를 파악하기 위해 하는 작업을 말한다.

 

SSH 방식을 이용해서 통신을 하는 브라우저와 서버 역시 핸드쉐이크를 하면서 정보교환을 하게 된다.

  1. 서버의 SSH 인증서를 클라이언트에게 전송한다.
  2. 클라이언트/서버가 처리할 수 있는 암호화 기법을 서로 알려준다.
클라이언트와 서버의 핸드쉐이크 통신 과정
  1. (Client Hello) 클라이언트가 서버에 접속한다.
    • 클라이언트 측에서 생성한 랜덤 데이터를 전송한다.
    • 클라이언트가 지원하는 암호화 방식을 서버에 전달한다.
  2. (Server Hello) 서버는 Client Hello에 대한 응답으로 Server Hello를 한다.
    • 서버 측에서 생성한 랜덤 데이터를 전송한다.
    • 서버가 선택한 암호화 방식(자신이 처리할 수 있으면서 가장 안전한 암호화 기법을 고른다)을 전송한다.
    • 암호화 기법에 대한 협상을 하고 종료되면 해당 암호화 방식으로 정보를 교환한다.
    • 클라이언트에게 인증서를 전달한다.
  3. 클라이언는 서버의 인증서를 검증한다.
    • 클라이언트는 서버가 전달한 인증서가 CA에 의해 발급된 것인지를 확인하기 위해 클라이언트에 내장된 CA 리스트를 확인한다.
    • 리스트에 있다면 -> 공개키를 가지고 있다는 것 -> 공개키로 해당 인증서를 복호화한다 -> 복호화 성공 시 해당 인증서는 CA에 보증된 사이트의 인증서인 것 -> 서버를 신뢰할 수 있다.
    • 클라이언트가 공개키로 인증서를 해독 -> 인증서 내부에는 서버의 공개키가 존재 -> 서버는 해당 공개키에 대한 비밀키를 갖고 있다.
  4. 클라이언트가 주고받은 랜덤 데이터를 가지고 pre master key를 생성한다.
    • pre master KEY를 이용해서 클라이언트-서버가 주고받을 데이터를 암호화 한다.
    • 이 키는 클라이언트-서버가 대칭키로 사용하는 KEY이므로 절대 노출되어서는 안된다. 따라서 클라이언트는 KEY를 암호화하기 위해 서버의 인증서를 복호화해서 얻은 서버의 공개키를 사용한다. 서버의 공개키를 이용해서 pre master key를 암호화해서 서버에 전송한다. 전송 중 노출되어도 비밀키는 서버만 갖고있으므로 안전하다. 서버에 pre master key를 비밀키로 복호화해서 pre master key를 갖게된다. 이렇게 클라이언트-서버는 대칭키를 안전하게 들고 있을수 있게 되었다.
  5. 서로 대칭키를 통해 데이터를 주고 받고 핸드쉐이크 단계의 종료를 알린다.
핸드쉐이크 정리

1) 서버가 클라이언트에 인증서를 전달한다. -> 비밀키로 암호화된 인증서를 클라이언트는 공개키로 푼다. -> 보증된 인증서에서 공개키를 획득한다.

2) 클라이언트가 서버에 랜덤데이터를 전달한다. -> 서버도 클라이언트에 랜덤데이터를 전달한다. (인증서도 전달한다) -> 클라이언트가 인증서에서 얻은 공개키로 랜덤데이터를 합쳐서 만든 pre master key를 암호화하고, 이를 서버에 보낸다. -> 서버는 pre master key를 비밀키로 복호화하여 pre master key를 얻는다. -> 서버-클라이언트가 대칭키를 갖게되었다. -> 이것으로 데이터 통신시 암호화/복호화에 사용한다.

반응형

'Web > 정리글' 카테고리의 다른 글

자바 웹 역사 정리  (0) 2021.12.21
멀티 쓰레드 정리  (0) 2021.12.20
DB 트랜잭션 정리  (0) 2021.10.04
Exception & Transaction rollback 정리  (0) 2021.09.23
WAS와 웹서버 차이 정리  (0) 2021.09.10
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday