요즘은 SSL 인증서를 사용하지 않는 사이트는 거의 찾아보기가 힘들다. 브라우저에도 기본적으로 SSL 연결이 아니면 위험한 사이트로 표시하기 시작할 정도이다.
나는 옛날부터 무조건 ssl 인증서를 붙이긴 했지만 처음엔 유료 인증서를 사서 붙이다가 몇년 전에 Let's encrypt 라고 하는 무료 SSL 인증서가 나왔다.
그리고 작년인가? 제작년 부터는 Wild card 인증서도 지원하기 시작했고 잘 사용하고 있었다. 그런데 이게 불편한(귀찮은)점이 몇개 있다. 물론 무료라서 너무너무 감사하게 잘 사용하고 있지만 3개월마다 재 갱신해줘야 하는 불편함이 있었다.
개인적으로 관리하는 서버가 많아지는데 그동안 회사를 다니느라.. 라는 핑계로 SSL 인증서를 제시간에 업데이트 하지 않아서 갑자기 뜬금없이 SSL 인증서 expire 에러가 나면 그때마다 호다닥 발급받고 업데이트 하는 식으로 고치고 있었다 ㅎㅎ;
하지만! 이제는 시간이 많아지다보니 자동화를 도전해보았다.
현재 나는 4개 정도의 도메인을 가지고 있다.
그리고 최근 후배의 추천으로 모든 도메인의 네임서버를 Cloudflare 에서 사용하기로 했다.
첫번째 이유는 우리나라의 도메인을 판매하는 사이트에서 관리하기에는 제약사항이 있는곳이 많기 때문이다. 예를들어서 A레코드를 10개까지만 만들 수 있다던가..^^ 등등..
두번째 이유는 4개의 도메인을 한곳에서 사지 않고 업체 3개에서 구매했다. .io, .kr 등 여러가지 형태의 도메인을 가지고 있는데 어느 업체에서는 .io 를 판매하지 않는다던가 등의 이유로 A레코드나 CNAME 설정을 할때마다 기억이 가물가물한 상태로 업체를 떠올려내야 하고 아이디도 찾아야했기 때문이다. (관리가 복잡했음)
그래서 아예 처음엔 네임서버를 Cloudflare 로 이전해서 그곳에서 모든것을 관리하기로 했다. 심지어 나같은 개인 사용자에게는 무료 기능 만으로도 충분하니까 매우 만족스럽게 잘 사용하고 있다.
TMI지만.. 지금은 관리를 편하게 하기 위해 아예 도메인을 모두 AWS로 이전했고 네임서버는 Cloudflare 에서 관리 하고 있다.
보통 SSL 인증서 발급시 도메인 소유권 인증을 위해서 Let's encrypt 가 생성한 랜덤 문자열을 해당 도메인의 CNAME에 등록해서 인증하는 등의 방법으로 진행하는데
원래는 기존에는 본인이 직접 네임서버 관리 페이지(cafe 24, gabia 제공 콘솔 등)에 들어가서 수동으로 해당 문자열을 넣었을 것이다.
하지만 이미 다른 사람들이 cloudflare 와 Let's encrypt 를 연동하여 자동 인증을 할 수 있는 플러그인을 만들어 뒀기에 이것을 사용하여 자동 갱신을 설정할 것이다.
고로, 오늘 소개할 방법으로 SSL 인증서를 자동 발급/갱신을 하려면 해당 도메인이 Cloudflare의 네임서버를 사용하고 있어야 한다.
Cloudflare 에 오른쪽 상단에 My Profile
-> API Token
으로 들어가서 아래의 Global API Key
의 View
를 눌러서 본인의 API 키를 확인 한다.
그리고 본인의 이메일과 API를 아래와 같이 저장한다.
dns_cloudflare_api_key = APIKEY
dns_cloudflare_email = EMAIL@DOMAIN.COM
그리고 이것을 작업할 디렉터리에 cloudflare_cred.ini
로 저장하자
혹시 Docker가 설치되지 않은 상황이라면 https://docs.docker.com/engine/install/ubuntu/ 에서 간단하게 설치 커맨드가 나와있으니 참고하면 좋다.
Ubuntu를 사용한다는 전제로 진행을 해볼 것이다.
위의 Docker가 설치되어있고 Cloudflare credential 파일을 만들어뒀다면 아래 명령어만 실행하면 된다.
docker run --rm --name certbot -v '/etc/letsencrypt:/etc/letsencrypt' -v '/var/lib/letsencrypt:/var/lib/letsencrypt' certbot/dns-cloudflare certonly -d *.DOMAIN.KR --dns-cloudflare --dns-cloudflare-credentials ./cloudflare_cred.ini
처음 실행시 동의를 하거나 몇가지 요청이 있을것이다. 그런데 이후 갱신을 할때는 자동으로 갱신된다!
위에서 *.DOMAIN.KR
와 ./cloudflare_cred.ini
만 적절하게 바꿔주자. (PS. *는 wildcard 인증서를 받기 위해 붙였다.)
위 명령어를 실행하면 알아서 certbot(let's encrypt 공식 인증서 관리 툴)을 받고 cloudflare 플러그인도 설치해서 컨테이너를 띄워준다.
유저가 일일히 certbot 을 설치하는 등의 작업이 필요없다..!!
갱신 자동화 명령어 역시 동일하며 간단하게 crontab 에서 하루마다 실행하거나 1주마다 실행하거나 등등 자유롭게 세팅하면 된다.
나의 경우 매일 실행하도록 했다.
#!/bin/bash
echo "starting.." >> /root/cronlog.txt
docker run --rm --name certbot -v '/etc/letsencrypt:/etc/letsencrypt' -v '/var/lib/letsencrypt:/var/lib/letsencrypt' certbot/dns-cloudflare certonly -d *.DOMAIN1.COM --dns-cloudflare --dns-cloudflare-credentials ./cloudflare_cred.ini
docker run --rm --name certbot -v '/etc/letsencrypt:/etc/letsencrypt' -v '/var/lib/letsencrypt:/var/lib/letsencrypt' certbot/dns-cloudflare certonly -d *.DOMAIN2.COM --dns-cloudflare --dns-cloudflare-credentials ./cloudflare_cred.ini
docker run --rm --name certbot -v '/etc/letsencrypt:/etc/letsencrypt' -v '/var/lib/letsencrypt:/var/lib/letsencrypt' certbot/dns-cloudflare certonly -d *.DOMAIN3.COM --dns-cloudflare --dns-cloudflare-credentials ./cloudflare_cred.ini
echo "finish" >> /root/cronlog.txt
위를 run.sh 로 저장해두고 Crontab 에 아래와 같이 설정했다.
# // A part of content of crontab
# m h dom mon dow command
0 1 * * * /path/to/run.sh
위와 같이 저장해두면 매일 오전 1시에 실행될 것이다.
비슷한 방법으로 Cloudflare 말고 다른 서비스를 이용해서 갱신하고 싶다면 아래 링크에 certbot 이 지원하는 플러그인이 있는지 확인해보자