Ubuntu에서 Let's Encrypt로 Nginx 보안 설정하는 방법
소개
Let’s Encrypt는 무료 TLS/SSL 인증서를 쉽게 획득하고 설치할 수 있는 인증 기관(CA)으로, 웹 서버에서 암호화된 HTTPS를 가능하게 합니다. 이 과정은 Certbot이라는 소프트웨어 클라이언트를 제공하여 대부분(모든 경우는 아닐지라도)의 필요한 단계를 자동화하려고 시도함으로써 단순화됩니다. 현재 Apache와 Nginx 모두에서 인증서를 획득하고 설치하는 전체 과정이 완전히 자동화되어 있습니다.
이 튜토리얼에서는 Certbot을 사용하여 Ubuntu에서 Nginx용 무료 SSL 인증서를 발급받고 인증서가 자동으로 갱신되도록 설정하는 방법을 배웁니다.
주요 내용
- Certbot의 Nginx 플러그인을 사용하여 몇 분 만에 무료 Let’s Encrypt 인증서를 발급받고 설치하세요.
- Ubuntu 22.04(Jammy), 24.04(Noble), 25.04(Lunar)에서 작동합니다.
- 자동 갱신을 활성화하세요; 인증서는 90일 동안 유효하며 자동으로 갱신됩니다.
- HSTS와 최신 암호화 스위트를 사용하여 HTTPS를 강화하고, SSL Labs로 검증하세요.
- DNS A 레코드와 포트 80/443이 접근 가능한지 확인하세요. 대부분의 인증 실패는 네트워크 또는 DNS 문제와 관련이 있습니다.
전제 조건
이 튜토리얼을 따라하려면 다음이 필요합니다:
이 초기 Ubuntu 서버 설정 튜토리얼을 따라 설정한 하나의 Ubuntu 서버로, sudo 권한이 있는 비-루트 사용자와 방화벽이 포함되어 있습니다.
-
등록된 도메인 이름. 이 튜토리얼에서는
example.com을 계속 사용할 것입니다. Namecheap에서 도메인 이름을 구매하거나, Google Domains 또는 선호하는 도메인 등록 기관을 이용할 수 있습니다. 다음 두 DNS 레코드가 서버에 설정되어 있습니다. Linux-Console.net을 사용하고 계시다면, 레코드를 추가하는 방법에 대한 자세한 내용은 저희 DNS 문서를 참조하시기 바랍니다.
- 서버의 공인 IP 주소를 가리키는
example.comA 레코드.
- 서버의 공인 IP 주소를 가리키는
- 서버의 공인 IP 주소를 가리키는
www.example.comA 레코드.
Nginx는 'Ubuntu에 Nginx 설치하는 방법'을 따라 설치되었습니다. 도메인에 대한 서버 블록이 있는지 확인하세요. 이 튜토리얼에서는 예제로 /etc/nginx/sites-available/example.com을 사용할 것입니다.
1단계 — Certbot 설치
Certbot은 설치를 위해 그들의 스냅 패키지 사용을 권장합니다. 스냅 패키지는 거의 모든 리눅스 배포판에서 작동하지만, 스냅 패키지를 관리하려면 먼저 snapd를 설치해야 합니다. 우분투는 스냅 지원을 기본으로 제공합니다 (22.04, 24.04, 25.04). 먼저 snapd가 최신인지 확인하세요:
sudo snap install core; sudo snap refresh core이전에 오래된 버전의 certbot이 설치되어 있던 서버에서 작업 중이라면, 계속 진행하기 전에 먼저 제거해야 합니다:
sudo apt remove certbot그 후에, certbot 패키지를 설치할 수 있습니다:
sudo snap install --classic certbot마지막으로, 스냅 설치 디렉토리에서 certbot 명령어를 경로에 연결할 수 있으므로, 단순히 certbot을 입력하는 것만으로 실행할 수 있습니다. 모든 시스템에서 반드시 필요한 것은 아니지만, 스냅은 기본적으로 시스템에 덜 간섭하므로 다른 시스템 패키지와 충돌하지 않는 경우가 많습니다:
sudo ln -s /snap/bin/certbot /usr/bin/certbot대안 (APT): 일부 snapd가 없는 환경에서는 Ubuntu 저장소에서 설치할 수 있습니다:
sudo apt update
sudo apt install -y certbot python3-certbot-nginx스냅 배포는 최신 기능과 적시 업데이트를 위해 Certbot 팀이 권장하는 설치 방법으로 남아 있습니다.
이제 Certbot을 설치했으니 인증서를 받기 위해 실행해 봅시다.
2단계 — Nginx 구성 확인
Certbot은 SSL을 자동으로 구성할 수 있도록 Nginx 설정에서 올바른 server 블록을 찾을 수 있어야 합니다. 구체적으로, Certbot은 인증서를 요청하는 도메인과 일치하는 server_name 지시문을 찾아 이 작업을 수행합니다.
Nginx 설치 튜토리얼에서 서버 블록 설정 단계를 따라했다면, /etc/nginx/sites-available/example.com에 도메인용 서버 블록이 있어야 하며, server_name 지시어가 이미 적절히 설정되어 있어야 합니다.
확인하려면 nano 또는 좋아하는 텍스트 편집기를 사용하여 도메인의 구성 파일을 열어보세요:
sudo nano /etc/nginx/sites-available/example.com기존의 server_name 줄을 찾으세요. 다음과 같이 보일 것입니다:
...
server_name example.com www.example.com;
...그렇다면 에디터를 종료하고 다음 단계로 넘어가세요.
일치하지 않으면 업데이트하세요. 그런 다음 파일을 저장하고, 편집기를 종료한 후, 구성 편집 사항의 문법을 확인하세요:
sudo nginx -t오류가 발생하면 서버 블록 파일을 다시 열고 오타나 누락된 문자가 있는지 확인하세요. 구성 파일의 문법이 올바르면 Nginx를 다시 불러 새 구성을 적용하세요:
sudo systemctl reload nginxCertbot이 이제 올바른 server 블록을 찾아 자동으로 업데이트할 수 있습니다.
다음으로, HTTPS 트래픽을 허용하도록 방화벽을 업데이트합시다.
3단계 — 방화벽에서 HTTPS 허용
권장 사전 요구 사항 가이드에 따라 ufw 방화벽을 활성화한 경우, HTTPS 트래픽을 허용하도록 설정을 조정해야 합니다. 다행히도 Nginx는 설치 시 ufw에 몇 가지 프로필을 등록합니다.
다음을 입력하면 현재 설정을 볼 수 있습니다:
sudo ufw status웹 서버에는 HTTP 트래픽만 허용된다는 의미로, 아마도 이렇게 보일 것입니다:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)HTTPS 트래픽도 추가로 허용하려면 Nginx 전체 프로필을 허용하고 중복된 Nginx HTTP 프로필 허용을 삭제하세요:
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'이제 귀하의 상태는 다음과 같이 보여야 합니다:
sudo ufw statusStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)다음으로, Certbot을 실행하고 인증서를 가져옵시다.
4단계 — SSL 인증서 받기
Certbot은 플러그인을 통해 SSL 인증서를 얻는 다양한 방법을 제공합니다. Nginx 플러그인은 필요할 때마다 Nginx를 재구성하고 설정을 다시 로드하는 작업을 처리합니다. 이 플러그인을 사용하려면 다음을 입력하세요:
sudo certbot --nginx -d example.com -d www.example.com이 명령은 --nginx 플러그인을 사용하여 certbot을 실행하며, -d 옵션으로 인증서를 유효하게 할 도메인 이름을 지정합니다.
명령을 실행하면 이메일 주소를 입력하고 서비스 약관에 동의하라는 메시지가 표시됩니다. 그렇게 하면 프로세스가 성공적으로 완료되었고 인증서가 저장된 위치를 알려주는 메시지를 보게 됩니다:
IMPORTANT NOTES:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2022-06-01.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le인증서가 다운로드, 설치 및 로드되었으며, 이제 Nginx 설정은 모든 웹 요청을 자동으로 https://로 리디렉션합니다. 웹사이트를 새로고침하고 브라우저의 보안 표시를 확인해 보세요. 사이트가 제대로 보호되고 있으면 일반적으로 잠금 아이콘으로 표시됩니다. SSL Labs Server Test를 사용하여 서버를 테스트하면 A 등급을 받게 됩니다.
갱신 과정을 테스트하면서 마무리합시다.
5단계 — Certbot 자동 갱신 확인
Let’s Encrypt의 인증서는 90일 동안만 유효합니다. 이는 사용자가 인증서 갱신 과정을 자동화하도록 장려하기 위한 것입니다. 우리가 설치한 certbot 패키지는 이를 위해 시스템d 타이머를 추가하여 하루에 두 번 실행되며, 만료 30일 이내의 모든 인증서를 자동으로 갱신해 줍니다.
타이머의 상태는 systemctl을 사용하여 확인할 수 있습니다:
sudo systemctl status snap.certbot.renew.service○ snap.certbot.renew.service - Service for snap application certbot.renew
Loaded: loaded (/etc/systemd/system/snap.certbot.renew.service; static)
Active: inactive (dead)
TriggeredBy: ● snap.certbot.renew.timer갱신 과정을 테스트하려면 certbot으로 시뮬레이션 실행을 할 수 있습니다:
sudo certbot renew --dry-run오류가 보이지 않는다면 준비가 완료된 것입니다. 필요할 경우, Certbot이 인증서를 갱신하고 Nginx를 재시작하여 변경 사항을 적용합니다. 자동 갱신 과정이 실패하면, Let’s Encrypt가 지정한 이메일로 인증서 만료 예정에 대한 경고 메시지를 보내줍니다.
훅을 선호하는 경우, 인증서가 갱신될 때만 Nginx를 다시 로드하도록 포스트 훅을 추가할 수 있습니다:
sudo certbot renew --dry-run --post-hook "systemctl reload nginx"APT 패키지를 사용하는 시스템에서는 크론 작업이 갱신을 처리할 수 있습니다. Snap을 사용하는 경우, systemd 타이머(snap.certbot.renew.timer)가 하루에 두 번 실행됩니다.
HTTPS 모범 사례 구성(HSTS, 암호화 방식, 리디렉션)
다운그레이드 및 혼합 콘텐츠 위험을 줄이기 위해 TLS 구성을 강화하세요.
- 지원되는 브라우저에서 HTTPS를 강제로 사용하도록 HSTS를 활성화하세요:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;- 현대 TLS 프로토콜과 암호를 우선 사용하세요(위험 프로필에 맞게 조정 가능):
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';- HTTP를 HTTPS로 리디렉션하기(Certbot이 자동으로 추가할 수 있음):
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}업계 도구로 설정을 검증하세요:
- Mozilla SSL 구성 생성기 (
https://ssl-config.mozilla.org)
- Mozilla SSL 구성 생성기 (
- SSL Labs 서버 테스트 (
https://www.ssllabs.com/ssltest/)
참고: HSTS를 처음 활성화할 때 주의하세요.
preload를 설정하는 경우, 모든 하위 도메인의 HTTPS 설정이 안정적인지를 확인한 후에 도메인을 제출하세요.
| 연습 | 왜 중요한가요? | 신청 방법 |
|---|---|---|
| HTTP에서 HTTPS로 301 사용 | 사용자들은 안전한 URL에 빠르게 접속합니다 | Certbot은 리디렉션을 자동으로 작성하거나, 포트 80에서 301 https://$host$request_uri를 반환하는 서버를 추가합니다 |
| 리디렉션 경로 최소화 | 왕복 횟수가 적을수록 첫 번째 페인트가 더 빨라집니다 | DNS/정식 링크를 최종 HTTPS 호스트로 지정하세요; http → www → https와 같은 체인은 피하세요 |
| 모든 자산을 HTTPS를 통해 제공하십시오 | 혼합 콘텐츠 경고 및 깨진 UI를 방지합니다 | DevTools 보안 패널로 감사 수행; CDN/자산 URL을 https://로 업데이트 |
| HTTP/2 및 HTTP/3 활성화 | 더 빠른 다중화 전송, 향상된 모바일 성능 | Nginx에서 listen 443 ssl http2; 및 지원되는 경우 443/udp에서 http3/QUIC |
| TLS 세션 재개 활성화 | 빠른 재방문 | ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d;를 확인하세요 |
| OCSP 스테이플링 켜기 | 더 빠르고 신뢰할 수 있는 인증서 검증 | ssl_stapling on; ssl_stapling_verify on; 유효한 리졸버와 함께 |
| Brotli/Gzip 사용 권장 | HTML/CSS/JS의 더 작은 페이로드 | 모듈이 있는 경우 brotli on;를 활성화하고, 대체로 gzip on;을 사용하세요 |
| 명확한 정식 HTTPS URL 설정 | 중복된 콘텐츠와 혼란스러운 URL을 피하세요 | <link rel="canonical" href="https://example.com/...">를 사용하고 사이트맵을 업데이트하세요 |
| www와 루트 도메인 통합 | 예측 가능한 주소 지정과 적은 리디렉션 | 호스트 이름 하나를 선택하고, 다른 하나는 영구적으로 그 이름으로 리디렉션하세요 |
| 친근한 TLS 오류/유지보수 페이지 | 사건 발생 시 포기율 감소 | 명확한 다음 단계가 포함된 맞춤 error_page 497/403/502/503 |
| 갱신 및 실패 모니터링 | 갑작스러운 인증서 만료로 인한 잠금 방지 | certbot 로그 알림; 외부 점검; 이메일 전달 가능성 확인됨 |
| HSTS를 신중하게 단계적으로 적용하세요 | 배포 중 우발적인 잠금 현상을 피하세요 | preload 없이 시작하세요; 하위 도메인을 점진적으로 추가하세요; preload 제출 전에 확인하세요 |
일반적인 문제 및 해결 방법
- ACME HTTP-01 챌린지 실패: 포트 80이 인터넷에서 접근 가능한지 확인하고 방화벽이나 상위 로드 밸런서에 의해 차단되지 않았는지 확인하세요.
- DNS 불일치:
example.com과www.example.com의 A/AAAA 레코드가 올바른 공용 IP를 가리키는지 확인하세요. - 잘못된 Nginx
server_name: Certbot은server_name으로 서버 블록을 찾습니다; 요청한 도메인과 일치하는지 확인하세요. - 요청 제한: 반복된 실패 요청은 Let’s Encrypt의 요청 제한에 도달할 수 있습니다. 테스트 중에는
--dry-run을 사용하고 필요에 따라 서브도메인을 변경하세요. - Snap과 APT 충돌: 경로 충돌을 피하려면 Snap을 설치하기 전에 이전 APT
certbot을 제거하세요.
자주 묻는 질문
1. Let's Encrypt란 무엇이며 Nginx와 어떻게 작동하나요?
Let’s Encrypt는 도메인 소유권을 검증하고 ACME 프로토콜을 통해 SSL/TLS 인증서를 발급하는 무료 인증 기관(CA)입니다. Certbot은 도메인 검증(대부분의 경우 HTTP‑01, 와일드카드는 DNS‑01), 인증서 발급, Nginx 설정 및 갱신을 자동화합니다. Nginx 플러그인을 사용하면 Certbot이 server 블록을 업데이트하고 인증서 파일을 /etc/letsencrypt/live/your_domain/에 작성합니다.
2. Let’s Encrypt SSL을 사용하려면 도메인 이름이 필요합니까?
예. 공개적으로 신뢰되는 인증서는 공개 DNS가 서버를 가리키는 등록된 도메인이 필요하며, IP 전용 또는 사설 호스트명은 지원되지 않습니다. 요청하는 각 호스트명에 대해 A/AAAA 레코드를 사용하세요. 와일드카드 인증서(예: *.example.com)는 DNS‑01 검증과 DNS 편집 권한이 필요합니다.
3. Ubuntu에서 Nginx용 Certbot을 어떻게 설치하나요?
스냅 사용(권장): sudo snap install --classic certbot && sudo ln -s /snap/bin/certbot /usr/bin/certbot. 또는, sudo apt install certbot python3-certbot-nginx.
스냅 패키지는 가장 빠르게 업데이트되며 Nginx 플러그인을 포함합니다. certbot --version으로 버전을 확인하세요. 스냅을 사용할 수 없는 경우, APT도 작동하지만 기능이 늦을 수 있습니다. Certbot이 Nginx를 자동으로 편집할 수 있도록 python3-certbot-nginx가 설치되어 있는지 확인하세요.
4. 하나의 인증서로 여러 도메인이나 서브도메인을 보호할 수 있나요?
네, Let’s Encrypt는 단일 인증서로 여러 도메인과 서브도메인을 보호할 수 있도록 지원하며, 이를 SAN(Subject Alternative Name) 인증서라고 합니다. 각 호스트 이름마다 개별 인증서를 요청하고 관리하는 대신, 모든 도메인을 하나의 인증서로 통합할 수 있어 관리와 갱신이 훨씬 간편해집니다.
사용 방법:
Certbot을 실행할 때, 인증서에 포함하려는 각 도메인이나 서브도메인을 -d 플래그를 각 도메인마다 반복해서 지정할 수 있습니다. 예를 들어:
sudo certbot --nginx -d example.com -d www.example.com -d api.example.com이 명령어는 세 가지 이름(example.com, www.example.com, api.example.com) 모두에 유효한 하나의 인증서를 발급합니다. Certbot은 나열된 모든 도메인에 대해 새 인증서를 사용하도록 Nginx 구성을 자동으로 업데이트합니다.
와일드카드 도메인은 어떨까요?
모든 서브도메인(예: anything.example.com)을 포함하는 인증서를 원한다면 와일드카드 도메인을 사용할 수 있습니다. 이는 DNS-01 검증(자신이 DNS 존을 관리하고 있음을 증명)을 필요로 하며, 일반적으로 DNS 제공자에 특별한 TXT 레코드를 추가하는 방식으로 이루어집니다. 예를 들어:
sudo certbot --manual --preferred-challenges dns -d *.example.com -d example.com이 과정에서 특정 DNS 레코드를 생성하라는 메시지가 표시됩니다.
알아두어야 할 기타 사항:
- Certbot을 실행하기 전에 지정된 모든 도메인이 올바르게 서버를 가리키도록 해야 합니다.
- Let's Encrypt의 요청 제한을 주의하세요: 관련 도메인들을 가능한 한 적은 수의 인증서로 묶어, 제한에 걸릴 가능성을 최소화하세요.
- 갱신할 때, Certbot은 새 세트를 요청하지 않는 한 원래의 모든 도메인을 함께 유지합니다.
Certbot에서 여러 -d 옵션을 사용하는 것이 여러 도메인/서브도메인을 커버하는 권장 방법입니다. SAN이 많은 인증서는 동일한 프로젝트나 서버의 사이트 및 API에 이상적입니다.
5. 자동 갱신이 정상적으로 작동하는지 어떻게 확인하나요?
다음 명령어를 실행하세요: sudo systemctl status snap.certbot.renew.timer (snap) 및 sudo certbot renew --dry-run. 로그는 /var/log/letsencrypt/에서 확인할 수 있습니다. 만료 여부도 확인할 수 있습니다:
openssl x509 -in /etc/letsencrypt/live/your_domain/fullchain.pem -noout -enddate성공하면 인증서가 만료 30일 이내일 때 자동으로 갱신되며, Nginx가 재시작됩니다.
6. Nginx를 Let’s Encrypt 인증서를 사용하도록 어떻게 구성하나요?
Certbot은 Let’s Encrypt 인증서를 사용하여 Nginx를 자동으로 구성합니다. TLS 서버 블록에서 일반적인 지시문은 다음과 같습니다:
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;sudo nginx -t로 검증하고 sudo systemctl reload nginx로 적용하세요.
7. 내 HTTPS 설정이 올바른지 어떻게 테스트할 수 있나요?
외부 테스트 및 클라이언트 점검을 사용하세요:
- SSL Labs 서버 테스트:
https://www.ssllabs.com/ssltest/ - Mozilla SSL 구성 생성기 안내:
https://ssl-config.mozilla.org - 빠른 확인:
curl -I http://example.com # Expect 301 to https
curl -I https://example.com # Confirm 200 and HSTS if enabled
openssl s_client -connect example.com:443 -servername example.com -tls1_3 < /dev/null | openssl x509 -noout -dates -issuer -subject또한 DevTools → 보안(Security)을 열어 혼합 콘텐츠 경고를 확인하세요.
8. Let’s Encrypt 인증서의 자동 갱신을 어떻게 설정하나요?
스냅 설치에서는 시스템디 타이머(snap.certbot.renew.timer)가 하루에 두 번 실행되어 만료가 다가오는 인증서를 갱신합니다. systemctl status로 확인하고, sudo certbot renew --dry-run으로 시뮬레이션할 수 있습니다. 훅이 필요하다면 다음을 사용하세요:
sudo certbot renew --post-hook "systemctl reload nginx"포트 80/443이 접근 가능한지, DNS가 올바른지 확인하고, 갱신 문제를 조기에 파악할 수 있도록 알림 이메일을 모니터링하세요.
결론
이 튜토리얼에서는 Let’s Encrypt 클라이언트 certbot을 설치하고, 도메인에 대한 SSL 인증서를 다운로드했으며, Nginx가 이 인증서를 사용하도록 구성하고, 자동 인증서 갱신을 설정했습니다. 또한 HSTS와 최신 암호화를 사용하여 TLS 구성을 강화하고, 일반적인 문제 해결 단계를 검토했습니다. Certbot 사용에 대해 추가 질문이 있는 경우 공식 문서를 참고하는 것이 좋습니다.
앞을 내다보며: 여러 도메인을 관리하는 팀의 경우 인프라를 코드로 자동화하는 방법(예: Nginx + Certbot용 Ansible 역할), 와일드카드 인증서를 위한 DNS-01 챌린지, 경고가 포함된 사전 인증서 모니터링 등을 고려해보세요. 이러한 분야는 별도의 고급 가이드에 적합합니다.
추가 읽을거리
- 우분투에 Nginx 설치 방법: Nginx를 설치하고, 서비스를 관리하며, 방화벽을 열고, 서버 블록을 설정하는 방법.
- Ubuntu 20.04에서 Let’s Encrypt로 Nginx 보안 설정하는 방법: 기존 Ubuntu 버전을 대상으로 한 Certbot 발급, HTTPS 리디렉션 및 자동 갱신 안내.
- DNS 검증을 사용하여 Let’s Encrypt 인증서를 획득하는 방법: 와일드카드 인증서나 HTTP 검증이 불가능한 경우 DNS‑01 챌린지(acme‑dns/Certbot 사용)를 이용하세요.
- 일반적인 Let's Encrypt 오류 해결 방법: ACME 챌린지, DNS/HTTP 접속 가능성, 속도 제한, 갱신 문제 해결하기.
Linux-Console.net 커뮤니티와 함께 학습해 주셔서 감사합니다.
