docker를 이용한 certbot 자동갱신 (윈도우, 리눅스)
certbot, certificate, docker, letsencrypt, nginx, ssl, windows, wsl
서론
certbot으로 3개월 마다 갱신하다가 귀찮아서 docker로 자동갱신 적용해봤습니다. nginx를 기준으로 설명하지만 다른 것도 크게 다르지 않습니다.
certbot을 써보시면 아시겠지만… 갱신하다보면 어느날 갑자기 동작 안하는 경우가 있습니다. 그럼 깔끔하게 지우고 다시 설치하고를 반복하는데요.. 도커를 써서 외부에서 발급받도록 해보겠습니다.
windows 사용자의 경우는 wsl을 이용하시면 됩니다.
- wsl 설치: https://gs.saro.me/2024/07/02/k8s-1.html (wsl 재설치 방법 부분 참고)
적용법
- 일단 certbot 용으로 사용할 폴더를 만들어줍니다.
- 필자는 /certbot 으로 만들었습니다. (기본폴더를 /certbot로 설명하겠습니다.)
- 폴더구조
- certbot
- nonce (acme-challenge를 위한 디렉토리)
- cert (완료된 cert가 저장될 디렉토리)
# 윈도우라면 c:/certbot 으로 만들어주세요. # 윈도우에서 wsl을 통해 c:/certbot을 사용하려면 /mnt/c/certbot 으로 사용하시면 됩니다. mkdir /certbot mkdir /certbot/nonce mkdir /certbot/cert
- certbot
- acme-challenge를 위한 nginx 설정
# 기본값 server { # 80 포드 설정 listen 80; # 생략... # acme-challenge를 위한 설정 # 예를들어 도메인이 saro.me라면 # http://saro.me/.well-known/acme-challenge/1.txt 에 접근하면 # /certbot/nonce/.well-known/acme-challenge/1.txt 가 출력되면 됩니다. # 윈도우라면 alias c:/certbot/nonce/.well-known/acme-challenge/; 정도가 되겠네요. location /.well-known/acme-challenge/ { alias /certbot/nonce/.well-known/acme-challenge/; } # 생략 ... }
- 다시 certbot 폴더로 가서 certbot_renew.sh 을 만들어보자.
예를들어 saro.me, www.saro.me, gs.saro.me 이렇게 3개의 도메인을 사용한다면 아래처럼 써보자
docker run -it --rm --name certbot \ -v "/certbot/nonce:/var/www/certbot" \ -v "/certbot:/etc/letsencrypt" \ certbot/certbot certonly \ --webroot -w /var/www/certbot \ -d saro.me -d www.saro.me -d gs.saro.me \ --email test@saro.me --agree-tos --no-eff-email cp --dereference -f /certbot/live/saro.me/* /certbot/cert/. rm -rf /certbot/accounts rm -rf /certbot/archive rm -rf /certbot/live rm -rf /certbot/renewal rm -rf /certbot/renewal-hooks
- docker run -it –rm –name certbot
certbot/certbot certonly
- certbot 도커 이미지를 통해 컨테이너 실행
- –webroot -w /var/www/certbot
- /var/www/certbot을 webroot로 사용 (외부기준으로 /certbot/nonce에 .well-known/acme-challenge 가 생성됨)
- -v “/certbot/nonce:/var/www/certbot”
-v “/certbot:/etc/letsencrypt”- 외부 /certbot/nonce를 도커 내부 /var/www/certbot 으로 링크
- 외부 /certbot를 도커 내부 /etc/letsencrypt 으로 링크
- -d saro.me -d www.saro.me -d gs.saro.me
- 도메인 3개를 사용 (멀티 도메인도 가능하니 적용할 도메인들을 넣어주자.)
- –email test@saro.me –agree-tos –no-eff-email
- 여러가지 물어보는걸 미리 입력해서 해결하기위한 옵션이다.
- 이메일은 본일 걸 넣어주자
- cp –dereference -f /certbot/live/saro.me/* /certbot/cert/.
- 완료된 결과물(링크)의 원본을 /certbot/cert/로 복사한다.
- 폴더명은 certbot 실행시 -d 옵션의 첫번째 도메인 값으로 들어간다. (saro.me)
- rm -rf /certbot/accounts
rm -rf /certbot/archive
rm -rf /certbot/live
rm -rf /certbot/renewal
rm -rf /certbot/renewal-hooks
- 필요없는 폴더들을 삭제한다.
혹시 윈도우에서 작성했다면 ‘\r’ 문자열이 들어갈 수 있으니 아래 명령어로 제거해주자.
sed -i 's/\r$//' certbot_renew.sh
- docker run -it –rm –name certbot
certbot/certbot certonly
- certbot_renew.sh 을 실행해보자.
./certbot_renew.sh
- 이제 크론으로 등록해봅시다.
crontab -e
매주 일요일 오전 8시 정각에 실행되는 예제.
0 8 * * 0 /certbot/renew/certbot_renew.sh
- nginx도 자동으로 갱신되게 해보자.
cd nginx경로 nginx -s reload
- 리눅스
- 마찬가지로 크론으로 등록한다.
- 윈도우
- bat 파일을 만든다.
cd nginx경로 nginx.exe -s reload
- 실행
taskschd.msc
- 적당힌 시간에 bat이 실행되도록한다.
- 주의할 점
- 필자는 귀찮아서 전부 nssm을 통해 service를 등록해 놓고 쓰는데 이렇게 할 경우 user가 달라 권한 오류가 난다.
- 때문에 일반 유저로 nginx를 실행하도록하자 그냥 실행(shell:startup)에 만들어둔 bat을 넣어두자.
- bat 파일을 만든다.
- 리눅스
마치며
이렇게 도커를 이용한 무설치?로 certbot 자동개신을 적용해보았습니다.