[Infra] HTTPS + SSL

이열음·2022년 8월 9일

우아한 테크코스 프로젝트를 진행하며 SSL 도입을 맡게 되어 개념과 적용 방법을 정리합니다. 이후 Nginx 또한 함께 포스팅할 예정입니다.

HTTPS란?

SSL 프로토콜 위에서 작동하는 HTTP 프로토콜의 보안 버전입니다.
HTTP는 암호화 없이 데이터 전송하여 서버와 클라이언트 통신에 사용되는 메세지 탈취나 변조가 일어날 수 있습니다.
이에 반해 HTTPS는 서버의 키를 통해 암호화하여 전달함으로써 이를 방지합니다.

SSL 인증서란?

클라와 서버간의 통신을 제 3자가 보증해주는 전자문서입니다.
SSL 자체의 기본적인 컨셉이 "서명자를 신뢰할 수 있으면 해당 인증서도 신뢰할 수 있다" 이기에
외부의 신뢰도 있는 서드파티(CA)에서 인증서를 발급받아 서버와 클라이언트를 인증합니다.

인증서 발급은 다음과 같은 방식으로 진행됩니다.

  1. 서버가 공개키와 서버의 정보를 전달합니다.

  2. CA는 해당 정보들을 넣어서 SSL을 발급합니다.

  3. CA의 공개키와 비밀키를 발급한 후 CA비밀키로 인증서를 암호화합니다.

  4. 암호화한 인증서를 서버로 전달합니다.

SSL 동작방식

SSL은 handshake라는 방법을 사용하여 통신합니다.
TCP 기반으로 동작하기 때문에 SYN 패킷과 ACK 패킷을 전송하는 TCP 3-way Handshake를 먼저 거치게 되는데
이는 정확한 송수신을 보장하기 위해서 송신자와 수신자 사이의 세션을 사전에 수립하는 것을 의미합니다.

해당 과정을 거치게 되면 본격적으로 SSL hanshake가 시작됩니다.

SSL Handshake과정은 다음과 같습니다.

  1. 클라이언트 측에서 cipher suit, sessionId, sessionId를 담아 Hello 요청을 보냅니다.
    cipher suit에는 해당 요청에서 사용할 암호화 방식 목록과 프로토콜 목록들이 담겨있습니다.

  2. 서버측에서는 클라이언트에서 보내준 ciper suit내용중 한가지를 선택한 내용과 인증서를 담아 Hello요청을 보냅니다.
    인증서 내에는 서버의 public key와 암호화 알고리즘 방식이 포함되어 있습니다.

  3. 서버측 Hello 가 끝났다는 Done 요청을 보냅니다.

  4. 클라이언트에서는 가지고 있는 CA리스트에서 CA가 발급한 인증서의 공개키를 얻습니다.(만일 리스트에 해당 CA가 없다면 외부 인터넷에서 다운받아옵니다.)

  5. 클라이언트에서 서명자인 CA를 검증하고 인증서를 복호화하여 서버의 public key를 얻습니다.

  6. 클라이언트에서 private key를 생성한 뒤 서버의 public key로 암호화하여 서버로 보냅니다.

  7. 서버는 자신의 private key로 public key로 된 암호를 풀어 내부의 클라이언트 private key를 얻습니다.

  8. private key를 이용하여 통신을 하겠다는 change ciper spec 신호를 보냅니다.

발급받은 SSL 인증서를 Springboot 에 적용하기

저희는 CertBot으로 인증서를 받아서 적용하게 되었는데요. 인증서를 받게되면 다음과 같은 메세지가 나옵니다.

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/ 도메인명/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/도메인명/privkey.pem

보시면 pem 키가 발급된걸 보실 수 있습니다. 근데 스프링 부트에서는 p12라는 확장자를 사용합니다..!
그때는 pem 파일이 위치한 경로에서 해당 명령어를 입력하면 pem키가 p12파일로 변환됩니다.

openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem
-out 키이름.p12 -name tomcat -CAfile chain.pem -caname root

프로젝트 resource 디렉토리에 해당 파일을 넣어주고 yml에 해당 설정을 추가해주면 서버내 설정은 완료됩니다☺️

server:
  ssl:
    key-store: classpath:생성한 키 이름.p12
    key-store-type: PKCS12
    key-store-password: 키 만들때 넣었던 비밀번호

https://nuritech.tistory.com/25

0개의 댓글