[SSL] HTTPS와 SSL 인증서

hyozkim·2020년 12월 27일
0

SSL 인증서의 내용

SSL 인증서에는 다음과 같은 정보가 포함되어 있다.

  1. 서비스 정보 (인증서를 발급한 CA, 서비스의 도메인 등)

  2. 서버측 공개키 (공개키의 내용, 공개키의 암호화 방법)

CA를 브라우저는 알고 있다.

클라이언트가 접속한 서버가 신뢰할 수 있는 서버임을 보장

  1. 웹 브라우저가 서버에 접속할 때 서버는 먼저 인증서를 제공한다.

  2. 브라우저는 이 인증서를 발급한 CA가 자신이 내장한 CA의 리스트에 있는지를 확인한다.

  3. 확인 결과 서버를 통해서 다운 받은 인증서가 내장된 CA 리스트에 포함되어 있다면 해당 CA의 공개키를 이용해서 인증서를 복호화한다.

  4. CA의 공개키를 이용해서 인증서를 복호화 할 수 있다는 것은 이 인증서가 CA의 비공개키에 의해서 암호화 된 것을 의미한다.

  5. CA에 의해서 발급된 인증서라는 것은 접속한 사이트가 CA에 의해서 검토되었다는 것을 의미한다.

  6. 이것이 CA와 브라우저가 특정 서버를 인증하는 과정이다.

신뢰할 수 있는 사이트라는 것을 CA 인증서를 통해서 확인할 수 있다.

SSL의 동작방법

클라이언트가 서버로 데이터를 전송할때는 서버가 제공한 공개키로 암호화.
서버는 그것을 받아서 자신이 가지고 있는 비밀키로 복호화.

공개키 : 성능상 단점
공개키, 대칭키 혼합하여 사용.

  • 실제 데이터 : 대칭키
  • 대칭키의 키 : 공개키

악수 -> 전송 -> 세션종료

1. 악수(Handshake)

사람과 사람이 소통을 할 때를 생각해보자. 우선 인사를 한다. 인사를 통해서 상대의 기분과 상황을 상호탐색을 하는 것이다. 이 과정이 잘되야 소통이 원활해진다. 클라이언트와 서버 사이도 마찬가지다. 실제 데이터를 주고받기 전에 클라이언트와 서버는 일종의 인사인 Handshake를 한다.

SSL 방식을 이용해서 통신을 하는 브라우저와 서버 역시 Handshake를 하는데, 이 때 SSL 인증서를 주고 받는다.

공개키는 이상적인 통신 방법이다. 암호화와 복호화를 할 때 사용하는 키가 서로 다르기 때문에 메시지를 전송하는 쪽이 공개키로 데이터를 암호화하고, 수신 받는 쪽이 비공개키로 데이터를 복호화하면 되기 때문이다.

그런데 SSL에서는 이 방식을 사용하지 않는다.

왜냐하면 공개키 방식의 암호화는 매우 많은 컴퓨터

  1. 클라이언트가 서버에 접속한다. Client Hello

    • 클라이언트가 지원하는 암호화 방식들
    • 세션 아이디 : 이미 SSL 핸드쉐이킹을 했다면 비용과 시간을 절약하기 위해서 기존의 세션을 재활용하게 되는데 이 때 사용할 연결에 대한 식별자를 서버 측으로 전송한다.
  2. 서버는 Client Hello에 대한 응답을 하게 된다. Server Hello

    • 서버가 선택한 클라이언트의 암호화 방식
    • 인증서
  3. 클라이언트는 서버의 인증서가 CA에 의해서 발급된 것인지를 확인하기 위해서 클라이언트에 내장된 CA 리스트를 확인한다. 인증서가 CA에 의해서 발급된 것인지를 확인하기 위해서 클라이언트에 내장된 CA의 공개키를 이용해서 인증서를 복호화한다. 복호화에 성공했다면 인증서는 CA의 개인키로 암호화된 문서임을 암시적으로 보증된 것이다. 인증서를 전송한 서버를 믿을 수 있게 된 것이다.

