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
적용이 어려워 보인다. 이 부분은 나중에 시간이 나면 다시 확인해 봐야겠다.
관리자만 볼 수 있는 댓글입니다.
현재 처음 설정시에 뭘 잘못했는데 갱신시에 자꾸 프롬프트가 뜨는 문제가 있어서 crontab 적용을 못하고 있습니다. 최근에는 인증서 관리를 certbot으로 하도록 Let's encrypt에서 안내하고 있어서 이쪽관련 문서를 보시면 될 것 같습니다.
정보 공유 감사합니다 덕분에 쉽게 인증서 갱신했네요.