Nginx Proxy Manager SSL 자동 갱신하기

안녕하세요

오늘은 Nginx Proxy Manager (이하 NPM)에서 설정한 Proxy Host의 SSL의 인증 기간이 지나가서 문제가 발생하지 않도록 자동 갱신하는 방법에 대한 포스팅을 하도록 하겠습니다.

 

 

 

프록시를 설정하면서 SSL 인증을 설정하였는데요

이 인증서를 제때 갱신해주지 않으면 도메인으로 접속을 못하는 상당히 불편한 일을 겪게 될 수도 있습니다.

 

저희가 인증받은 Let’sencrypt는 무료 SSL 인증서로 갱신 주기가 90일입니다.

  • 갱신 주기 : 90일 (만료 30일 이전부터 갱신 가능)

이렇게 90일마다 꼬박꼬박 갱신을 하지 않으면 어느날 갑자기 접속이 불가능해지는 상황이 발생한다는 것이죠

이제 본론으로 들어가서 명령어를 통해서 인증서를 갱신하는 방법을 설명하겠습니다.

 

 

갱신이 필요한 SSL 인증서

 

 

1. 명령어로 SSL 인증 하는 방법

1) docker 컨테이너명 확인

docker ps
  CONTAINER ID        IMAGE                             COMMAND                  CREATED             STATUS                 PORTS                                                                        NAMES
  c510bbe77858        jc21/mariadb-aria:10.4            "/scripts/run.sh"        6 hours ago         Up 6 hours             3306/tcp                                                                     npm_db
  b51361627e5b        jc21/nginx-proxy-manager:latest   "/init"                  6 hours ago         Up 6 hours (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:81->81/tcp, 0.0.0.0:443->443/tcp              npm

 

가장 우측의 NAMES를 보시면 npm이라는 컨테이너가 있죠. 이걸 잘 확인해두시면 됩니다.

 

2) 컨테이너 쉘로 명령어 실행하기

docker exec -it npm /usr/bin/certbot renew
  Saving debug log to /var/log/letsencrypt/letsencrypt.log

  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  Processing /etc/letsencrypt/renewal/npm-1.conf
  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  Cert not yet due for renewal

  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  Processing /etc/letsencrypt/renewal/npm-3.conf
  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  Cert not yet due for renewal

  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  Processing /etc/letsencrypt/renewal/npm-5.conf
  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  Cert not yet due for renewal

  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  Processing /etc/letsencrypt/renewal/npm-6.conf
  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  Cert not yet due for renewal

  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  The following certs are not due for renewal yet:
    /etc/letsencrypt/live/npm-1/fullchain.pem expires on 2020-09-01 (skipped)
    /etc/letsencrypt/live/npm-3/fullchain.pem expires on 2020-09-01 (skipped)
    /etc/letsencrypt/live/npm-5/fullchain.pem expires on 2020-09-01 (skipped)
    /etc/letsencrypt/live/npm-6/fullchain.pem expires on 2020-09-01 (skipped)
  No renewals were attempted.
  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

“docker exec -it [컨테이너명] /usr/bin/certbot renew” 명령어를 입력하면 생성되어 있는 SSL 전체가 갱신됩니다.

 

2. crontab 사용하기

1) crontab 사용방법 (리눅스)

## crontab 설정
crontab -e

## crontab 목록 확인
crontab -l

## crontab 삭제
crontab -r

 

2) crontab 사용방법 (시놀로지)

시놀로지에서는 crontab -e 가 작동하지 않습니다.

## crontab 설정
nano /etc/crontab

 

3) crontab 주기 설정 방법

## crontab 주기
*      *      *      *      *
분(0-59)  시간(0-23) 일(1-31)   월(1-12)   요일(0-7)

## 매분마다 example.sh 실행 예제
* * * * * /home/example.sh

## 매주 일요일 10시 45분에 example.sh 실행 예제
45 10 * * 7 /home/example.sh

## 매일 매시간 0분, 30분에 example.sh 실행 예제
0,30 * * * * /home/example.sh

## 매일 7시 0분~30분까지 매분 example.sh 실행 예제
0-30 7 * * * /home/example.sh

## 매 10분마다 example.sh 실행 예제
*/10 * * * * /home/example.sh

## 매월 11일에서 15일까지 2시, 4시, 6시, 8시에 매 15분마다 example.sh 실행 예제
*/15 2,4,6,8 11-15 * * /home/example.sh

 

4) crontab 로그 기록하기 (cron logging)

## 로그 기록하기
* * * * * /home/example.sh > /home/example.log 2>&1

## 로그 누적시켜 기록하기
* * * * * /home/example.sh >> /home/example.log 2>&1

## 로그 없이 실행하기
* * * * * /home/example.sh > /dev/null 2>&1

 

3. crontab으로 SSL인증 자동 갱신하기

여기까지 crontab 사용 방법을 알아보았는데요

이제 crontab설정을 통해서 SSL 인증을 자동 갱신하는 방법에 대해 설명드리겠습니다.

## root 권한 얻기
sudo -i

## crontab 열기
nano /etc/crontab

## 스크립트 파일 작성
nano /homes/script/auto_renew.sh
	docker exec -it npm /usr/bin/certbot renew

## SSL인증을 위한 명령 추가하기 (매월 1일 0시 0분)
0       0       1       *       *       root    /volume1/homes/user/script/npm/auto_renew.sh

위와 같이 1달 단위로 갱신을 설정해두면 Let’sencrypt의 갱신주기 범위를 지나지 않고 갱신이 가능하겠죠?

불안하시면 보름 단위로 설정해두셔도 상관없습니다.


이상으로  crontab으로 SSL 자동 갱신하는 방법에 대한 포스팅을 마치도록 하겠습니다.