개인서버#Certbot#SSL#SSL 인증서#미니PC#미니피씨
Let’s Encrypt SSL 인증서 발급 및 Nginx 적용
By: Unknown Author•2025년 11월 16일 11:05
✅ 개요
이 문서는 개인 서버(미니 PC)에 Let’s Encrypt를 사용하여 무료 와일드카드 SSL 인증서(*.jay-gemini.com)를 발급받고, Nginx 웹서버에 적용하는 전체 과정을 기록합니다. 이 과정을 통해 HTTP 프로토콜을 HTTPS로 전환하여 통신을 암호화하고 보안을 강화할 수 있습니다.
💡 사전 준비물
- 개인 도메인:
jay-gemini.com(Gabia) - 리눅스 서버: Ubuntu가 설치된 미니 PC
- 웹서버: Nginx 설치 및 실행 중
- DNS 제어판 접근 권한: 도메인의 TXT 레코드를 추가하기 위해 필요
🚀 발급 및 적용 절차
1단계: Certbot 설치
Certbot은 Let’s Encrypt 인증서를 자동으로 발급하고 갱신하는 데 사용되는 클라이언트입니다. snap을 통해 설치하면 최신 버전을 유지하기 용이합니다.
# snapd 설치 및 업데이트
sudo apt update
sudo apt install snapd
sudo snap install core; sudo snap refresh core
# (선택) apt로 설치된 구버전 certbot 제거
sudo apt-get remove certbot
# snap으로 Certbot 설치
sudo snap install --classic certbot
# certbot 명령어 링크 생성
sudo ln -s /snap/bin/certbot /usr/bin/certbot
2단계: 와일드카드 인증서 발급 신청
와일드카드 인증서는 도메인 전체의 소유권을 증명해야 하므로, DNS 인증 방식을 사용해야 합니다.
- 아래 명령어를 실행하여 수동 DNS 인증을 시작합니다.Bash
-d옵션으로 와일드카드 도메인과 기본 도메인을 모두 지정해주는 것이 좋습니다.
sudo certbot certonly --manual --preferred-challenges=dns -d "*.jay-gemini.com" -d "jay-gemini.com" - 명령어를 실행하면 터미널에 DNS TXT 레코드를 추가하라는 안내가 나타납니다.
Please deploy a DNS TXT record under the name _acme-challenge.jay-gemini.com with the following value:[랜덤한 문자열이 여기에 표시됩니다]Before continuing, verify the record is deployed. Press Enter to Continue - 가비아 DNS 관리툴에 접속하여 위에서 안내받은 값으로 TXT 레코드를 추가합니다.
- 호스트명:
_acme-challenge - 값/내용: 터미널에 표시된
랜덤한 문자열 - 타입:
TXT
- 호스트명:
- DNS 레코드가 전파될 때까지 1~2분 정도 기다린 후, 다시 터미널로 돌아와
Enter키를 누릅니다. Certbot이 DNS를 확인하고 인증을 완료합니다. ✅ 성공! 인증서는 /etc/letsencrypt/live/jay-gemini.com/ 경로에 저장됩니다.
3단계: Nginx에 SSL 적용 및 HTTP 리디렉션
이제 발급받은 인증서를 Nginx에 설정하여 HTTPS를 활성화합니다.
- Nginx 설정 파일을 엽니다. (
/etc/nginx/sites-available/default또는 별도 설정 파일) - 아래와 같이
listen 80블록(HTTP)은listen 443블록(HTTPS)으로 리디렉션하도록 수정하고,443블록에 SSL 설정을 추가합니다.
Nginx
# =============================================================
# 1. 메인 프론트엔드 (jay-gemini.com)
# =============================================================
# HTTP (80) 접속을 HTTPS (443)으로 리디렉션
server {
listen 80;
server_name jay-gemini.com www.jay-gemini.com;
return 301 https://$host$request_uri;
}
# HTTPS (443) SSL 서버
server {
listen 443 ssl;
server_name jay-gemini.com www.jay-gemini.com;
# SSL 인증서 경로
ssl_certificate /etc/letsencrypt/live/jay-gemini.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/jay-gemini.com/privkey.pem;
# ... 기존 프록시 설정 등 ...
}
# =============================================================
# 2. 백엔드 API 및 Jenkins 등 서브도메인
# =============================================================
# jenkins.jay-gemini.com의 HTTP 리디렉션
server {
listen 80;
server_name jenkins.jay-gemini.com;
return 301 https://$host$request_uri;
}
# jenkins.jay-gemini.com의 HTTPS SSL 서버
server {
listen 443 ssl;
server_name jenkins.jay-gemini.com;
# 동일한 와일드카드 인증서 사용
ssl_certificate /etc/letsencrypt/live/jay-gemini.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/jay-gemini.com/privkey.pem;
# ... 기존 Jenkins 프록시 설정 등 ...
}
4단계: 설정 확인 및 Nginx 재시작
- 설정 파일의 문법 오류를 확인합니다.
sudo nginx -t - 테스트가 성공하면 Nginx를 재시작하여 설정을 적용합니다.
sudo systemctl restart nginx
🚨 중요: 수동 갱신
이 가이드에서 사용한 --manual 방식은 자동 갱신이 불가능합니다. Let’s Encrypt 인증서는 90일마다 만료되므로, 만료되기 전(약 60~80일 주기)에 수동으로 갱신해야 합니다.
- 갱신 시점이 되면 아래 명령어를 실행합니다.
sudo certbot renew --force-renewal - 2단계에서와 마찬가지로, 화면에 나타나는 새로운 TXT 레코드 값을 DNS에 업데이트하고 인증을 완료해야 합니다. 현재 85일 주기로 설정완료.