Certbot을 이용한 SSL 인증서 발급+갱신

최근 인터넷 환경이 http에서 https로 넘어가면서 Chrome을 필두로 SSL 인증서를 요구하는 브라우저가 많아졌다.

따라서 운영하는 웹사이트에도 죄다 SSL 적용하고는 있는데, 보통은 유료이고 다행히 Let’s encrypt에서 무료로 인증서를 발급하고 있으므로 이것을 이용하고 있다. 단점은 상용 인증서와 달리 유효기간이 3개월이기 때문에 이 기간마다 연장을 해주어야 한다는 점이 있다.

Certbot은 이것을 자동으로 갱신해줄 수 있으며 또한 와일드 카드 인증서 (예 : *.xeriars.com)를 발급받을 수도 있다.

따라서 오늘은 이 과정을 어떻게 진행해야 하는지 글로 남겨본다.

설치 기준은 Ubuntu 20.04.01 TLS, apache2, cloudflare를 DNS로 사용하는 것을 기준으로 한다.

1. 일단 간단하게 시스템 업데이트부터 진행한다.

$ sudo apt update && sudo apt upgrade -y

2. snap을 설치한다.

$ sudo snap install core; sudo snap refresh core


mariadb 리포지터리에 오류가 난 것 같으나 일단 무시하고, snap을 설치했다.

3. snap으로 설치 할 예정이니, 기존에 certbot을 apt (데비안, 우분투), yum(centOS) 등으로 설치했다면 제거토록 한다.

$ sudo apt-get remove certbot (우분투)
$ sudo yum remove certbot (centOS)

4. certbot을 설치한다.

$ sudo snap install --classic certbot
$ sudo snap set certbot trust-plugin-with-root=ok


5. certbot을 구동할 수 있도록 심볼릭 링크를 생성한다.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot


6-1. 분기점. 간단히 1개 도메인만 (예 : xeriars.com, blog.xeriars.com) 인증서를 설치하려면 다음의 명령어를 입력한다.

$ sudo certbot --apache

xeriars.com/260 글 중간에도 자세히 설명되어있으므로 이 부분은 해당글을 참조하며, 별도 자세한 설정방법은 생략

6-2. 와일드 카드 인증서로 여러 서브 도메인(예 : xeriars.com, *.xeriars.com)을 한꺼번에 인증받으려면 다음의 명령어로 DNS 플러그인을 설치한다.

cloudflare를 DNS로 사용하는 기준이며, 다른 DNS는 s.xeriars.com/XTuA를 참조하여 DNS에 맞는 플러그인을 설치한다.

$ sudo snap install certbot-dns-cloudflare


7-1. 아마 설치가 끝났을테니 여기서 분기점 종료.

7-2. cloudflare에서 Global API key를 얻어온다.

접속후 My profile → API Tokens → Global API key에서 View를 클릭하면 볼 수 있다.

또는 로그인 후 s.xeriars.com/iyvT 로 바로 접속해도 된다.

8. 적당한 위치에 API키 정보를 저장해야한다. 아래와 같이 폴더를 하나 만들고 거기에 API키를 저장한다.

$ cd ~
$ mkdir secret
$ cd secret
$ nano secret_key.ini


9. API key 정보를 입력한다.

dns_cloudflare_email = "cloudflare 계정명"
dns_cloudflare_api_key = "Global API 키"

10. DNS에 도메인이 잘 물려있는지 확인한다.

DNS가 cloudflare로 설정되어있는 경우에는 Proxied connection으로 진행해도 문제없이 인증이 가능하다.

보통의 경우에는 도메인의 DNS 레코드와 서버 IP가 일치해야 진행이 되는데, Proxied connection이 되어있는 경우에는 일치되지 않아 인증서 발급 간 오류가 발생한다.

11. API key가 담긴 파일의 파일 권한을 설정한다.

$ chmod 700 ~/secret
$ chmod 400 ~/secret/secret_key.ini

12. 이제 거의 마지막 단계까지 왔다. 인증서를 발급받을 차례다.

$ certbot certonly
여기서 2번을 선택한다.


인증서를 발급할 도메인을 묻는다. 네이키드 도메인과 와일드카드 도메인을 입력해준다.

(예 : xeriars.com,*.xeriars.com)



