본문 바로가기
Server-side 개발 & 트러블 슈팅/AWS

SSL(HTTPS) 구축 가이드 (EC2 + Docker + Nginx + Let's Encrypt + Certbot)

by 코딩하는 동현 2025. 7. 5.

AWS EC2(ubuntu) + Docker + 서버(spring boot)환경에서 Nginx, Let's Encrypt, Certbot을 이용한 SSL 구축 가이드

1. 도메인 준비 및 EC2 연결

우선 도메인 사이트에서(서브도메인 사이트X) 도메인을 할당받습니다

예시: 내도메인.한국

 

내도메인.한국 - 한글 무료 도메인 등록센터

한글 무료 도메인 내도메인.한국, 웹포워딩, DNS 등 무료 도메인 기능 제공

xn--220b31d95hq8o.xn--3e0b707e

  • 내도메인.한국 등에서 발급받고, 도메인 관리에서 A레코드에 EC2 퍼블릭 IP를 연결합니다.
  • EC2 보안 그룹에서 80(HTTP), 443(HTTPS) 포트를 오픈합니다.


2. EC2에서 Let's Encrypt SSL 인증서 발급

Certbot 설치 및 인증서 발급

sudo apt update
sudo apt install certbot -y
sudo certbot certonly --standalone -d 실제도메인이름

 

  • 인증서 파일이 /etc/letsencrypt/live/도메인이름/에 생성됩니다.


3. 리버스 프록시(Nginx)를 이용해 https 트래픽을 서버(spring)으로 라우팅

Nginx 설치 (Ubuntu 기준)

sudo apt update
sudo apt install nginx -y

 

 

Nginx 설정파일 수정

  • /etc/nginx/nginx.conf 또는 /etc/nginx/sites-available/default(혹은 별도 conf 파일)에 아래와 같이 작성
user  www-data;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    # 여기에 여러 server 블록을 넣을 수 있습니다.
    server {
        listen 80;
        server_name 도메인이름;
        location /.well-known/acme-challenge/ {
            root /var/www/certbot;
        }
        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name 도메인이름r;

        ssl_certificate /etc/letsencrypt/live/도메인이름/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/도메인이름/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

        location / {
            proxy_pass <http://localhost:8080>;
            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;
        }
    }
}
  • Spring Boot가 호스트에서 8080포트로 실행 중이면 proxy_pass <http://localhost:8080>;으로 설정하면 됩니다.
  • 만약 Spring Boot가 Docker 컨테이너에서 실행 중이라면, 컨테이너의 8080포트를 호스트의 8080포트에 바인딩(p 8080:8080)해야 합니다.

Nginx 설정 적용

sudo nginx -t    # 설정 문법 검사
sudo systemctl reload nginx   # 설정 적용(재시작)

 


4. Certbot Nginx 플러그인 관련 오류시 해결

문제 원인 요약

  • Nginx 설정에서 include /etc/letsencrypt/options-ssl-nginx.conf; 구문이 있는데, 해당 파일이 없어서 Nginx 설정 테스트에 실패한 상황입니다.
  • 이 파일은 Certbot이 Nginx용 SSL 보안 옵션을 자동으로 생성해주는 파일입니다.

Certbot Nginx 플러그인 설치 확인

  • 아래 명령어로 플러그인이 설치되어 있는지 확인하고, 없다면 설치하세요:
sudo apt update
sudo apt install python3-certbot-nginx

 

1. options-ssl-nginx.conf 파일 자동 생성

플러그인 설치 후 아래 명령어를 실행하면 파일이 자동 생성될 수 있습니다:

sudo certbot --nginx

  • 만약 여전히 파일이 생성되지 않으면, 위의 수동 생성 방법을 사용하세요
  • 성공시 3번으로 가면 됩니다.

2. options-ssl-nginx.conf 파일 수동 생성

아래 명령어로 파일을 엽니다:

sudo vi /etc/letsencrypt/options-ssl-nginx.conf

아래 내용을 복사해 붙여넣고 저장하세요:

ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";

 

3. 권한을 설정후 적용

sudo chmod 644 /etc/letsencrypt/options-ssl-nginx.conf

 

설정 파일이 정상적으로 생성되었는지 확인 후:

sudo nginx -t

에러가 없다면 Nginx를 재시작 또는 reload:

sudo systemctl reload nginx

 


5. ssl-dhparams.pem 파일 없음 오류시 해결

  • 에러 메시지의 핵심:
nginx: [emerg] BIO_new_file("/etc/letsencrypt/ssl-dhparams.pem") failed (2: No such file or directory)

  • 즉, Nginx 설정에서 include /etc/letsencrypt/ssl-dhparams.pem;을 참조하는데, 해당 파일이 없어서 Nginx가 실행/테스트에 실패하는 상황입니다.

해결 방법: ssl-dhparams.pem 파일 생성

아래 명령어를 한 번만 실행하면 문제 해결됩니다.

sudo openssl dhparam -out /etc/letsencrypt/ssl-dhparams.pem 2048

  • 이 명령은 2048비트 Diffie-Hellman 파라미터 파일을 생성합니다.
  • 생성에는 수십 초~수 분이 걸릴 수 있습니다(서버 성능에 따라 다름).

Nginx 설정 문법 검사

  1.  
sudo nginx -t

Nginx 재시작(설정 적용)

sudo systemctl reload nginx

Certbot 명령 재실행(필요시)

sudo certbot --nginx

추가 체크리스트

  • /etc/letsencrypt/options-ssl-nginx.conf와 /etc/letsencrypt/ssl-dhparams.pem 두 파일 모두 존재해야 Nginx SSL 설정이 정상 동작합니다.
  • 위 파일들은 Certbot이 자동으로 생성하지만, 누락 시 직접 만들어도 무방합니다.
  • Nginx 설정 변경 후에는 항상 sudo nginx -t로 문법 검사를 먼저 하세요.

 

6. 인증서 자동 갱신(cron) 설정

  • 인증서 자동 갱신을 위해 crontab에 아래와 같이 등록
sudo crontab -e

  • 아래 한 줄 추가(매주 월요일 0시 0분에 갱신)
0 0 * * 1 certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"

 

Nginx가 80포트를 점유하고 있으면 갱신이 실패할 수 있으므로, 갱신 전후로 자동으로 Nginx를 멈췄다가 다시 시작합니다


7. GitHub Actions CD 연동

  • Nginx가 호스트에 직접 설치되어 있다면,CD에서는 SSH로 서버에 접속해 Nginx 설정파일을 복사/덮어쓰기만 하면 됩니다.

예시:

- name: Deploy Nginx config
  run: |
    scp -i ${{ secrets.EC2_SSH_KEY }} ./nginx.conf ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }}:/etc/nginx/nginx.conf
    ssh -i ${{ secrets.EC2_SSH_KEY }} ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} "sudo nginx -t && sudo systemctl reload nginx"

  • Spring Boot는 도커 명령어로 배포, Nginx는 설정파일만 덮어쓰고 reload합니다

 

반응형

댓글