Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Lets' Encrypt 인증서 갱신하기

3달 정도 전에 Lets' Encrypt로 무료로 HTTPS 지원하기에 대해서 공유했고 이 블로그에도 Let's Encrypt의 인증서를 적용해서 사용하고 있다.

만료기간이 임박한 인증서

Let's Encrypt 인증서는 유효기간이 90일이기 때문에 90일마다 갱신을 해주어야 한다. 작년 12월에 처음 적용해서 유효기간이 얼마 남지 않은 상황이라서 처음 인증서 갱신을 시도해 보았다. 문서에는 crontab을 이용하라고 되어 있지만 처음 해보는 갱신이므로 수동으로 직접 진행을 했다.

이전 글에 쓴 대로 letsencrypt 저장소를 클론 받아서 서버에서 사용하고 있었으므로 확인차 폴더 내의 letsencrypt-auto 명령어를 실행하니 관련 의존성을 업데이트한다. 혹시나 해서 소스도 업데이트했는데 업데이트하지 않아도 상관없는 것 같다.

$ ./letsencrypt-auto --help
Updating letsencrypt and virtual environment dependencies...You are using pip version 7.1.2, however version 8.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
....
Running with virtualenv: sudo /home/outsider/.local/share/letsencrypt/bin/letsencrypt --help

  letsencrypt-auto [SUBCOMMAND] [options] [-d domain] [-d domain] ...

저번에는 처음 사용해봐서 놓쳤지만, 실행파일이 sudo /home/outsider/.local/share/letsencrypt/bin/letsencrypt --help에 설치가 되므로 이 명령어를 그냥 사용하면 된다.

$ sudo /home/outsider/.local/share/letsencrypt/bin/letsencrypt renew
Checking for new version...
Requesting root privileges to run letsencrypt...
   sudo /home/outsider/.local/share/letsencrypt/bin/letsencrypt --no-self-upgrade renew
Processing /etc/letsencrypt/renewal/blog.outsider.ne.kr.conf
2016-02-25 16:49:57,329:WARNING:letsencrypt.cli:Attempting to renew cert from /etc/letsencrypt/renewal/blog.outsider.ne.kr.conf produced an unexpected error: Missing command line flag or config entry for this setting:
NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you're running letsencrypt in manual mode on a machine that is not your server, please ensure you're okay with that.

Are you OK with your IP being logged?


(You can set this with the --manual-public-ip-logging-ok flag). Skipping.

All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/blog.outsider.ne.kr/fullchain.pem (failure)

처음 실행을 했더니 IP를 공개적으로 로깅해도 되는지를 물어보면서 실패를 한다. 이는 아마도 이전에 인증서 발급을 --manual로 했기 때문으로 보인다. 오류 메시지에 나온 대로 --manual-public-ip-logging-ok 옵션을 추가해서 재시도했다.

$ sudo /home/outsider/.local/share/letsencrypt/bin/letsencrypt renew --manual-public-ip-logging-ok
Checking for new version...
Requesting root privileges to run letsencrypt...
   sudo /home/outsider/.local/share/letsencrypt/bin/letsencrypt --no-self-upgrade renew --manual-public-ip-logging-ok
Processing /etc/letsencrypt/renewal/blog.outsider.ne.kr.conf
Make sure your web server displays the following content at
http://blog.outsider.ne.kr/.well-known/acme-challenge/vTubqqkFcCooMGnXXXXXXXX before continuing:

vTubqqkFcCooMGnFyZJzFK65uwJn9SXXXXXXXXXXXXXXXX

If you don't have HTTP server configured, you can run the following
command on the target server (as root):

mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge
cd /tmp/letsencrypt/public_html
printf "%s" vTubqqkFcCooMGnFyZJzFK65uwJn9SXXXXXXXXXXXXXXXX > .well-known/acme-challenge/vTubqqkFcCooMGnXXXXXXXX
# run only once per server:
$(command -v python2 || command -v python2.7 || command -v python2.6) -c \
"import BaseHTTPServer, SimpleHTTPServer; \
s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()"
Press ENTER to continue
new certificate deployed without reload, fullchain is /etc/letsencrypt/live/blog.outsider.ne.kr/fullchain.pem

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/blog.outsider.ne.kr/fullchain.pem (success)

처음 인증서를 발급받을 때와 같이 서버의 소유 여부를 확인할 수 있게 웹서버에서 인증키를 등록하게 나온다. 이전 글에서 했던 대로 웹서버에 등록한 뒤 엔터를 누르면 정상적으로 인증서가 업데이트되었다고 나온다.

인증서가 위치하는 /etc/letsencrypt/archive/blog.outsider.ne.kr에 가면 기존에는 새로운 인증서 파일(2가 붙은 파일)이 생기고 /etc/letsencrypt/live/blog.outsider.ne.kr/에 있는 심볼릭 링크도 새로운 파일로 업데이트된 것을 볼 수 있다.

cert1.pem  
cert2.pem  
chain1.pem  
chain2.pem  
fullchain1.pem  
fullchain2.pem  
privkey1.pem  
privkey2.pem

갱신한 인증서

nginx 서버를 리로드하고 브라우저에서 확인하면 위처럼 인증서의 유효기간이 갱신된 것을 볼 수 있다.

문서에 정확한 기간이 나와 있지 않지만, 인증서 갱신은 실제 만료기간이 다가왔을 때만 정상적으로 동작한다. 그래서 아래처럼 재시도하더라도 이미 인증서가 갱신되었으므로 새로 인증서를 갱신하지 않는다.

$ sudo /home/outsider/.local/share/letsencrypt/bin/letsencrypt renew --manual-public-ip-logging-ok
Checking for new version...
Requesting root privileges to run letsencrypt...
   sudo /home/outsider/.local/share/letsencrypt/bin/letsencrypt --no-self-upgrade renew
Processing /etc/letsencrypt/renewal/blog.outsider.ne.kr.conf

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/blog.outsider.ne.kr/fullchain.pem (skipped)
No renewals were attempted.

crontab으로 자동갱신되도록 할 생각이었는데 manual로 인증서를 받아서인지 중간에 수동처리해야 하는 부분이 있어서 바로 crontab적용이 어려워 보인다. 이 부분은 나중에 시간이 나면 다시 확인해 봐야겠다.

2016/02/26 02:48 2016/02/26 02:48