AWS EB에서 Let’s Encrypt 수동으로 갱신하기

Let’s encrypt 라는 녀석을 알고 무료로 HTTPS를 적용한지 벌써 석달이 됐다. 다 좋은데 불편한게 하나 있다면 바로 인증서를 3개월 마다 갱신해야한다는 것이다. 그래서 어떤 분은 3개월짜리 크론잡을 돌리시는 분도 있지만 난 설정을 또 해야하는 귀차니즘도 있고 3개월짜리 크론잡에 확신이 없었다.

AWS 빈스톡(beanstalk) 인스턴스가 언제 내려갈지 장담할 수 없기 때문에 주기를 걸면 왠지 틀어질것 같고, 그렇다고 날짜를 고정한 크론잡을 돌리자니 수동이나 다를바가 없었다. 그럴바엔 그냥 귀차니즘도 덜고 수동으로 갱신하는 방법이 맞겠다 싶었다. 그래서 그 때를 기다린지 3개월! 참 오래도 기다렸다.

갱신하기

빈스톡 설정(.ebextension) 에서 certbot-auto를 설치해서 쓰고 있었기 때문에 갱신할때도 EB 설정에 넣어두고 배포를 다시 해볼까 싶었지만 굳이 배포할것도 없는데 인증서 때문에 배포한다는게 또 귀찮아서 그냥 터미널에서 작업을 먼저 해보기로 했다.

$> cd /var/app/current // EB 앱에 설치되는 위치
$> ls -al 
... 
drwxr-xr-x 2 nodejs nodejs 4096 10월 30 03:51 bin 
-rwxr-xr-x 1 nodejs nodejs 57312 10월 5 09:05 certbot-auto 
drwxr-xr-x 4 nodejs nodejs 4096 10월 30 03:51 config 
... 

썰봇(certbot-auto)이 설치 됐는지 확인은 했고, 인증서 갱신(renew)을 하기전 혹시 모르니까 테스트를 해봤다. 참고로 썰봇은 루트 권한을 요구하기 때문에 반드시 sudo 나 루트 권한을 획득한 후에 명령을 실행한다.

$> sudo ./certbot-auto renew --dry-run 

... 중략 ... 
Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator standalone, Installer None Running pre-hook command: service nginx stop Output from service: Stopping nginx: Hook command "service nginx stop" returned error code 137 
... 중략 ... 

1 renew failure(s), 0 parse failure(s) 

하하 이게 뭔가요? 싶었는데 자세히 읽어보면 nginx 문제 인것 같다. 그래서 직접 nginx를 죽여봤다.

$> sudo service nginx stop 

Stopping nginx: /sbin/service: 
line 66: 25051 죽었음 env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" ${OPTIONS}

$> ps -ef | grep nginx

root 25067 1 0 10:10 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf -g daemon off; 
nginx 25070 25067 0 10:10 ? 00:00:00 nginx: worker process 
ec2-user 25091 23820 0 10:11 pts/0 00:00:00 grep --color=auto nginx 

어허! 이건 또 뭔가요? 엔진엑스가 죽지 않는다!! 죽여도 죽여도 좀비 처럼 다시 살아난다. 자동 재시작을 멈추기 위해서는 아래와 같은 명령을 이용한다.

$> sudo initctl stop nginx 

자 이제 nginx는 멈췄고, 다시 renew –dry-run을 해보니 이제는 문제가 없다. 그럼 –dry-run 옵션을 빼고 갱신을 해보자. 참고로 이 글을 쓰는 시점엔 이미 갱신을 완료해서 로그 캡처를 못했다.

$> sudo ./certbot-auto renew 

인증서를 갱신했다면 nginx를 다시 죽지 않는 좀비(?) 모드로 실행해준다.

$> sudo initctl start nginx 

제대로 갱신 됐는지 확인하기

인증서 확인을 위해 certificates 명령을 실행해봤다.

$> sudo ./certbot-auto certificates

Saving debug log to /var/log/letsencrypt/letsencrypt.log

* * * 

Found the following certs: 
Certificate Name: rlibro.com 
Domains: rlibro.com Expiry 
Date: 2018-02-10 02:16:31+00:00 (VALID: 89 days) 
Certificate Path: /etc/letsencrypt/live/rlibro.com/fullchain.pem ## Private Key Path: /etc/letsencrypt/live/rlibro.com/privkey.pem 

이제 89일 남았다! 유후!!

다시 캘린더에 갱신 날짜를 입력해 둬야겠다.