SSL/TLS이란? 그리고 대칭키와 공개키

Matthew Woo·2022년 1월 13일
0

Network

목록 보기
1/1
post-thumbnail

sw정글에서 마지막 프로젝트를 하면서 ec2 서버를 http 로 배포한 뒤 https 로 전환을 하면서 애를 먹었던 기억이 있다.
뭔 인증서를 받으면 된다는데 뭐 은행에서 공인인증서 받듯이 받아서 금방 하면 되겠지, 뒤에 알파벳 s하나 더 붙이면 되겠지라는 생각으로 만만히 봤다가 애를 먹은 기억이난다.

인증서는 뭐고, ssl은 뭐고, nginx나 apache는 또 뭐람..? 일단 뭔지 모르겠으나 프로젝트 진행 상황이 촉박한 상황이라 일단 결과물을 만들어놓고 일단 나중에 알아보자고 넘겼던 사항인데 오늘 좀 알아봐야겠다는 마음으로 찾아보며 정리를 하고자 한다.

인증서, ssl, nginx 에 대한 개념이 전혀 없이 https로 전환하려니 꽤나 시간이 오래 소요되었었다.
블로그나 설치 방법이 나와있는 게시글들을 따라하며 시도했었는데 따라하면서 위 관련 개념들이 전혀 없다보니 고생을 좀 했다. 결국에는 본 영상 을 보고 https로 배포할 수 있었지만 관련 개념들을 좀 공부하고 넘어가야겠다 싶어서 글을 남긴다.


http/ https

http 뒤에 붙은 s는 Ober Secure Socket Layer 의 약자다. http에서 보안 기능을 보완한 것 이다.

What is SSL?

이미지 참고링크

SSL, Secure Sockets Layer 은 암호화 기반의 인터넷 보완 프로토콜이다. TCP transport 위에 위치한 Layer이며
TLS(Transport Layer Security) 암호화의 전신이라고 한다. SSL/TLS를 사용하는 웹사이트의 URL에는 HTTP가 아닌 HTTPS가 붙는다.

SSL 디지털 인증서란?

클라이언트와 서버간의 통신을 제 3자가 보증해주는 전자화된 문서이다. 클라이언트가 서버에 접속하면 서버는 클라이언트에게 이 인증서 정보를 전달한다.

이런 것들은 왜 하는걸까? 좀 더 이해하기 + 쉽게 말해보기

기본적인 원리를 조금 쉽게 생각해보자면, 서버와 클라이언트간에 보안을 갖춘 통신을 위해서는 서로 약속된 암호가 있어야한다. 해당 암호를 사용해서 서로 주고 받는 정보를 암호화하고 복호화하면 될텐데, 그럼 해당 암호를 어떻게 안전하게 주고 받을 수 있을까?
암호를 주고 받는 과정에서 암호가 탈취당하면 사실상 암호화, 복호화 과정이 의미가 없으니 말이다.

이를 위해서 대칭키, 공개키의 개념이 조금 필요하다.

대칭키

대칭키는 동일한 키로 암호화와 복호화를 같이 할 수 있는 방식의 암호화 기법을 의미한다.
직관적이고 간단하다. 서로 정보를 주고 받는 쪽이 같은 키를 갖고 있으면서 이를 암호화, 복호화 할 때마다 사용할 수 있다.

공개키

공개키는 두 개의 키가 존재하는데 A라는 키로 암호화를 하면 B라는 키로만 복호화 할 수 있고, B라는 키로 암호화하면 A라는 키로 복화할 수 있는 방식이다.

두 키 중 하나를 공개키, 다른 하나를 비공개키로 지정하여 비공개키는 나만 갖고 있고, 공개키는 다른 타인들에게 공개한다.

이 공개 키로는 두가지 방식으로 사용할 수 있는다.

  1. 전자서명
    꼭 암호화용도가 아니더라도 공개키를 갖고 있는 클라이언트에게 내가 맞음을 확인시킬 수 있다. 내가 비공개키로 암호화 한 후 data를 보내고, 해당 data가 클라이언트가 갖고 있는 공개키로 복호화가 된다면, 내가 보낸 인증서가 맞다는걸 공개키 특성을 이용하여 확인 할 수 있는 것이다.
    인증서를 확인 할 때도, 인증서가 인증서에서 정식으로 발급한 인증서가 맞는지 확인하기 위해 인증기관에서 인증서를 비공개키로 암호화 해놓고, 인증기관에서 공개한 공개키로 복호화가 된다면, 해당 인증서는 인증기관에서 인증한 인증서임을 확인할 수 있다. 즉 공개키가 데이터를 제공한 사람의 신원을 보장해주는데 이런 것을 전자 서명이라고 한다.

  2. 암호화
    다른 한가지 방식은 대칭키를 클라이언트가 공개키로 암호화해서 주면, 해당 대칭키를 복호화해서 조회할 수 있는 방법은 비공개키를 확인할 수 있는 나만 확인이 가능하다. 따라서 대칭키를 안전하게 서로 주고 받을 수 있다. 공개키로 암호화된 대칭키가 탈취당하더라도 복호화할 수 있는건 비공개키를 갖고 있어야만 복호화가 가능하기 때문이다. 공개키, 비공개키의 원리가 궁금하긴 하지만 우선 마저 얘기하던 주제에 집중해보자.

정리를 하자면, 서로 안전하게 정보를 주고 받기 위한 암호가 필요한데 해당 암호는 노출되지 않도록 공개-비공개 키 방식으로 주고 받게 되며 암호인 대칭키를 주고 받은 이후로는 해당 암호(대칭키)로 안전하게 데이터를 주고 받을 수 있다.


