개요 - TLS와 Let’s Encrypt
서버(NAS)와 인터넷을 사용한 통신에서 주고받는 정보는 외부에 노출이 되기 때문에 민감한 정보를 송수신하는 경우라면 TLS인증서를 발급받아 암호화하여 송수신하는 것이 권장됩니다.
TLS 인증서를 발급하는 여러 기관 중 Let’s Encrypt는 사용자에게 무료로 TLS 인증서를 발급해주는 비영리기관입니다. 모질라 재단, 페이스북, 구글 등 많은 업체가 스폰서로 등록되어 있으며 발급 및 갱신이 완전 자동화가 가능한 DV (Domain Validated) 인증서를 무료로 발급해 줍니다.
Let’s Encrypt는 루트 도메인 (네이키드 도메인), 특정 서브 도메인뿐만 아니라, *. example.com 형태의 와일드카드 서브 도메인 인증서도 무료로 발급받을 수 있어서 하나의 인증서로 모든 서브 도메인에 사용할 수 있어 편리합니다.
하지만 와일드카드 서브 도메인 인증서는 인증서는 발급 및 갱신시 DNS의 TXT 레코드를 새로 생성해야 합니다. 때문에 외부에서 TXT 레코드를 프로그램을 통해 입력할 수 있도록 DNS가 API 제공하는 경우 발급 및 갱신 과정을 손쉽게 자동화할 수 있습니다.
앞서 DNS 레코드를 Freenom에 설정하였으나 Freenom의 DNS는 API를 제공하지 않기 때문에 여기서는 TLS 인증서 발급을 자동화 하기 위해 DigitalOcean의 무료 DNS를 사용하겠습니다.
※ API 를 제공하지 않는 경우는 직접 구현할 수도 있으나 해당 내용은 본 글의 범위를 넘어가므로 다루지 않습니다.
인증서 발급 및 자동갱신
DigitalOcean설정
DNS 레코드 설정
DigitalOcean에 가입 후 Freenom에서 발급받은 도메인 정보를 추가합니다.
[Networking] → [Domains] → [Add a domain]
Freenom DNS에 입력하였던 것과 같은 방식으로 DNS 레코드를 입력 후, [Create Record]로 레코드를 생성합니다.
입력한 각 항목은 다음과 같습니다.
HOST NAME
레코드로 연결할 도메인 또는 서브도메인입니다. 루트도메인(example.com
)을 연결하는 경우 DigitalOcean에서는 해당 항목에 @
를 입력합니다.
Type - A/AAAA
레코드의 종류입니다. A/AAAA 레코드는 도메인 및 서브도메인을 VPS의 IP 주소와 연결할 때 선택합니다. 레코드에 포함한 공인 IP 주소의 형식에 따라 선택합니다. IPv4 형식의 주소는 A 레코드, IPv6 형식의 주소는 AAAA 레코드로 선택합니다.
TTL (SECONDS)
각 DNS 레코드는 TTL (Time To Live) 값을 설정하는데, TTL(Time To Live)은 DNS 레코드 값이 얼나마 오랫동안 갱신하지 않을 것인지를 결정합니다. 만일 A 레코드를 생성하면서 TTL을 1시간(3600
)으로 설정했고 20분 뒤에 다시 A 레코드를 변경했다면 새로 변경된 A 레코드는 40분 후에 반영된다.
WILL DIRECT TO
해당 레코드가 연결할 VPS의 공인 IP 주소입니다.
API Token 획득
DigitalOcean 계정의 Applications & API Tokens page에서 토큰을 생성한 후 메모해 놓습니다.
freenom 설정
DigitalOcean에서 DNS 레코드 입력을 마쳤으면 freenom에 접속해서 네임 서버를 DigitalOcean의 네임 서버로 변경합니다.
[Services] → [My Domains] → example.com
의 [Manage Domain] → [Manage ment Tools] → [Nameservers] → [Use custom nameservers (enter below)]를 선택합니다.
아래의 내용을 입력한 후 [Change NameServers]를 선택합니다.
[Nameserver 1] : NS1.DIGITALOCEAN.COM
[Nameserver 2] : NS2.DIGITALOCEAN.COM
[Nameserver 3] : NS3.DIGITALOCEAN.COM
서버 설정
API 정보 파일 생성
*.example.com
형식의 와일드카드 인증서 발급을 위해 Certbot이 DigitalOcean의 DNS 레코드 값을 설정하도록 API Token 값을 저장한 파일을 서버에 생성합니다.
파일을 저장할 디렉토리를 생성합니다.
mkdir -p ~/.secrets/certbot/
생성한 디렉토리 아래에 digitalocean.ini
라는 이름으로 API Token 정보를 저장할 파일을 생성합니다.
vim ~/.secrets/certbot/digitalocean.ini
내용은 다음과 같이 입력합니다. 여기서 0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff
은 앞서 기록해 놓은 API Token 값입니다.
# DigitalOcean API credentials used by Certbot
dns_digitalocean_token = 0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff
해당 파일은 오라클 VPS의 기본 계정인 ubuntu
에서만 접근할 수 있도록 권한을 조정합니다.
sudo chmod 0600 ~/.secrets/certbot/digitalocean.ini
Certbot 설치
Let’s Encrypt가 추천하는 인증서 발급 프로그램인 Certbot과 와일드카드 인증서 자동 갱신을 위한 Digital Ocean용 DNS 플러그인을 설치합니다.
sudo apt update
sudo apt install snapd -y
sudo snap install --beta --classic certbot
sudo snap set certbot trust-plugin-with-root=ok
Certbot의 Digital Ocean 용 DNS 플러그인 certbot-dns-digitalocean
를 설치합니다.
sudo apt update
sudo snap install --beta certbot-dns-digitalocean
DNS 플러그인과 Certbot을 연결합니다.
sudo snap connect certbot:plugin certbot-dns-digitalocean
인증서 발급
다음 명령을 실행하여 루트 인증서와 와일드카드 인증서가 발급받습니다.
※ example.com
과 *.example.com
은 자신의 도메인명으로 수정합니다.
sudo certbot certonly \
--dns-digitalocean \
--dns-digitalocean-propagation-seconds 60 \
--dns-digitalocean-credentials ~/.secrets/certbot/digitalocean.ini \
-d example.com \
-d *.example.com
사용된 옵션의 내용은 다음과 같습니다.
certonly
: 인증서 발급만 진행--dns-digitalocean
: DigitalOcean 플러그인 사용--dns-digitalocean-propagation-seconds 60
: DNS에 TXT 레코드 생성 60초 후 확인--dns-digitalocean-credentials
: API Token 파일의 위치-d
인증서를 발급 대상 도메인
위 명령을 실행하면 몇 가지 정보를 입력하라는 메시지가 출력됩니다.
인증과 관련된 공지를 수신할 이메일 주소
, 약관에 동의 (A
), 정보성 이메일 수신 여부(N
) 을 순서대로 입력합니다.
인증서 발급에 성공하면 /etc/letsencrypt/live/example.com/
디렉터리에 인증서가 저장되었다는 메시지가 출력됩니다.
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
해당 폴더를 살펴보면 총 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 인증서는 유효기간이 90일이고 유효기간이 30일 남았을 때부터 인증서를 갱신할 수 있습니다. 우분투의 경우 Certbot을 설치하면 우분투 서버의 작업 스케줄러에 인증서 자동 갱신 명령이 추가되기 때문에 신경 쓸 것이 없습니다.
인증서 자동 갱신 확인
스케줄이 잘 적용되었는지 확인하려면 sudo systemctl status certbot.timer
명령을 실행해 스케줄러의 상태를 확인할 수 있습니다.
● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor prese
t: enabled)
Active: active (waiting) since Fri 2020-08-21 05:11:34 UTC; 1
day 8h ago
Trigger: Sat 2020-08-22 14:06:52 UTC; 21min left
Triggers: ● certbot.service
Aug 21 05:11:34 instance-20200820-1150 systemd[1]: Started Run certbot twice
daily.
만일 갱신 작업이 제대로 작동하는지 확인하고 싶다면 sudo certbot renew --dry-run
명령을 실행하면 갱신 시뮬레이션이 진행됩니다. 갱신작업이 성공하면 다음과 같은 메시지가 출력됩니다.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator dns-digitalocean, Installer None
Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for example.com
dns-01 challenge for example.com
Waiting 60 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/example.com/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates below have not been saved.)
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.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
정리
이번글에서는 Lets Encrypt에서 제공하는 무료 TLS 인증서를 발급받고 자동 갱신을 위한 구성을 맞췄습니다. 여기서 발급 받은 TLS 인증서는 추후 웹서버 소프트웨어에서 활용하여 NAS의 보안성을 높이는데 사용할 것입니다.
다음 글에서는 NAS로 제공하는 서비스를 편리하게 설치하고 관리할 수 있는 가상화 소프트웨어인 Docker를 설치하겠습니다.
참고
'기타' 카테고리의 다른 글
[자작 NAS] 6. 토렌트 클라이언트 - Transmission (0) | 2020.09.07 |
---|---|
[자작 NAS] 5. 웹 서버 설치 및 설정 - Nginx (1/2) (0) | 2020.09.05 |
[자작 NAS] 2. 무료 도메인 신청 및 DNS 설정 (0) | 2020.08.28 |
외부 JavaScript 불러오기 (async, defer) (0) | 2020.07.08 |
JavaScript로 PWA 만들기 - 캐시 업데이트 반영하기 (0) | 2020.06.17 |