서버의 랜덤 데이터클라이언트가 생성한 랜덤 데이터를 조합해서 pre master secret라는 키를 생성한다. 이 때 사용할 암호화 기법은 대칭키이기 때문에 pre master secret 값은 제 3자에게 절대로 노출되어서는 안된다.

  1. 서버는 클라이언트가 전송한 pre master secret 값을 자신의 비공개키로 복호화한다. 이로서 서버와 클라이언트가 모두 pre master secret 값을 공유하게 되었다. 그리고 서버와 클라이언트는 모두 일련의 과정을 거쳐서 pre master secret 값을 master secret 값으로 만든다. master secret는 session key를 생성하는데 이 session key 값을 이용해서 서버와 클라이언트는 데이터를 대칭키 방식으로 암호화한 후에 주고 받는다. 이렇게해서 세션키를 클라이언트와 서버가 모두 공유하게 되었다는 점을 기억하자.

  2. 클라이언트와 서버는 핸드쉐이크 단계의 종료를 서로에게 알린다.

2. 세션

세션은 실제로 서버와 클라이언트가 데이터를 주고 받는 단계이다. 이 단계에서 핵심은 정보를 상대방에게 전송하기 전에 session key 값을 이용해서 대칭키 방식으로 암호화 한다는 점이다. 암호화된 정보는 상대방에게 전송될 것이고, 상대방도 세션키 값을 알고 있기 때문에 암호를 복호화 할 수 있다.

왜 이렇게 복잡한 과정을 거칠까요?
공개키를 사용하면 될 것을 굳이 대칭키와 공개키를 조합해서 사용하는 이유는 공개키 방식이 많은 컴퓨터 파워를 사용하기 때문이다. (비용적인 측면)

3. 세션종료

데이터의 전송이 끝나면 SSL 통신이 끝났음을 서로에게 알려준다. 이 때 통신에서 사용한 대칭키와 세션키를 폐기한다.


앞부분까지는 개념 설명이었고, 여기서부터가 진짜!!!

인증서 발급 및 KEY 생성

나의 경우 메일플러그에서 제공된 도메인을 가지고 LetsEncrypt를 따라 SSL 인증서 발급, certbot을 사용하여 key를 만들었다.

  1. Lets Encrypt 인증서 발급 및 Certbot 설치하기

신나게 해보려다가 아래 에러에서 엄청 막혔다.

IMPORTANT NOTES:

  • The following errors were reported by the server:
    Domain: new.lesstif.com
    Type: connection
    Detail: Fetching
    http://new.lesstif.com/.well-known/acme-challenge/NXqaYCws-a46TbVqRqOvLUNWz6LJ3AsMVvTo4RG0e3w:
    Timeout during connect (likely firewall problem)

    To fix these errors, please make sure that your domain name was
    entered correctly and the DNS A/AAAA record(s) for that domain
    contain(s) the right IP address. Additionally, please check that
    your computer has a publicly routable IP address and that no
    firewalls are preventing the server from communicating with the
    client. If you're using the webroot plugin, you should also verify
    that you are serving files from the webroot path you provided.

SSL 적용을 해봤어야 말이지.
구글링 후 겨우 찾은 해답.

DNS TXT Record Let's Encrypt

요약
1. (나의 경우 메일플러그) DNS 세팅하는 페이지로 간다.
2. 아래 명령어로 생성된 TXT Record를 등록한다.

certbot certonly -d {domain.name} --manual --preferred-challenges dns

hostname: _acme-challenge.prod.stockeeper.co.kr
TXT:

  1. 아래 경로에 .pem 이 생성된다.
/etc/letsencrypt/live/{domain.name}/fullchain.pem
/etc/letsencrypt/live/{domain.name}/privkey.pem
  1. root 권한으로 아래 경로로 가서 다음 명령어를 치면 keystore.p12 가 만들어진다.
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name airpageserver -CAfile chain.pem -caname root
  1. Spring Boot SSL 인증서 설정 를 따라 스프링부트에 적용한다.

참고

생활코딩 - HTTPS와 SSL 인증서 을 보고 학습하며 작성하였습니다.

profile
차근차근 develog

0개의 댓글