조금 전에 저장해둔 Cloudflare의 API 정보를 요구한다. 파일이 저장된 경로를 입력하고 엔터.

11번 항의 chmod로 퍼미션 설정을 건너뛰면 이 단계에서 보안에 문제가 있을 수 있다고 경고문이 나온다.

인증서 발급이 완료되었다. 하지만 두가지 단계가 더 남았다.

13. 일단 발급된 인증서 정보를 확인해보자.

$ sudo certbot certificates


발급된 인증서는 89일이 남았고 도메인은 xeriars.com과 *.xeriars.com임이 확인된다.

도메인은 만료일이 20일 정도 남으면 메일이 오긴 하는데, 이게 매번 연장하기도 귀찮고 하니 crontab에 등록해두면 하루에 한 번씩 renew를 실행하고, 유효기간이 충분하면 skipping, 유효기간이 다가오면 renewal 작업을 수행하게 된다.

14. crontab으로 작업을 등록해둔다.

sudo crontab -e


아마 이렇게 파일 편집기를 뭐로 쓸지 물어보기도 하는데, 개인적으로는 nano가 편하므로 nano를 선택해주었다.

그리고 인증서 발급 시 루트권한 (또는 sudo)을 요구하므로 crontab도 루트 권한으로 실행시켜주어야 한다.

만약 crontab -e 입력 시 “Command not found”가 뜬다면 아래 명령어를 입력해 cron을 설치해주어야 한다.

sudo apt-get install cron

15. crontab에 아래의 구문을 추가한다.

* 4 * * * /usr/local/bin/certbot renew --quiet --post-hook "/usr/sbin/service apache2 restart" > /dev/null 2>&1

대략 새벽 4시쯤 certbot renew를 실행하며, 이후 service apache2 restart를 실행하므로

매일 renew와 아파치 서버가 재시작되는 명령어를 반복한다.



16. 마지막 단계까지 왔다. 아까 분기점에서 1번으로 했으면 안해도 되는 작업이긴 한데, 분기점에서 2번으로 왔다면 꼭 해주어야 하는 명령이 있다. 아파치 서버 설정 파일에 인증서 경로를 넣어주어야 한다.

$ cd /etc/apache2/sites-available
$ ls -al


서버 설정파일이 몇가지 있을텐데, 이미 사용중인 서버설정파일이 있다면 그것을 열어주고, 아니면 아무거나 하나 복사한 뒤 거기에 인증서 경로를 넣어주어야 한다.

sudo cp 000-default.conf xeriars.conf
sudo nano xeriars.conf

조금전에 인증서 정보를 조회한 이유가 있다. 인증서 경로가 출력되는데, 아래 스샷과 같이 해당 경로를 넣어준다.

Header always set Strict-Transport-Security "max-age=63072000"

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/xeriars.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/xeriars.com/privkey.pem


추가적으로 VirtualHost의 포트가 443인지도 확인한 후 저장 후 다시 빠져나온다.

17. 아파치가 해당 환경파일을 인식할 수 있도록 a2ensite로 등록한다.

$ sudo a2ensite xeriars.conf
$ sudo a2enmod headers
$ sudo a2enmod ssl
$ sudo a2enmod rewrite


설정 파일에 header를 등록했으므로 활성화되어있지 않다면 아파치 재시작 시 오류가 발생한다. 혹시 모르니 ssl도 활성화해주면 좋다. 밑져야 본전이니 일단 실행해보고 이미 활성화 되있으면 이미 활성화되어있다고 메시지만 뜨고 끝이지만, 활성화를 안해둔 상태로 아파치를 재시작하면 에러가 난다. 그리곤 원인을 찾느라 머리를 쥐어뜯겠지…

혹시 설정파일이 맘에 들지 않아 비활성화 하고 싶으면 a2dissite를 사용하고 설정 파일을 삭제하거나 수정할 수 있다.



a2ensite로 적용하고 나면 sites-enabled 디렉터리에 위와 같이 해당 설정파일이 심볼릭 링크로 적용되고 웹서버는 이 심볼릭 링크를 읽어서 모든 작업을 처리하게 된다.

여기까지 왔으면 이제 모든 작업이 끝났다.

이제 SSL 관련해서 갱신은 알아서 진행될 테니 신경쓰지 말고 살면 된다.

댓글 남기기