프로젝트 GORANG 개발 기록

서비스 배포하기: 2. HTTPS SSL 인증서 발급 받기

프린이8549 2024. 8. 5. 14:09

 

본 고에서는 HTTPS, SSL 에 대해 알아본 뒤 AWS EC2 의 도메인에 SSL 인증서를 발급 받는 과정을 소개하고자 합니다.

 

주요 개념

: SSL/TLS, HTTPS, SSL 인증서, Certbot, Nginx

 

 

들어가며

AWS Route53을 통해 EC2 의 DNS 를 구축하는 데 성공했다면, 다음으로는 HTTPS 프토토콜을 사용하여 서비스에 접근할 수 있도록 해야합니다.

 

HTTP 프로토콜을 이용한 DNS 는 암호화되지 않은 데이터들을 주고받음으로써 보안 취약점을 지니기 때문입니다.

 

따라서 더 강력한 보안성을 확보한 HTTPS 프로토콜을 사용해야합니다.

 

 

1. HTTPS 와 SSL

구체적인 발급 과정에 들어가기에 앞서 HTTPS 프로토콜과 SSL, SSL 인증서에 대해서 간략하게 살펴보겠습니다.

 

HTTPS(HTTP Secure)

  • HTTP 프로토콜에 SSL/TLS 암호화를 추가한 프로토콜.
  • HTTPS는 클라이언트와 서버 간 데이터 전송을 암호화하여 도청/변조/위조 방지.

출처: SEMRUSH

 

HTTPS 에 사용된 SSL/ TSL 기술은 아래와 같습니다.

 

SSL(Secure Sockets Layer; 보안 소켓 계층)

  • 넷스케이프에서 개발한, 웹사이트와 브라우저 또는 애플리케이션 간 연결을 암호화하여 데이터를 안전하게 주고 받기 위해 사용하는 보안 기술.
  • 작동 과정
    • 핸드셰이크 과정
      • 클라이언트 - 서버 최초 연결 시 상호 인증 후 암호화 키 교환 과정 진행
    • 인증서 사용
      • 서버가 클라이언트에게 자신이 신뢰할 수 있는 사이트임을 증명하고자 디지털 인증서 제공
      • 발급 주체는 공인 인증 기관(CA)
    • 대칭키 암호화
      • 핸드세이크 이후 클라이언트와 서버가 대칭키 사용해 데이터 암호화
  • TSL(Transport Secure Layer; 전송 보안 계층)
    • SSL 의 보안 취약점을 개선하여 최신 암호화 기법이 사용된 업그레이드 버전
    • 현재 대부분 TLS 사용. 허나 통상 SSL 이라고 칭함.

 

한편, HTTPS 프로토콜을 위해서는 인증 기관(CA)으로부터 SSL 인증서를 받아야 합니다.

 

SSL 인증서(SSL/TLS 인증서)

  • 시스템에서 ID 확인 후 SSL / TSL 프로토콜을 사용해 타 시스템에 대한 암호화된 네트워크 연결을 설정할 수 있도록 하는 디지털 객체.
  • 웹 서버의 신원을 인증하고, 웹 브라우저와 서버 간 암호화된 연결을 설정하는 데 사용.
  • 개인 데이터 보호, 고객 신뢰 강화, 규제 준수 지원, SEO(검색 엔진 최적화) 개선(SSL로 보호되는 웹 사이트가 검색 엔진에서 더 높은 순위 차지) 측면에서 중요.
  • SSL 인증서에는 도메인 이름, 인증 기관, 인증 기관의 디지털 서명, 퍼블릭 키 등등을 내포.

 

이상으로 HTTPS와 SSL 인증서의 작동 원리에 대해서 살펴봤다면

 

지금부터는 본격적으로 SSL 인증서를 발급 받는 과정을 소개하겠습니다.

 

본 과정에서는 Let's Encrypt 라는 무료 인증 기관과 해당 기관의 인증서 발급 도구인 Certbot 을 사용하였습니다.

 

 

2. SSL 인증서 발급(By Certbot)

Prestep. 80번 port 접근 허용하기

Let's Encrypt 가 사용자 서버의 HTTP로 접근해서 소유권을 검증하기 때문에 HTTP 80번 포트에 대한 접근을 허용해야 합니다.

sudo ufw allow 80

 

(추가로 AWS EC2 인스턴스의 보안 그룹 내 인바운드 규칙에서도 80번 포트에 대해 허용해놓아야 합니다)

 

HTTPS 인증 과정은 크게 다음과 같이 진행됩니다.

 

1. Certbot 설치

 

2. SSL 인증서 발급

 

각 단계별 세부 작업들을 알아보겠습니다.

 

2.1. Certbot 설치

 

CertbotLet's Encrypt 에서 인증서를 자동으로 받기 위해 사용하는 도구입니다.

 

이를 위해서는 ubuntuCertbot을 설치해야합니다.

sudo apt update
sudo apt install certbot python3-certbot-nginx

 

python3-certbot-nginx 패키지를 설치함으로써 certbotNginx 의 설정을 자동으로 조절해서 HTTPS 를 활성화합니다.

 

2.2. SSL 인증서 발급

 

Certbot을 통해 우리 도메인에 SSL 인증서를 발급 받아보겠습니다.

sudo certbot --nginx -d www.gorang.store

 

1. 위 명령문에서 -d 인자 뒤에 SSL 인증서를 발급받을 도메인을 입력합니다.

 

2. 명령문 실행 시 약관에 동의 후 기존 HTTP -> HTTPS 로의 리디렉션 실시 여부를 1 또는 2를 입력해 설정한다면 Certbot이 인증서를 받고 Nginx 설정 파일을 자동으로 업데이트합니다.

 

3. Nginx 설정 파일을 확인합니다.

sudo vi /etc/nginx/sites-available/default

 

위 이미지와 같이 ssl 을 접두사로 지닌 변수들이 추가된 것을 확인할 수 있습니다.

PostStep. SSL 갱신 테스트하기

 

Certbot 을 통한 SSL 인증서의 유효 기간은 90일에 불과하기 때문에 90일 내에 갱신해줘야 합니다.

 

Certbot 설치 과정에서 /etc/cron.d 에 자동 갱신 커맨드가 추가되어 있습니다.

 

아래의 명령어를 입력 시 테스트 가능합니다.

sudo certbot renew --dry-run

 

실제로 갱신을 희망한다면 하기한 명령어를 실행 시 갱신됩니다.

sudo certbot renew

 

자동 갱신을 희망한다면

 

1. cron job 을 추가합니다.

sudo crontab -e

 

2. 매월 1일 03시에 인증서를 갱신하는 크론식을 추가합니다.

0 18 1 * * /usr/bin/certbot renew --renew-hook="sudo systemctl restart tomcat"

 

갱신 관련 크론식은 아래와 같습니다. 하기 원리에 따라 갱신하는 일시를 선택할 수 있습니다.

 

이상의 작업이 완료됐다면 이제부터는 HTTPS 프로토콜을 사용할 수 있게 됩니다.

(당연하게 https 프로토콜이 사용하는 443번 포트에 대한 접근 허용도 선행되어야 합니다)

 

참고자료

https://velog.io/@pinot/Ubuntu-Nginx-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-CertBot%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-https-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

https://devlog.jwgo.kr/2019/04/16/how-to-lets-encrypt-ssl-renew/

https://aws.amazon.com/ko/what-is/ssl-certificate/