Ubuntu 24.04에서 Nginx로 무료 SSL(HTTPS) 적용(이중 인증서 자동갱신)
이 가이드는 Ubuntu 24.04 LTS에서 Nginx + Let’s Encrypt(Certbot)로 HTTPS를 설정하는 방법을 다룹니다. 특히 RSA + ECDSA 이중 인증서를 발급하여, 신형 브라우저에는 ECDSA, 구형/특수 환경에는 RSA로 자동 최적화되게 구성합니다. 자동갱신과 Nginx 자동 재로드까지 마무리합니다.
0) 사전 준비
- 도메인:
example.com과www.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) 적용
👉 5편: Gradle 빌드 최적화로 빌드 50% 줄이기
👉 6편: Spring Security 6 JWT 로그인/리프레시 토큰
👉 7편: JPA N+1 완전 정복: 자동 감지부터 fetch join·EntityGraph·batch_size 실전 해결 전략
👉 8편: Docker로 PostgreSQL 운영(백업/복구/업그레이드)
'서버 인프라 실무' 카테고리의 다른 글
| JPA N+1 완전 정복: 자동 감지부터 fetch join·EntityGraph·batch_size 실전 해결 전략 (0) | 2025.10.09 |
|---|---|
| Gradle 빌드 캐시/병렬/Configuration Cache로 빌드 50% 줄이기 (0) | 2025.10.08 |
| Tomcat 10 운영자 튜닝 가이드(커넥터·스레드풀·압축·헤더 최적화) (0) | 2025.10.07 |
| systemd 서비스로 스프링부트 배포: 로그 분리·자동 재시작까지 (0) | 2025.10.07 |
| UFW 방화벽 실전 규칙: SSH 잠그고, 웹만 열고, 포트스캔 막기 (0) | 2025.10.06 |