Nginx HTTPS - Let's Encrypt SSL/TLS 설정
백엔드 서버 배포 환경 구성· 5 / 6
- 1 — AWS EC2 인스턴스 생성과 설정
- 2 — AWS EC2 탄력적 IP 주소 할당
- 3 — AWS RDS 인스턴스 생성과 파라미터 그룹 설정
- 4 — Nginx 웹서버 설치와 리버스 프록시
- 5 — Nginx HTTPS - Let's Encrypt SSL/TLS 설정
- 6 — Linux Ubuntu 디렉토리 권한 설정
원격 서버에 HTTPS를 적용하기 위해 SSL/TLS를 발급받아야 하는데, 무료로 SSL/TLS를 발급해주는 공개 인증 기관(CA)인 Let’s Encrypt의 certbot을 이용하기로 했다.
SSL/TLS 발급
Let’s Encrypt의 certbot으로 도메인 소유권을 확인하고 인증서를 발급받는 과정을 정리한다.
패키지 설치
certbot과 Nginx 플러그인을 설치한다.
sudo apt install certbot python3-certbot-nginx
# python3-certbot-nginx: certbot의 플러그인으로 Nginx 웹 서버에서 사용
# Ubuntu 18.04 이하 → python-certbot-nginx인증서 발급
Let’s Encrypt에서 와일드카드 인증서를 발급받기 위해서는 DNS-01 방식을 통한 도메인 소유권 확인이 필요하다.
sudo certbot certonly --manual --preferred-challenges dns -d dailyrecord.store -d '*.dailyrecord.store'
# certonly: 인증서만 발급받고 설치는 진행하지 않음
# --manual: 수동으로 도메인 소유권을 확인하고 검증
# --preferred-challenges dns: 도메인 소유권 확인을 DNS 방식으로 진행함
# '*.~': 와일드카드 방식(서브 도메인까지 모두 적용되도록)
발급 명령어를 실행하면, DNS TXT 레코드에 입력할 value가 주어진다. 여기서 바로 Enter를 클릭해 넘어 가면 안 되고, 레코드 등록 완료를 확인한 후 넘어가야 한다.
다음으로 진행하기 전, 제대로 등록되었는지 확인을 위해 다른 터미널에서 아래와 같이 확인해보자.
host -t txt _acme-challenge.dailyrecord.store
레코드 등록
현재 도메인은 가비아의 도메인을 이용 중이므로, ‘가비아 도메인 설정’에서 해당 도메인에 TXT 레코드를 생성한다.

- 호스트 =
_acme-challenge - 값/위치 =
value
레코드 생성 후, Google 관리 콘솔 도구 상자에서 등록이 완료 됐는지 확인할 수 있다.

등록이 확인되면 터미널에서 Enter를 클릭해 발급을 완료한다.

Nginx HTTPS 설정
발급받은 인증서를 Nginx 서버 블록에 적용해 HTTPS를 활성화한다.
서버 블록 생성
/etc/nginx/sites-available 위치에 서버 블록 설정 파일을 생성한다. 이미 생성되어 있을 경우, 수정하면 된다.
sudo vim /etc/nginx/sites-available/dailyrecord.storeserver {
listen 80;
server_name domain.com www.domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 80;
server_name api.domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name domain.com www.domain.com;
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
# SSL
ssl_protocols TLSv1.2 TLSv1.3; # default
ssl_prefer_server_ciphers on; # default
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_cache_bypass $http_upgrade;
}
}
server {
listen 443 ssl;
server_name api.domain.com;
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
# SSL
ssl_protocols TLSv1.2 TLSv1.3; # default
ssl_prefer_server_ciphers on; # default
location / {
proxy_pass http://localhost:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_cache_bypass $http_upgrade;
}
}기존에 설정했던 HTTP 80 포트로 접근하면 HTTPS 443 포트로 리디렉트하도록 설정을 변경한다.
그렇게 HTTPS 443 포트로 접근할 경우, SSL을 진행하고 요청된 서브 도메인에 따라 백엔드(api.)와 프론트엔드(www.)를 각각 연결해주면 최종적으로 HTTPS로 리버스 프록시를 적용해 이용할 수 있다.
서버 블록 활성화
생성한 서버 블록 설정 파일을 /etc/nginx/sites-enabled 위치에 심볼릭 링크로 추가해 서버 블록을 활성화한다.
sudo ln -s /etc/nginx/sites-available/dailyrecord.store /etc/nginx/sites-enabled이미 설정 파일이 존재할 경우 삭제 후 다시 활성화한다.
sudo rm /etc/nginx/sites-enabled/dailyrecord.storeNginx 재시작 및 체크
Nginx를 재시작해 설정을 적용한다.
sudo systemctl restart nginx마지막으로 브라우저 주소창에 도메인 입력해 접속이 잘 되는 것을 확인할 수 있다.

보안 점수 체크
아래 서비스를 이용해 보안 점수가 어느 정도 나오는지 테스트해 볼 수 있다.
