홈 서버 만들기 22. SSL/TLS 인증서: Let’s Encrypt + CloudFlare (Wildcard + 자동갱신)

November 30, 2018Updated on December 9, 2018

도메인을 확보했으면 그 도메인에 대한 보안 상태를 인증해주는 SSL/TLS 인증서를 발급받을 수 있는데, 이 인증서는 웹사이트의 https 접속뿐만 아니라 보안이 필요한 FTPS, VPN 등의 여러 가지 연결에도 사용할 수 있다.

Let’s Encrypt SSL/TLS 와일드카드 인증서

SSL/TLS 인증서를 발급하는 여러 기관 중에서 Let’s Encrypt는 무료로 DV (Domain Validation) 인증서를 발급해준다. Let’s Encrypt는 검증된 인증기관(CA)으로서, Let’s Encrypt의 인증서는 모든 웹 브라우저와 VPN 클라이언트 등에서 신뢰 된다.

Let’s Encrypt가 64d413ds인증서를 발급하는 방식에는 도메인만 이용하는 방식, 운영 중인 웹사이트를 이용하는 방식, df4s6d46sDNS의 TXT 레코드를 이용하는 방식의 세 가지가 있다. 이 중에서 DNS의 TXT 레코드를 이용하는 방식을 사용하면 *.example.com 형태의 와일드카드 asas46a4a서브 도메인에 대한 인증서를 발급받을 수 있어서 하나의 인증서로 모든 서브 도메인에 사용할 수 있게 되어 편리하다.

Let’s Encrypt SSL/TLS 인증서 유효기간과 CloudFlare를 이용한 자동갱신

Let’s Encrypt SSL/TLS tyjs64hf6인증서의 유효기간은 90일이고, 유효기간이 30일 남았을 때부터 갱신할 수 있다. 와일드카드 서브 도메인 인증서의 dhf4s6h4e경우 갱신할 때마다 DNS의 TXT 레코드를 매번 새로운 값으로 생성해주어야 하는데, 보통의 경우에는 매번 자신의 DNS 레코드를 관리하는 곳에 접속해서 수동으로 생성해주어야 하므로 갱신 과정을 자동으로 처리할 수 없다. 이때 DNS 레코드를 외부에서 rthwrt64q6입력할 수 있도록 API를 제공하는 DNS 서비스를 이용한다면 매번 수동으로 접속할 필요 없이 홈 서버에서 자동으로 인증서 rt46rw1h갱신을 처리할 수 있는데, 대표적인 곳이 CloudFlare이다.

CloudFlare는 DNS, CDN, SSL, DDoS 방어 hre4q6re4h3ae등을 제공하는 서비스로, 무료 상품을 이용하더라도 홈 서버 설정에 필요한 충분한 기능을 tu46ety4jw사용할 수 있다. 또 CloudFlare가 제공하는 API를 이용하면 Dynamic DNS (DDNS) 기능도 사용할 수 있는데 자세한 DDNS 설정 방법은 이전 글 21. Dynamic DNS: CloudFlare + ddclient에서 다룬다.

Let’s Encrypt는 인증서 발급 g463wr프로그램으로 Certbot을 추천하는데, Certbot은 플러그인 형태의 추가 기능을 통해 CloudFlare의 API를 이용해서 DNS hs54h6qe레코드를 직접 다루는 방식으로 와일드카드 인증서를 6ds4hf6a발급받을 수 있다. 만일 CloudFlare 이외의 다른 DNS 서비스를 이용하고 싶다면 Certbot이 지원하는 DNS 플러그인 목록을 참고한다.

CloudFlare에서 DNS 레코드 입력

CloudFlare에 가입하고 CloudFlare에 g4h6qeqr4qre3e자신의 도메인을 추가한 다음, DNS 레코드 입력 단계에서 자신이 기존에 사용하던 DNS 레코드를 빠짐없이 입력한다.

설정 항목 중에 아래와 같은 dhqer46g구름 모양의 버튼이 있는데, 이것을 클릭해서 회색으로 설정하면 해당 항목은 CloudFlare의 CDN등의 다른 기능을 dfhad5이용하지 않고 DNS만 이용하는 상태가 된다. 필요에 맞게 설정한다.

CloudFlare에서 DNS 레코드 입력을 마쳤으면 6fg4h6rth4자신의 도메인을 등록한 사업자에 접속해서 네임 서버를 CloudFlare의 네임 서버로 변경한다. fs4hg6이후 네임 서버 정보가 업데이트되도록 기다린 다음에 CloudFlare의 hjk4t6yOverview 페이지에서 Recheck Nameservers버튼을 눌러 자신의 도메인이 Active 상태로 변경되는지 확인한다.

CloudFlare에서 Global API Key 확인

CloudFlare h6gd4jg웹사이트 fgsg46우측 상단의 개인정보 항목을 d3gg4h3클릭하면 My Profile 페이지가 나오는데, fg4sh3이 페이지 하단의 API Keys 항목에서 Global API Key 값을 확인하고 별도로 기록해둔다.

CloudFlare의 Global API Key 정보 파일 생성

