SSL 인증서는 서버가 돌아가는 도메인 별로 받는 것이 원칙이기 때문에, 외부로 노출된 서비스를 제공하는 서버 ( Docker, Jail, etc… ) 가 여러개 라면, 각각 따로 인증서를 받아야 한다. 하지만 리버스 프록시 서버를 운용하고 있다면 아주 간편하게 인증서를 한번에 몰아서 관리할 수 있다.
무료로 인증서를 받을 수 있는 Let’s Encrypt 를 이용한다. 고맙게도 설정 툴까지 배포하고 있기 때문에 HTTP 로 정상적으로 동작하게 설정되어 있으면, 손쉽게 인증서를 발급받고 적용 할 수 있다.
작업 순서
- certbot 설치
- certbot 실행
- 인증서 갱신 자동화
Certbot 설치
shell> pkg install certbot
shell> pkg install py39-certbot
certbot 을 설치한다. 만약 안된다면..
shell> pkg search certbot
py39-certbot-2.8.0,1 Let's Encrypt client
py39-certbot-apache-2.8.0 Apache plugin for Certbot
....
패키지 검색해서 설치한다.
certbot 실행
certbot 을 실행하면 모든 것을 자동으로 해 준다. 뭔가 잘못되지만 않았다면… certbot 은 utf-8 만 읽을 수 있으므로, conf 파일 내에 한글로 주석을 쓰고 ASCII 로 저장하면 안된다.
shell> certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Which names would you like to activate HTTPS for?
We recommend selecting either all domains, or all domains in a VirtualHost/server block.
-----------------------------------------------------------------------------------------
1: blog.gerd.kr
2: cloud.gerd.kr
3: git.gerd.kr
-----------------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):
엔터 치면 지가 알아서 다 해준다. 그리고 잊지말고 nginx 를 재시작한다.
shell> service nginx restart
인증서 갱신 자동화
Let’s Encrypt 인증서는 3달간만 유효하기 때문에, 주기적으로 갱신해 줘야 한다. crontab 을 이용해서 자동화한다.
shell> crontab -e
vi 에디터가 열린다. 여기에 문법에 맞춰 넣는다. 분, 시, 일, 월, 요일 순이다. 나는 매월 23일 오전 4시에 “certbot renew” 를 실행하고 nginx 를 재시작 하도록 설정했다.
0 4 23 * * certbot renew --renew-hook="service nginx restart"
수정이 완료되면 ESC -> : -> wq 로 저장한다.
작성한 명령을 확인하려면 -l 옵션을 사용한다.
shell> crontab -l
0 4 24 * * certbot renew --renew-hook="service nginx restart"
확인
인증서 적용이 끝났다. 접속해 보면… 아마 개판이 났을 거다. certbot 은 원래 있던 HTTP 접속을 HTTPS 로 강제로 넘겨버리도록 설정 파일을 바꿔버린다.
대부분의 웹 서비스는 HTTPS 설정을 따로 해 줘야 한다. 특히 워드프레스 같은 거… 그거 설정이 좀 빡친다. 문제가 생기면, ReverseProxy 의 설정파일을 편집해서 HTTP 접속을 살리고, 각 웹서비스 설정을 먼저 하는 것이 좋다. 불가피하게 먼저 HTTPS 설정이 되어 있다면 내부 IP 를 이용해 HTTP 로 설치를 해야 한다. 잔머리 굴린답시고 HTTPS 를 먼저 설정한 다음 설치하면 아예 설치가 제대로 안 된다. 존나 삽질…
그래도 한번만 제대로 하면 되니까, 간바레다.