Let's Encrypt 인증서와 Nginx로 https 설정하기

2023. 4. 3. 01:12AWS

데브코스에서 진행한 팀 프로젝트에 SSL 인증서를 발급하여 https로 보안을 강화했습니다.

 

HTTP

HTTP(HyperText Transfer Protocol)는 하이퍼 텍스트 전송 프로토콜로 간단히 말해서 인터넷을 작동시키는 역할을 하며, 웹 서버 및 웹 브라우저 상호 간의 데이터 전송을 위한 Application 계층의 프로토콜입니다.

 

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)는 하이퍼 텍스트 전송 프로토콜 보안으로 표준 HTTP와 동일한 방식으로 작동합니다. 서버와 주고받는 데이터가 암호화되기 때문에 웹사이트에 추가적인 보호를 제공합니다. 즉, 개인 데이터를 훔치거나, 해킹하거나 볼 수 없도록 작동합니다.

 

HTTP와 HTTPS 차이점

https는 SSL(Secure Socket Layer) 인증서를 사용하는 프로토콜이라는 점입니다.
SSL/TLS 인증서는 일반 HTTP 요청 및 응답을 암호화합니다. 따라서 HTTPS는 HTTP보다 안전한 보안용 프로토콜이라고 할 수 있습니다.  따라서 HTTPS를 사용한 웹 페이지를 통해 전송되는 모든 데이터는 추가적인 보안 계층이 있습니다.

 

SSL 인증서

SSL 인증서는 SSL(Secure Socket Layer)에 기반하여 웹 브라우저와 웹 서버간 암호화 통신을 가능하게 하는 제3의 신뢰기관이 인증한 인증서입니다. 이를 통해 해당 웹사이트가 신뢰할 수 있는 사이트인지, 안전한 통신을 하는 사이트인지 구분할 수 있습니다.

AWS의 Certificate Manager나 Let's Encrypt라는 비영리기관을 통해 무료로 SSL 인증서를 발급받을 수 있습니다.
이번 포스팅은 Let's Encrypt에서 발급받은 SSL 인증서를 이용해 https로 보안을 강화하는 방법에 대해 알아보겠습니다.

Let's Encrypt는 인증서를 무료로 발급해줄뿐만아니라, shell로 손쉽게 설치할 수 있다는 장점이 있어서 사용하게 되었습니다. 

 


AWS 환경

운영체제 : Ubuntu 22.04 (LTS)
웹서버 : Nginx

 

1. 도메인 생성하기

SSL 인증서를 발급받아서 적용하기 위해서는 도메인이 필요합니다. SSL 인증서는 '도메인(or 서브도메인,FQDN)' 에 대한 발급이므로 구매한 도메인을 DNS 서버에 등록한 뒤 전세계 어디서나 공개 조회(쿼리)되고 있는 상태여야 발급신청서를 작성할 수 있습니다.

저는 가비아에서 저렴하게 하나 구매했습니다.

이후 AWS의 Route53에서 호스팅 영역에 kkini.site를 생성합니다.

 

생성된 NS 유형의 값을 가비아 네임서버에 등록해줍니다.

NS 유형의 값

 

2. Nginx 설치

EC2에 Nginx를 설치합니다.

$ sudo apt update
$ sudo apt install nginx

설치 후 설정파일은 /etc/nginx/nginx.conf로 생성됩니다.

$ sudo vim /etc/nginx/nginx.conf

 

3. SSL 적용

Ubuntu 22.04(LTS) 기준입니다. 

1) certbot 설치 

$ sudo snap install certbot --classic
$ sudo certbot --nginx
  • 분투의 snap 이라는 패키지 매니저를 사용하여 설치하는 것이 권장됩니다.
  • Let's Encrypt는 무료 SSL인증서를 발급해주는 곳이고, Certbot는 Let's Encrypt 인증서를 자동으로 발급 및 갱신을 해주는 프로그램입니다.
  • Certbot으로 받은 인증서(Encrypt)는 3개월 유효기간이 있으므로 추후에 갱신이 필요합니다.

이 과정을 거치면 Certbot은 자동으로 Let's Encrypt를 통해 SSL 인증서를 발급해옵니다. 

 

2) nginx 설정파일 변경

위의 과정을 마치면 Nginx 설정 파일을 보면 HTTPS를 위한 설정이 추가되어있습니다.
기존 http로 요청이 오면 https(443포트)로 리다이렉트하도록 설정해야 합니다.

$ sudo vim /etc/nginx/nginx.conf

저는 다음과 같이 설정했습니다.

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

    events {
        worker_connections  1024;
        }

        http {
        include       mime.types;
        
        server {
        server_name dev.kkini.site;

        location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        }

        listen 443 ssl; # managed by Certbot

        ssl_certificate /etc/letsencrypt/live/dev.kkini.site/fullchain.pem; # managed by Cert>
        ssl_certificate_key /etc/letsencrypt/live/dev.kkini.site/privkey.pem; # managed by Ce>
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
        }
        
        # 80 포트로 접근시 443 포트로 리다이렉트
        server {
        
        return 301 https://$host$request_uri;

        listen 80;
        server_name dev.kkini.site;
        return 404; # managed by Certbot
        }

}

 

80(http)로 요청이 올 경우 https로 301 리다이렉트를 해주며,
443 포트로 요청이 올 경우 원하는 경로로 proxy_pass합니다.

'AWS' 카테고리의 다른 글

Github Action, Nginx, Docker 무중단 배포하기(블루/그린)  (1) 2023.03.30