본문 바로가기
서버 인프라 실무

Ubuntu 24.04에서 Nginx로 무료 SSL(HTTPS) 적용(이중 인증서 자동갱신)

by yamoojin83 2025. 10. 6.

Ubuntu 24.04에서 Nginx로 무료 SSL(HTTPS) 적용(이중 인증서 자동갱신)

이 가이드는 Ubuntu 24.04 LTS에서 Nginx + Let’s Encrypt(Certbot)로 HTTPS를 설정하는 방법을 다룹니다. 특히 RSA + ECDSA 이중 인증서를 발급하여, 신형 브라우저에는 ECDSA, 구형/특수 환경에는 RSA로 자동 최적화되게 구성합니다. 자동갱신과 Nginx 자동 재로드까지 마무리합니다.

0) 사전 준비

  • 도메인: example.comwww.example.com이 서버 공인 IP를 가리키도록 A 레코드 설정
  • 포트 오픈: 방화벽/보안그룹에서 80, 443 열기 (UFW, 클라우드 보안그룹 등)
  • 루트/관리자 권한: sudo 가능한 사용자

1) Nginx 설치 및 기본 서버블록


sudo apt update && sudo apt -y install nginx
sudo systemctl enable --now nginx

기본 서버블록(HTTP)을 만들어 둡니다. (도메인과 루트 경로를 바꾸세요)


sudo tee /etc/nginx/sites-available/example.com > /dev/null <<'EOF'
server {
  listen 80;
  listen [::]:80;
  server_name example.com www.example.com;

  root /var/www/example.com;
  index index.html;

  # 인증서 발급용 HTTP-01 챌린지 경로
  location ~ /\.well-known/acme-challenge/ { allow all; }

  # HTTP 접속은 HTTPS로 리다이렉트(발급 시점엔 certbot이 임시 우회함)
  location / {
    return 301 https://$host$request_uri;
  }
}
EOF
sudo mkdir -p /var/www/example.com
echo "<h1>Hello HTTPS</h1>" | sudo tee /var/www/example.com/index.html
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

2) Certbot 설치(스냅 권장)

Ubuntu 24.04에서는 snap으로 설치하는 것이 권장입니다.


sudo snap install --classic certbot
sudo ln -sf /snap/bin/certbot /usr/bin/certbot
certbot --version

3) RSA + ECDSA 이중 인증서 발급

Certbot은 --key-type으로 rsa, ecdsa를 지정할 수 있습니다. 두 번 발급해 서로 다른 --cert-name을 주면 동일 도메인에 두 종류 인증서를 보유할 수 있습니다.


# 3-1) ECDSA (권장 곡선: P-256; P-384도 가능)
sudo certbot certonly --nginx \
  --key-type ecdsa --elliptic-curve secp256r1 \
  --cert-name example.com-ecdsa \
  -d example.com -d www.example.com

# 3-2) RSA (호환성용)
sudo certbot certonly --nginx \
  --key-type rsa --rsa-key-size 2048 \
  --cert-name example.com-rsa \
  -d example.com -d www.example.com

성공하면 디렉터리 예시는 다음과 같습니다.


/etc/letsencrypt/live/example.com-ecdsa/{fullchain.pem,privkey.pem}
 /etc/letsencrypt/live/example.com-rsa/{fullchain.pem,privkey.pem}

4) Nginx에 이중 인증서 적용

Nginx는 ssl_certificate / ssl_certificate_key두 쌍 선언하면, 클라이언트 지원에 따라 자동 선택합니다.


sudo tee /etc/nginx/snippets/ssl-example.com.conf > /dev/null <<'EOF'
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

# ECDSA 우선
ssl_certificate     /etc/letsencrypt/live/example.com-ecdsa/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com-ecdsa/privkey.pem;

# RSA 백업(호환성)
ssl_certificate     /etc/letsencrypt/live/example.com-rsa/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com-rsa/privkey.pem;

# (선택) HSTS: 충분히 검증 후 활성화
# add_header Strict-Transport-Security "max-age=15552000; includeSubDomains; preload" always;
EOF

HTTPS 서버블록을 추가합니다.


sudo tee /etc/nginx/sites-available/example.com-ssl > /dev/null <<'EOF'
server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name example.com www.example.com;

  include snippets/ssl-example.com.conf;

  root /var/www/example.com;
  index index.html;

  # 기본 보안 헤더(필요에 맞게 조정)
  add_header X-Frame-Options "SAMEORIGIN" always;
  add_header X-Content-Type-Options "nosniff" always;
  add_header Referrer-Policy "strict-origin-when-cross-origin" always;

  location / {
    try_files $uri $uri/ /index.html;
  }
}
EOF

sudo ln -s /etc/nginx/sites-available/example.com-ssl /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

5) 자동 갱신 + Nginx 자동 재로드

snap 설치의 Certbot은 systemd 타이머하루 두 번 갱신을 시도합니다. 갱신 후 Nginx를 재로드하도록 deploy hook 스크립트를 추가합니다.


# 타이머 확인
systemctl list-timers | grep certbot

# 갱신 후 자동 재로드 훅
sudo install -d -m 0755 /etc/letsencrypt/renewal-hooks/deploy
sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh > /dev/null <<'EOF'
#!/usr/bin/env bash
/usr/sbin/nginx -t && /bin/systemctl reload nginx
EOF
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

# 리허설(실제 발급은 아님)
sudo certbot renew --dry-run

6) 문제 해결(트러블슈팅)

  • 권한: fullchain.pem/privkey.pem 경로 오타, 권한 문제 확인
  • 방화벽: 발급 실패 시 80 포트 차단 여부(UFW/보안그룹) 체크
  • 중복 서버블록: 동일 도메인 server_name이 여러 파일에 있으면 충돌
  • HSTS: 적용 후 HTTP 접근 테스트가 어려워집니다. 충분히 검증하고 켜세요.

7) 보안/성능 팁

  • ECDSA(P-256) 기본 + RSA(2048) 백업 조합 권장
  • HTTP/2 활성화(http2)로 체감 속도 개선
  • 리버스 프록시 앞단에 CDN(Cloudflare 등)을 둘 경우, 인증서/원본 포트 정책을 함께 설계

 

 

👉 1편: Ubuntu 24.04에서 Nginx로 무료 SSL(HTTPS) 적용

👉 2편: UFW 방화벽 실전 규칙

👉 3편: systemd 서비스로 스프링부트 배포

👉 4편: Tomcat 10 설치+튜닝 체크리스트

👉 5편: Gradle 빌드 최적화로 빌드 50% 줄이기

👉 6편: Spring Security 6 JWT 로그인/리프레시 토큰

👉 7편: JPA N+1 완전 정복: 자동 감지부터 fetch join·EntityGraph·batch_size 실전 해결 전략

👉 8편: Docker로 PostgreSQL 운영(백업/복구/업그레이드)

👉 9편: Micrometer+Prometheus+Grafana 대시보드

👉 10편: Testcontainers로 DB 통합테스트