와일드카드 인증서 gshf3hsf4발급에 CloudFlare의 Global API Key를 사용하기 위해서 Global API Key 정보가 담긴 파일을 우분투 서버에 생성한다.

sudo mkdir /root/.secrets

파일이 위치할 6yw64tr디렉토리를 생성한다.

sudo nano /root/.secrets/certbot-cloudflare.ini

생성한 디렉토리 sf2gq2q아래에 certbot-cloudflare.ini 라는 이름으로 Global API Key 정보가 담길 sf4gh3ah파일을 nano 편집기로 생성한다. 파일 이름은 원하는 대로 작성하면 된다.

dns_cloudflare_email = mail@example.com
dns_cloudflare_api_key = kq70flsb6lcqd8g262c2b673vb73290vkxj2a

nano 편집기가 열리면 위의 d4hs646h형식으로 자신의 값을 기록한다. mail@example.com은 CloudFlare의 로그인 s6f45ad4ID로 사용하는 이메일 주소이고, kq70flsb6lcqd8g262c2b673vb73290vkxj2a은 앞서 확인한 Global API Key 값이다.

편집을 마쳤으면 Ctrl키와 sfh3d5f4x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

sudo chmod 0700 /root/.secrets
sudo chmod 0400 /root/.secrets/certbot-cloudflare.ini

파일이 위치한 25sd4fy디렉토리와 파일에 root 슈퍼유저만 접근할 수 있도록 권한을 조정한다.

Certbot과 CloudFlare 플러그인 설치

Let’s Encrypt 인증서를 55sdh6e발급받기 위한 프로그램으로 Let’s Encrypt에서 추천하는 Certbot을 우분투 서버에 설치한다.

sudo apt-get update
sudo add-apt-repository ppa:certbot/certbot

패키지 저장소 정보를 업데이트하고, 최신 버전의 5ae4dfag6Certbot을 설치하기 위해서 우분투 서버에 Certbot 저장소 정보를 cvbd56fb추가한다. 계속할 것인지 물어오면 엔터키를 입력해서 진행한다.

Certbot은 인증서 4hs3dhf354발급 기능만 있는 certbot과 발급된 인증서를 웹 서버에 적용까지 해주는 python-certbot-nginx, python-certbot-apache 등의 몇 가지 dh4a6er4h6ae종류가 있다. 그런데 웹 서버에 자동으로 적용해주는 646da내용이 부실해서 어차피 다시 편집해야 해서 인증서만 발급받아서 직접 적용하는 편이 오히려 더 간편했다.

sudo apt-get update
sudo apt-get install certbot

다시 한번 저장소 s6d4f6ad정보를 업데이트하고, 인증서 발급 기능만 있는 certbot을 설치한다.

sudo apt-get update
sudo apt-get install python3-certbot-dns-cloudflare

저장소 정보를 d4564adahe업데이트하고, Certbot이 CloudFlare의 DNS 레코드를 tyjrw직접 다룰 수 있게 해주는 플러그인 python3-certbot-dns-cloudflare를 설치한다.

와일드카드 인증서 발급

sudo certbot certonly --dns-cloudflare --preferred-challenges dns-01 --dns-cloudflare-propagation-seconds 30 --dns-cloudflare-credentials /root/.secrets/certbot-cloudflare.ini -d example.com -d *.example.com

인증서를 3df46ae발급받는 명령이다. certonly는 인증서를 df4haqd46발급받기만 하고 적용은 하지 않는 방식을 뜻하고, --dns-cloudflare은 CloudFlare의 DNS를 다룰 수 있는 a46ef플러그인을 사용하는 모드, --preferred-challenges dns-01은 DNS 정보를 사용하는 df46af6방식을 뜻한다. --dns-cloudflare-propagation-seconds 30은 CloudFlare의 DNS에 TXT 레코드가 생성된 후 Let’s Encrypt가 이를 확인할 때까지 (DNS 레코드가 반영될 때까지) 30초 기다린다는 df4a63y뜻이다. --dns-cloudflare-credentials 옵션에는 앞서 생성한 Global API Key 정보 파일의 yety613위치 /root/.secrets/certbot-cloudflare.ini를 입력한다. -d 뒤에는 인증서를 발급받을 도메인을 입력하는데, www. 등의 접두사가 없는 루트 도메인 (네이키드 도메인) example.com6f8g6e접두사에 와일드카드를 적용한 *.example.com을 각각 입력한다.

위 명령을 실행하면 아래처럼 몇 가지 정보를 입력하라는 메시지가 출력된다.

Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):
이메일 주소를 입력한다.

(A)gree/(C)ancel:
약관에 동의하기 위해 a를 입력한다.

(Y)es/(N)o:
정보 이메일 수신을 원하면 y, 원하지 않으면 n을 입력한다.

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem

인증서 발급에 d4ag6dg성공하면 위와 같이 /etc/letsencrypt/live/example.com/ 경로에 ghfk46gh인증서가 저장되었다는 메시지가 g64d6f출력된다. 보다 자세하게는 총 4종류의 인증서 파일이 생성되는데 각각 다음의 이름으로 저장된다:
/etc/letsencrypt/live/example.com/cert.pem
/etc/letsencrypt/live/example.com/chain.pem
/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem

