HTTPS 적용을 위해서는 Cloudflare와 같은 TLS/SSL 인증서 관리 기능을 제공하는 프록시 서버를 활용하거나, 서버에 직접 TLS/SSL 인증서를 발급 받아야 한다.
대부분의 무료 도메인 서비스는 루트 도메인을 관리하고, 사용자에게 해당 도메인의 서브도메인을 등록할 수 있는 기능을 제공하는 방식으로 운영된다.
Cloudflare는 네임서버 수준에서 도메인을 관리하기 때문에, 서브 도메인을 Cloudflare를 통해 관리하려면 반드시 루트 도메인을 Cloudflare에 추가하고 해당 도메인의 네임서버를 Cloudflare에서 제공한 값으로 변경해야한다.
하지만, 현재 사용 중인 도메인 서비스는 루트 도메인의 네임서버 변경을 허용하지 않기 때문에 무료 인증서를 제공해주는 Let’s Encrypt라는 CA로부터 직접 인증서를 발급 받아 활용하게 되었다.
대부분의 CA에는 인증서 발급 제한 정책이 있다.
Let’s Encrypt의 경우, 7일 동안 50개의 인증서를 발급 가능하고, 한 인증서에 100개의 도메인이 포함될 수 있다.
즉, 7일동안 5000개의 도메인만이 인증서를 발급 받을 수 있는 것이다.
심지어, 이는 전역적으로 적용되는 정책이므로 인증서 발급 요청이 많이 들어오는 도메인의 서브 도메인을 사용하는 경우에는 인증서 발급에 실패할 수 있다.
이번 프로젝트는 내도메인.한국
에서 제공하는 kro.kr
라는 도메인을 활용했다.
kro.kr
는 내도메인.한국
에서 제공하는 도메인 중에 가장 깔끔하고 인기있는 편이다.
그래서 그런지, 발급 제한 정책으로 인한 오류가 자주 발생하는 편이다. (이미 선택된 좌석입니다…)
그래서 좀 덜 인기있는(?) 도메인을 사용한다면, 편하게 발급 받을 수 있다.
하지만 …
다른 도메인이 너무 안이쁜 관계로 … kro.kr
를 사용하고 싶었다.
kro.kr
를 사용하면서, 인증서를 발급받기 위해서는 불가피하게 인증서 티케팅을 해야 했다.
하지만, 인증서 티케팅을 위해 터미널을 하염없이 바라 보고만 있을 수는 없는 법.
똑똑하게 티케팅을 하기 위해 at
이라는 유틸리티를 사용하기로 했다. (추가 설치가 필요하지만, 많은 메모리를 필요로 하지 않아 부담 없이 사용 가능하다 !)
at
은 특정 명령어를 정해진 시각에 실행되도록 예약을 걸어 놓을 수 있는 유틸리티다.
오류 메시지에 의하면 16:09 부터 다시 발급 요청을 보낼 수 있었고, 이 시간은 매번 조금씩 변동이 있기 때문에 발급 요청 예약을 16:00 ~ 16:30 까지 여러 개 걸어 놨다.
그 결과 인증서 발급 성공 !
Let’s Encrypt에서 발급 받은 인증서는 3개월의 유효기간을 갖는다.
따라서, 3개월마다 인증서를 갱신해줄 필요가 있다.
Certbot은 인증서 자동 갱신을 지원하지만, 갱신 이후에 후속 처리가 필요하다.
그래서 여유를 두고 2개월에 한번씩 아래 프로세스가 자동으로 실행되는 환경을 구성해두려 한다.
디스코드에서 발급 받은 web hook을 활용해서 쉘 스크립트를 작성해준다.
#!/bin/bash
send_webhook() {
local status_message="$1"
curl -H "Content-Type: application/json" \
-X POST \
-d "{\"content\": \"$status_message\"}" \
"${DISCORD_WEBHOOK_URL}"
}
output=$(sudo certbot renew --quiet --non-interactive 2>&1)
exit_code=$?
if [ $exit_code -ne 0 ]; then
send_webhook ":x: 갱신 실패!\n로그:\n$output"
else
sudo systemctl reload nginx
send_webhook ":white_check_mark: Certbot 갱신 성공!\nNginx가 재시작되었습니다."
fi
갱신에 성공하면 NginX를 reload 해주고 성공 메시지 전송, 갱신에 실패하면 발생한 오류 메시지와 함께 실패 메시지 전송하도록 작성했다.
webhook url은 다소 민감한 정보이므로, 스크립트에 노출되지 않게 환경 변수로 설정해주자.
그리고 2달에 한번 실행되도록 crontab을 등록해주면 된다.
나는 21일에 인증서를 발급 받았기 때문에, 2달에 한번 22일에 갱신되도록 설정했다.
0 0 22 */2 * /home/ubuntu/certbot_renew_discord.sh
crotab 설정은 crontab guru를 이용하면 간단하게 할 수 있다.
근데 설마, 갱신할 때도 티켓팅을 해야하나 ?
다행히도 그건 아니다.
인증서 갱신은 기존 인증서와 동일한 구성을 요청하는 것으로 발급 제한 정책으로 인한 문제는 발생하지 않는다.