AWS Lightsail https 인증서 적용

워드프레스 들어올때마다 보안경고가 떠서 기분이 좋지가 않았던 참에 https를 서비스하기로 마음을 먹었다.
사실 내용은 별거 없다. 대충 인터넷 찾아서 이런 블로그들 보고 따라하면 된다.
기록을 남겨본다.

AWS Lightsail은 로드밸런서(유료)를 사용하는 경우에만 SSL 인증서를 무료로 발급해주기 때문에
필자는 무료 SSL 인증기관인 Let’s Encrypt를 통해 SSL 인증서를 발급받았다.
그 후에는 웹서버에 해당 인증서를 등록하면 된다.
또한 SSL 인증서는 최장 3달 이내로 갱신돼야 하므로 crontab을 이용해 주기적으로 인증서를 갱신해줘야 한다. (Let’s Encrypt에서는 보통 하루에 한두번정도 갱신을 권장한다.)

1. Let’s Encrpyt SSL 인증서 발급

아래와 같은 과정을 통해 SSL 인증서를 발급할 수 있다.
필자의 작업 환경에 맞춘 내용이기 때문에 적절히 내용을 수정하여 진행하면 된다.

  1. wget https://dl.eff.org/certbot-auto를 통해 certbot-auto를 내려받는다. (chmod +x로 권한도 주자)
  2. apps/wordpress/htdocs/.well-known 디렉터리를 생성하고,
    apps/wordpress/htdocs/.well-known/.htaccess 파일을 생성한다.
  3. .htaccess 파일 내부에 다음과 같은 내용을 쓰고 저장한다.
    RewriteEngine On
    Satisfy Any
  4. export LC_ALL=”C”로 변수를 등록하고, 다음과 같이 certbot-auto를 실행한다.
    ./certbot-auto certonly –webroot -w apps/wordpress/htdocs -d hooni-playground.com
  5. 이메일 등록이나 동의 과정 등을 마치고나면 정상적으로 인증서가 발급된다.

참고로 위의 인증방식을 Webroot 인증방식이라 하는데, 만약 iptime같은 DDNS를 사용하는 경우 다른 인증방식이 필요할 수도 있다. (iptime.org에서 수많은 challenge가 발생하기 때문에 Let’s Encrypt에서는 해당 도메인을 block한 상태이다)
이 글에서 DNS를 통한 Challenge 및 SSL 인증서 발급 과정을 소개한다.

2. 웹서버 등록

AWS LightSail의 WordPress 인스턴스는 apache를 웹서버로 사용한다.
(다만 경로가 조금 다르다. 보통은 /etc/httpd나 /etc/apache2인데 LightSail의 WordPress는 /opt/bitnami/apache2에 들어있다.)
apache의 bitnami.conf를 수정하여 위의 과정 1에서 만든 SSL 인증서를 등록해야 한다.
경로는 환경에 따라 다르니 적절하게 찾아 수정하면 된다.

vim ~/stack/apache2/conf/bitnami/bitnami.conf
...
<VirtualHost _default_:443>
  DocumentRoot "생략"
  SSLEngine on
SSLCertificateFile "생략"
SSLCertificateKeyFile "생략"

맨아래의 두 줄을 주석처리하고 다음과 같이 수정한다.
당연하지만, 오타가 생기면 적용이 안된다.
절대로 경험담이 아니다

SSLCertificateFile /etc/letsencrypt/live/hooni-playground.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/hooni-playground.com/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/hooni-playground.com/fullchain.pem

경우에 따라서는 http 트래픽을 https로 redirection해야 할 수도 있다.
물론 워드프레스 플러그인이 대신 해주긴 하지만, 언플러깅을 대비해 직접 써넣어줬다.
덤으로 워드프레스 사이트 주소는 당연히 https로 따로 바꿔야한다.
워드프레스 웹의 관리자 설정 탭에서도 간단히 할 수 있다.

vim apps/wordpress/conf/httpd-prefix.conf
...
RewriteEngine On
# Modified for https redirecting by hooni
RewriteCond "%{HTTPS}" !=on
RewriteRule "^/(.*)" "https://%{SERVER_NAME}/$1" [R=301,L]
# End of Modification
...

마지막으로 /opt/bitnami/ctlscript.sh restart apache를 통해 apache를 재실행하시면 잘 된다.

3. SSL 인증서 자동 갱신

certbot-auto renew를 통해 인증서를 자동으로 갱신해줘야 한다.
물론 이걸 사람이 직접하는건 어불성설이고, crontab으로 자동화하면 된다.

crontab은 crontab -e로 열 수 있으며, [분 시 일 월 요일 커맨드]의 포맷으로 작성한다.
참고로 root 권한으로 자동화하고 싶으면 sudo로 crontab을 열면 된다.
필자는 새벽 2,3,4시에 인증서를 갱신할 것이므로 다음과 같이 입력했다.

0 2-4 * * * /home/bitnami/certbot-auto renew

문제는 위의 경우에는 인증서는 갱신되는데 아파치 재시작이 되지 않아 인증서가 웹서버에 적용되지 않는다.
그러므로 다음과 같이 아파치 재시작을 함께 해주어야 한다.

> 0 4 15 */2 * /home/bitnami/certbot-auto renew --renew-hook="sudo /opt/bitnami/apache2/bin/apachectl restart"

아파치 재시작은 아까처럼 스크립트로 해도 되고, 위처럼 바이너리 파일로 해도 된다.
이번엔 약간 변형을 줘서 짝수달 15일 새벽 4시마다 인증서를 갱신하고 웹서버를 재시작하는 crontab 설정이다.

댓글 남기기