그래서 보안이 뭐 어떻게 좋아지는걸까?

  • Encryption: hides the data being transferred from third parties.
    통신 내용이 공격자에게 노출되는 것을 막을 수 있다. http 는 텍스트로 정보를 주고 받는데 해당 텍스트들을 대칭키로 암호화 했기 때문이다.

  • Authentication: ensures that the parties exchanging information are who they claim to be.
    클라이언트가 접속하려는 서버가 신뢰할 수 잇는 서버인지 판단할 수 있다. 해당 서버로부터 인증서를 받고, 해당 인증서가 신뢰할 수 있는 기관에서 발급한 것인지 확인과정을 거치기 때문이다.

  • Integrity: verifies that the data has not been forged or tampered with.
    통신 내용의 악의적 변경을 막을 수 있다. 이 부분은 악의적으로 변경될 경우 대칭키로 암호화 해놓은 data 값이 변경되었기에 같은 대칭키로 복호화가 안되기 때문이 아닐까 싶다. (아니면 댓글 부탁합니다..!!)


그럼 어떻게 TLS 인증과정이 진행되는건가요?

TLS handshake 라는 과정을 통해 진행되는데 이를 알아보자.

TLS handshake 는 언제 발생할까?

tcp 에서 handshake 과정이 있는데 tcp handshake 과정에서 공개키, 대칭키 방식으로 암호화를 위한 tls handshake 과정이 함께 진행되는건지, 별도로 진행되는건지 궁금했었다. cloudflare 에 따르면,
TCP handshake 과정이 끝나고 서버와 client간 connection이 수립 된 이후에 TLS handshake 를 하게 된다.

TCP handshake 를 할 때 TLS handshake 도 같이 하면 되는거 아닌가? 라는 생각이 들었다. 필자의 추측은, TLS handshake 과정에서 서버가 ssl 인증서를 client 측에 보내고, client가 대칭키 생성을 위한 random 값을 전송하는데 해당 과정에 있어서 온전히 인증서와 대칭키를 위한 data가 reliable 하게 전송되기 위함 인 것 같다.

밀리세컨드 단위의 hadshake 과정이 소요되기에
TLS Handshake 가 완료되기 전에 서버와 클라이언트가 데이터 전송을 시작하는 TLS False Start 혹은 이전에 연결이 수립된 적이 있는 서버와 클라이언트는 간략화된 Handshake를 사용하도록 허용하는 TLS Session Resumption이 있다고 함

tls handshake 과정

  1. 클라이언트의 hello message :
    먼저 클라이언트가 서버에 인사를 건낸다. 인사를 건내면서 클라이언트는 어떤 tls version으로 통신할 수 있는지, 어떠한 암호화 제품을 사용할 수 있는지오 함께 random string 값인 client random 이라는 값을 서버에게 보낸다.
  1. 서버의 hello message:
    서버가 클라이언트의 인사에 응답한다. 클라이언트가 사용가능한 암호화 기법 중 적합한 암호화 방식을 택하고, 인증기관으로 부터 받은 SSL 인증서, 그리고 서버 또한 random 한 string 값인 server random 값, 을 클라이언트에게 보낸다.

  2. 클라이언트는 서버가 보낸 인증서를 확인한다.
    클라이언트 브라우저에서 유명 인증기관과 해당 인증기관에서 제공하는 공개키를 조회할 수 있다. 서버가 보낸 인증서의 인증 기관을 확인하고, 인증기관에서 제공한 공개키로 인증서를 복호화하는데, 해당 공개키로 인증서가 조회가 된다면 그럼 ssl 인증서가 해당 인증기관에서 인증한 인증서가 맞다는 걸 의미한다.
    해당 인증서에는 인증기관, 서버의 owner, 그리고 서버에서 보낸 공개키가 또 있는데,
    해당 공개키로 premaster secret를 암호화 한 다음 이를 서버로 보낸다.

  3. 서버는 비공개키로premaster secret 을 복호화한 다음 그동안 주고 받았던 client random, server random, premaster secret 으로 대칭키를 생성하고 클라이언트도 대칭키를 생성한 다음 서로 메세지를 주고 받을 때 이 대칭키를 이용하여 통신하게 된다.

SSL과 TLS는 뭐가 다른가?

ssl은 tls의 이전 버전이다. ssl은 Netscape에서 개발했는데 이후 IETF라는 곳에서 업데이트를 제안했으나 넷스케이프에서는 더 이상 참여하지 않고 소유권이 변경되면서 이름이 tls로 바뀌었다. 그래서 ssl의 최종버전(3.0) 과 tls 첫 버전은 큰 차이가 없다고 한다. 두 용어를 혼용되어 사용하는 경우가 많아서 tls를 아직 ssl이라 부르기도 하고, ssl의 인지도가 높아서 ssl/tls 암호화라고 부르는 경우도 있다.

ssl은 1996년 이후 업데이트 되지 않았으며 요즘에는 사실상 tls를 사용하고 있지만 아직도 많은 사람들이 ssl 용어를 사용하고 있다.

SL 인증서에는 어떤 유형이 있을까?

  • 단일도메인 : 단 하나의 도메인에 적용되는 인증서
  • 멀티도메인: 과나련되지 않은 다수의 도메인에 적용될 수 있는 인증서
  • 와일드카드: 단 하나의 도메인에 적용되지만 그 하나의 도메인의 하위 도메인도 적용되는 인증서. ex)www.cloudflare.com, blog.cloudflare.com, developers.cloudflare.com

이미지 출처 및 참고자료
cloudflare1
cloudflare2
생활코딩

profile
지속가능하고 안정적인 시스템을 만들고자 합니다.

0개의 댓글