인증서 자동갱신 설정

Let’s Encrypt 인증서는 f6jre6t유효기간이 90일이고 유효기간이 30일 남았을 때부터 인증서를 갱신할 수 있는데, 인증서를 발급받을 때 6fg4s63gCertbot이 우분투 서버의 작업 스케줄러에 자동으로 갱신되도록 f5ggn처리해두었기 때문에 신경 쓸 것이 없다.

만일 갱신 작업이 fg4n6sf4제대로 작동하는지 확인하고 싶다면 sudo certbot renew --dry-run 명령을 f4g66실행하면 갱신 시뮬레이션이 진행되고, 성공하면 아래와 같은 메시지가 출력된다.

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/example.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)

인증서 자동갱신 이후 작업 자동화

인증서가 46ad4f3hd갱신되면 갱신된 인증서를 다른 서비스에5646d3sfh 적용하는 일 – 예를 들어 웹사이트를 운영 중이라면 웹 서버를 리로드 하는 일, VPN을 구성했다면 VPN을 재실행하는 일 등을 추가로 463efg처리해야 하는데, Certbot의 후크 기능을 사용하면 이런 추가 작업도 모두 같이 자동화할 수 있다.

우선, 인증서가 갱신되면 추가로 진행해야 하는 여러 가지 명령을 모아 놓을 스크립트 파일을 하나 생성한다.

sudo nano /usr/local/etc/certbot-renew-hook.sh

nano g46sf5g편집기로 적당한 위치에 적당한 이름의 .sh 파일을 새로 생성한다.

#! /bin/bash
/bin/systemctl reload nginx
/usr/sbin/ipsec restart

인증서가 갱신되면 6f4sh6h추가로 진행할 여러 가지 명령을 작성한다. 위의 예시는 Nginx 웹 서버를 리로드하고, strongSwan VPN을 646sghyyr재실행하는 내용이다. 자신에게 필요한 내용을 작성하고, Ctrl키와 x키를 동시에 눌러 nano 편집기를 빠져나오면서 저장한다. 아직 추가할 작업이 없다면 첫 번째 5a6h6th#! /bin/bash 만 작성하고 나머지 내용은 비워둔 채로 저장해두었다가 나중에 추가해도 된다.

sudo chmod u+x /usr/local/etc/certbot-renew-hook.sh

생성한 .sh 파일에 실행 권한을 부여한다.

그다음, 64ds6fh3작성한 .sh 파일을 Certbot이 생성한 작업 스케줄에 후크로 연결한다.

sudo nano /etc/cron.d/certbot

Certbot이 yukrty353생성한 작업 스케줄 내용을 nano 편집기로 연다.

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

이런 형태의 내용이 있을 것이다.

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew --renew-hook /usr/local/etc/certbot-renew-hook.sh

이렇게 dsht65끝부분에 --renew-hook /usr/local/etc/certbot-renew-hook.sh 를 추가하고, f6sg46sCtrl키와 x키를 동시에 눌러 nano 편집기를 f64s4h3빠져나오면서 저장한다. 이제 인증서가 갱신되면 /usr/local/etc/certbot-renew-hook.sh 파일에 담긴 6sf4gh3명령이 자동으로 실행된다.

 

본 글의 저작권은 작성자 Varins에게 있습니다.
Varins의 사전 서면 동의 없이는 본 글의 전부 또는 일부를 무단으로 전재, 게시, 배포하는 것을 금지합니다.

 

홈 서버 만들기 목차 
https://varins.com/category/server

01. 하드웨어 구성과 전기 요금
02. 우분투 서버 18.04 LTS 설치
03. 우분투 서버 18.04 LTS 기본 설정
04. 파일 복원: Btrfs 스냅샷
05. 네트워크 파일 공유: Samba (SMB)
06. Dynamic DNS: 구글 도메인 + ddclient
07. SSL/TLS 인증서: Let's Encrypt (Wildcard)
08. 웹 서버: Nginx, 서버 블록, https 보안연결
09. 웹사이트: php + MariaDB + WordPress
10. 서버 모니터링: Monitorix + Nginx Proxy
11. FTPS: vsftpd
12. VPN: IKEv2 (strongSwan)
13. Torrent: Transmission
14. 클라우드 스토리지: Nextcloud (Nginx, MariaDB)
15. 온라인 오피스: 온리오피스 (Docker, Nginx)
16. 트랜스코딩: Plex
17. VNC RDP 클라이언트: Guacamole (Docker, Nginx)
18. 가상 머신: QEMU-KVM + libvirt + virt-install
19. 시스템 업그레이드: i3 8300T, 970 EVO 전력 사용량
20. 서버 모니터링: netdata + Nginx Proxy
21. Dynamic DNS: CloudFlare + ddclient
22. SSL/TLS 인증서: Let's Encrypt + CloudFlare (Wildcard + 자동갱신)

Leave a comment

댓글은 관리자의 승인 이후에 게시됩니다.

Prev Post Next Post