이전 포스팅들은 워드프레스 호스팅을 사용해서 워드프레스 사이트를 구축하는 것을 알려드리겠습니다. 이번 포스팅에서는 직접 서버 호스팅을 할 경우 필요한 절차를 설명드리고자 합니다. 먼저 Cloudflare를 사용하면서 Let’s Encrypt SSL 인증서를 발급받아 Nginx 웹 서버에 적용하는 방법을 알아보겠습니다. 이 과정은 처음 해보시는 분들도 따라하기 쉽게 단계별로 설명해 드리겠습니다.
목차
- 사전 준비
- Cloudflare 설정하기
- Let’s Encrypt SSL 인증서 발급받기
- Nginx에 SSL 인증서 적용하기
- SSL 설정 테스트 및 자동 갱신 설정
- 문제 해결 및 팁
사전 준비
시작하기 전에 다음 항목들이 준비되어 있는지 확인해주세요:
- Ubuntu 또는 Debian 기반 리눅스 서버 (이 가이드는 Ubuntu 22.04 LTS 기준)
- 설치된 Nginx 웹 서버
- 도메인 (이 가이드에서는
uncleguru.net
사용) - 이메일 주소 (이 가이드에서는
[email protected]
사용) - 서버에 대한 SSH 접속 권한 (root 또는 sudo 권한)
Cloudflare 설정하기
1. Cloudflare 계정 생성 및 도메인 추가
- Cloudflare 웹사이트에 접속하여 계정을 생성합니다.
- 로그인 후 “사이트 추가” 버튼을 클릭하고
uncleguru.net
도메인을 입력합니다. - Cloudflare가 도메인의 DNS 레코드를 스캔할 때까지 기다립니다.
- 스캔이 완료되면 요금제를 선택합니다. 무료 요금제로 시작해도 충분합니다.
2. DNS 레코드 설정하기
- DNS 레코드 페이지에서 기존 레코드를 확인하고 필요한 레코드를 추가합니다.
- 웹 서버를 가리키는 A 레코드를 추가합니다:
- 유형: A
- 이름:
uncleguru.net
(또는 @) - IPv4 주소: [서버 IP 주소]
- 프록시 상태: 프록시됨 (회색 구름 아이콘이 주황색으로 변경)
- www 서브도메인을 추가하고 싶다면:
- 유형: A
- 이름: www
- IPv4 주소: [서버 IP 주소]
- 프록시 상태: 프록시됨
3. 네임서버 변경하기
- Cloudflare가 제공하는 네임서버 정보를 확인합니다.
- 도메인 등록 대행사(Registrar) 웹사이트에 로그인합니다.
- 도메인 관리 페이지에서 네임서버 설정을 찾아 Cloudflare에서 제공한 네임서버로 변경합니다.
- 이 변경사항이 적용되기까지 최대 24시간이 소요될 수 있습니다.
4. SSL/TLS 설정하기
- Cloudflare 대시보드에서 “SSL/TLS” 탭으로 이동합니다.
“개요” 섹션에서 암호화 모드를 “전체(엄격)”로 설정합니다.
- 이 설정은 Let’s Encrypt 인증서를 설치한 후에 변경할 것입니다.
- 이 설정은 Let’s Encrypt 인증서를 설치한 후에 변경할 것입니다.
“Edge 인증서” 섹션에서 “항상 HTTPS 사용”을 활성화합니다.
Let’s Encrypt SSL 인증서 발급받기
1. Certbot과 DNS Cloudflare 플러그인 설치하기
서버에 SSH로 접속한 후 다음 명령어를 실행하여 Certbot과 Cloudflare DNS 플러그인을 설치합니다:
sudo apt update
sudo apt install certbot python3-certbot-dns-cloudflare
2. Cloudflare API 토큰 설정하기
Certbot DNS 플러그인이 Cloudflare API와 통신하기 위해 API 토큰이 필요합니다:
- Cloudflare 대시보드에 로그인합니다.
- 오른쪽 상단의 프로필 아이콘을 클릭한 후 “내 프로필”을 선택합니다.
- “API 토큰” 탭으로 이동합니다.
- “토큰 생성”을 클릭합니다.
- “사용자 정의 토큰 생성”을 선택합니다.
- 토큰 이름을 “Certbot DNS Validation”으로 입력합니다.
- 권한을 다음과 같이 설정합니다:
- 영역(Zone) – DNS – 편집(Edit)
- 영역(Zone) – 영역(Zone) – 읽기(Read)
- 영역리소스(Zone Resources)를 “포함(Include) – 특정영역(Specific zone) – uncleguru.net”으로 설정합니다. 또는 하나의 API 토큰으로 모든영역으로 설정하려면, “모든영역”을 선택합니다.
- “계속하기”를 클릭하여 토큰을 생성합니다.
- 생성된 토큰을 안전한 곳에 복사해 둡니다 (이 토큰은 한 번만 표시됩니다).
3. Cloudflare API 설정 파일 생성하기
서버에서 Cloudflare 자격 증명 파일을 생성합니다:
sudo mkdir -p /etc/letsencrypt/cloudflare
sudo nano /etc/letsencrypt/cloudflare/cloudflare.ini
파일에 다음 내용을 추가합니다 (YOURAPITOKEN은 앞서 생성한 토큰으로 대체):
# Cloudflare API 토큰
dns_cloudflare_api_token = YOUR_API_TOKEN
파일의 권한을 제한하여 보안을 강화합니다:
sudo chmod 600 /etc/letsencrypt/cloudflare/cloudflare.ini
4. SSL 인증서 발급받기
DNS 플러그인을 사용하여 Let’s Encrypt SSL 인증서를 발급받습니다:
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare/cloudflare.ini -d uncleguru.net -d www.uncleguru.net --email [email protected] --agree-tos --preferred-challenges dns-01
위 명령어는:
– --dns-cloudflare
: Cloudflare DNS 플러그인을 사용합니다.
– --dns-cloudflare-credentials
: Cloudflare API 토큰 파일의 경로를 지정합니다.
– -d uncleguru.net -d www.uncleguru.net
: 인증서에 포함할 도메인을 지정합니다.
– --email [email protected]
: 인증서 관련 알림을 받을 이메일 주소를 지정합니다.
– --agree-tos
: Let’s Encrypt의 서비스 약관에 동의합니다.
– --preferred-challenges dns-01
: DNS 챌린지 방식을 사용합니다.
Certbot은 다음과 같은 작업을 자동으로 수행합니다:
1. Cloudflare DNS에 TXT 레코드를 추가하여 도메인 소유권을 확인합니다.
2. SSL 인증서를 발급받습니다.
3. 인증이 완료되면 TXT 레코드를 자동으로 제거합니다.
도메인 명은 와일드 카드(*) 방식도 가능합니다. 아래 Certbot-DNS-Cloudflare 플러그인 관련을 참고하세요.
만일 인증서 발급에 오류가 발생한다면, Claudflare와 통신 시에 정보가 준비가 되지 않아서 그럴 수 있으니 다시 시도해 보거나, 아래 DNS 전파 지연 부분을 참고하기 바란다.
Nginx에 SSL 인증서 적용하기
certonly 옵션으로 인증서를 발급 받았기 때문에 Nginx 설정은 수동을 설정해 줘야 합니다.
1. Nginx 설정 파일 생성 또는 수정하기
sudo nano /etc/nginx/sites-available/uncleguru.net
다음과 같이 설정 파일을 작성합니다:
# HTTP 요청을 HTTPS로 리디렉션
server {
listen 80;
listen [::]:80;
server_name uncleguru.net www.uncleguru.net;
# HTTPS로 리디렉션
return 301 https://$host$request_uri;
}
# HTTPS 서버 설정
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name uncleguru.net www.uncleguru.net;
# Let's Encrypt SSL 인증서 경로
ssl_certificate /etc/letsencrypt/live/uncleguru.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/uncleguru.net/privkey.pem;
# SSL 설정 최적화
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
# Cloudflare DNS 서버를 resolver로 사용
resolver 1.1.1.1 1.0.0.1 valid=300s;
resolver_timeout 5s;
# 보안 헤더 추가
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
add_header X-XSS-Protection "1; mode=block";
# 웹사이트 루트 디렉토리 설정
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
# 추가 설정 (PHP, Proxy 등)은 필요에 따라 여기에 추가
}
2. 심볼릭 링크 생성 및 Nginx 설정 테스트
# 심볼릭 링크 생성
sudo ln -s /etc/nginx/sites-available/uncleguru.net /etc/nginx/sites-enabled/
# 기본 설정 파일 제거 (선택 사항)
sudo rm /etc/nginx/sites-enabled/default
# Nginx 설정 테스트
sudo nginx -t
설정에 문제가 없다면 다음과 같은 메시지가 표시됩니다:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
3. Nginx 재시작
sudo systemctl restart nginx
SSL 설정 테스트 및 자동 갱신 설정
1. SSL 설정 테스트하기
웹사이트의 SSL 설정을 테스트하려면 다음 사이트를 이용하세요:
– SSL Labs에서 uncleguru.net
을 검색하여 SSL 설정을 확인합니다.
– 웹 브라우저에서 https://uncleguru.net
에 접속하여 자물쇠 아이콘이 표시되는지 확인합니다.
2. Let’s Encrypt 인증서 자동 갱신 설정
DNS 플러그인을 사용할 경우에도 Let’s Encrypt 인증서는 90일마다 갱신해야 합니다. 자동 갱신을 설정하려면:
sudo systemctl status certbot.timer
이 명령어로 Certbot timer가 활성화되어 있는지 확인합니다. 자동 갱신 테스트:
sudo certbot renew --dry-run
문제 없이 실행되면 자동 갱신이 올바르게 설정된 것입니다.
3. 인증서 갱신 후 Nginx 재시작 설정
인증서가 갱신될 때마다 Nginx를 자동으로 재시작하도록 설정합니다:
sudo mkdir -p /etc/letsencrypt/renewal-hooks/post
sudo nano /etc/letsencrypt/renewal-hooks/post/nginx-reload.sh
스크립트에 다음 내용을 추가합니다:
#!/bin/sh
nginx -t && systemctl reload nginx
스크립트에 실행 권한을 부여합니다:
sudo chmod +x /etc/letsencrypt/renewal-hooks/post/nginx-reload.sh
4. DNS 인증 자동 갱신 설정
certbot-dns-cloudflare 플러그인을 사용한 자동 갱신을 위해 다음과 같이 갱신 설정 파일을 수정합니다:
sudo nano /etc/letsencrypt/renewal/uncleguru.net.conf
파일에 다음 내용이 포함되어 있는지 확인합니다:
authenticator = dns-cloudflare
dns_cloudflare_credentials = /etc/letsencrypt/cloudflare/cloudflare.ini
이 설정이 없다면 추가해주세요. 이렇게 하면 갱신 시에도 동일한 DNS 인증 방식을 사용합니다.
문제 해결 및 팁
Certbot-DNS-Cloudflare 플러그인 관련 문제
API 토큰 권한 문제
- API 토큰이 올바른 권한을 가지고 있는지 확인하세요 (Zone DNS Edit 및 Zone Zone Read).
- 토큰이 특정 도메인에만 접근할 수 있도록 제한되어 있는 경우, 해당 도메인이 올바르게 설정되어 있는지 확인하세요.
DNS 전파 지연
- DNS 챌린지 방식은 DNS 레코드가 전파될 때까지 기다려야 합니다.
인증 실패 시
--dns-cloudflare-propagation-seconds
옵션을 추가하여 대기 시간을 늘릴 수 있습니다:sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare/cloudflare.ini -d uncleguru.net -d www.uncleguru.net --dns-cloudflare-propagation-seconds 60
와일드카드 인증서 발급
DNS 챌린지 방식을 사용하면 와일드카드 인증서를 쉽게 발급받을 수 있습니다:
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare/cloudflare.ini -d uncleguru.net -d *.uncleguru.net
Cloudflare와 관련된 일반적인 문제
SSL 모드 설정
- Cloudflare의 SSL/TLS 모드는 “전체(Strict)”로 설정하는 것이 좋습니다.
- 인증서가 설치된 후에는 “전체(Strict)” 모드를 사용하여 Cloudflare와 원본 서버 간의 연결도 암호화하세요.
혼합 콘텐츠 경고
- Cloudflare 대시보드에서 “SSL/TLS” > “Edge 인증서” > “항상 HTTPS 사용” 옵션을 활성화하세요.
- 웹사이트의 모든 자원(이미지, 스크립트 등)이 HTTPS를 사용하는지 확인하세요.
Cloudflare 캐싱 문제
- 캐시를 비우려면 Cloudflare 대시보드의 “캐시” > “캐시 비우기”를 사용하세요.
Nginx와 관련된 일반적인 문제
502 Bad Gateway 오류
- Nginx 오류 로그를 확인하세요:
sudo tail -f /var/log/nginx/error.log
- 백엔드 서버가 실행 중인지 확인하세요.
- Nginx 오류 로그를 확인하세요:
설정 변경 후 Nginx가 시작되지 않음
- 설정 파일의 문법을 확인하세요:
sudo nginx -t
- 오류 메시지를 검토하고 문제를 해결하세요.
- 설정 파일의 문법을 확인하세요:
자동 갱신 관련 팁
자동 갱신 로그 확인
- 자동 갱신 로그를 확인하려면:
sudo journalctl -u certbot.timer
- 갱신 프로세스 로그:
sudo journalctl -u certbot.service
- 자동 갱신 로그를 확인하려면:
API 토큰 보안
- Cloudflare API 토큰은 주기적으로 갱신하는 것이 좋습니다.
- 토큰 파일의 권한이 600으로 설정되어 있는지 확인하세요.
백업 설정
중요한 파일을 백업해 두세요:
sudo cp -r /etc/letsencrypt /path/to/backup/letsencrypt-backup
마무리
이제 여러분은 Cloudflare와 Let’s Encrypt의 DNS-Cloudflare 플러그인을 사용하여 Nginx 웹 서버에 SSL을 설정하는 방법을 배웠습니다. 이 방법의 주요 장점은 다음과 같습니다:
- Cloudflare 프록시 비활성화 불필요: DNS 챌린지 방식을 사용하므로 인증서 발급 과정에서 Cloudflare 프록시를 비활성화할 필요가 없어 보안이 강화됩니다.
- 와일드카드 인증서 지원: DNS 인증 방식을 통해 와일드카드 인증서(*.uncleguru.net)를 쉽게 발급받을 수 있습니다.
- 자동화 용이: API 토큰을 사용하여 인증서 발급 및 갱신 과정을 완전히 자동화할 수 있습니다.
- 보안 향상: HTTP 인증 방식과 달리, DNS 챌린지는 80번 포트를 열지 않아도 됩니다.
이 설정을 통해 웹사이트는 다음과 같은 이점을 얻을 수 있습니다:
- HTTPS를 통한 안전한 통신
- Cloudflare의 DDoS 방어 기능
- 무료 SSL 인증서 자동 갱신
- 와일드카드 인증서 지원으로 모든 서브도메인 보호
질문이나 의견이 있으시면 댓글로 남겨주세요!
작성자: Uncle Guru
이메일: [email protected]
웹사이트: uncleguru.net