아마존 라이트세일에서 https 적용하기(SSL인증서 설치 후 자동갱신)

Lets-Encrypt

이번 포스팅은 ‘아마존 라이트세일로 wordpress 또 이사하다.’ 글에 이어서 https를 적용하는 방법에 대한 내용이다.

주요 내용은 아래 순서로 진행된다.

보통 https를 적용하기 위해 Let’s Encrypt SSL 인증서를 발급받는 방법은 크게 3가지가 있다.

  • webroot : 사이트 디렉토리 내에 인증서 유효성을 확인할 수 있는 파일을 업로드하여 인증서를 발급하는 방법
  • Standalone : 사이트 작동을 멈추고 이 사이트의 네크워킹을 이용해 사이트 유효성을 확인해 Let’s Encrypt SSL 인증서를 발급하는 방식.
  • DNS : 도메인을 쿼리해 확인되는 TXT 레코드로 사이트 유효성을 확인하는 방법

이 중에서 나는 가장 쉬워보이는 webroot 방식을 이용하기로 했다. 그런데 OS버전에 따라 인증서 설치와 갱신 방법이 아주 살짝 다르니 주의해야 한다.

인증서 발급 프로그램 설치

내가 확인한 내용으로는 Ubuntu 16.04부터는 Certbot-auto를 이용하지 않아도 패키지매니저로 Cerbot 패키지를 이용할 수 있다.

Let’s Encrypt에서는 특별한 이유가 없으면 ‘패키지 매니저에서 제공하는 Certbot 패키지’를 사용하고, 그게 안될 경우 certbot-auto를 다운 받아 사용하라고 되어 있다.

Unless you have very specific requirements, we kindly suggest that you use the Certbot packages provided by your package manager (see certbot.eff.org). If such packages are not available, we recommend using certbot-auto, which automates the process of installing Certbot on your system. (원문링크)

현재 나는 Debian10(buster)을 이용중인데 Debian10(buster)도 패키지매니저로 설치 할 수 있어서 나는 Certbot 패키지를 이용하기로 했다.

  • OS버전확인 : cat /etc/*release
  • 패키지 데이터베이스 업데이트 : sudo apt-get update
  • letsencrypt 패키지 설치(certbot): apt-get install letsencrypt

*참고 : https://certbot.eff.org/docs/install.html


.well-known 디렉토리(폴더) 와 .htaccess 생성 및 편집

워드프레스 최상위 폴더에 .well-known 폴더를, 그 안에 다시 .htaccess 파일을 생성하고 편집해야한다.

mkdir /opt/bitnami/apps/wordpress/htdocs/.well-known  
ls -al /opt/bitnami/apps/wordpress/htdocs/
touch /opt/bitnami/apps/wordpress/htdocs/.well-known/.htaccess
sudo vi /opt/bitnami/apps/wordpress/htdocs/.well-known/.htaccess

vi편집기에서 .htacess 파일을 열어서 아래 코드 입력

RewriteEngine On
Satisfy Any
  • 참고 : webroot는 certbot이 인증서를 설치하는 방법 중 하나이다. webroot를 이용하려면 .well-known 폴더를 만들고 .htaccess파일을 만들어 해당 디렉토리의 옵션을 설정해서 Certbot이 도메인을 인증하는 첼린지(Challenge)를 수행하도록 해야한다. Certbot은 스스로 이런 첼린지를 수행할 권한을 설정 후 첼린지가 완료되면 다시 원상복구한다.
  • 참고 : /.well-known/는 정해진 URI 스키마 상에서 공통적으로 사용하는 디렉토리 규약 같은 것이라고 보면 된다. iOS 앱을 개발할 때 유니버셜 링크를 쓸 때도 .well-known 디렉토리에 apple-app-site-association을 넣고, 안드로이드에서는 웹사이트에 공개, 인증관련 내용을 기록하는 디지털 에셋 링크도 .well-known 디렉토리에 assetlinks.json을 넣는다.

인증서 발급받기

그러면 이제 인증서를 발급받도록 하자. 나의 경우에는 블로그 도메인인 junholee.me로 발급을 받을 것이다. 인증서 발급은 아래 명령어로 진행할 수 있다.

letsencrypt certonly --webroot -w opt/bitnami/apps/wordpress/htdocs --expand -d junholee.me -d www.junholee.me
  • 도메인 입력 시 http://는 빼고 입력해야 한다.
  • certonly 옵션이 있어야 certbot이 인증서 발급만 하고 다른 아파치 설정은 건드리지 않는다. certonly를 빼고 명령을 실행하면 예상치 못한 일이 생길 수 있으니 주의해야 할 필요가 있다. 특히 비트나미(bitnami)와 같이 미리 빌드된 워드프레스를 사용하는 경우 기본적으로 아파치 사용부터 설정까지 많은 부분이 다른데 certonly를 빼고 명령을 실행하면 bitnami의 아파치가 아니라 다른 아파치가 실행되어 자신의 워드프레스 접속이 안될 수 있다.

위 명령어를 실행하면 인증서 발급이 진행되는데 아래와 같이 진행하면 된다

  • 인증서 패키지 설치 진행여부 : Y
  • 인증서에 등록될 이메일 주소(만료일 다가올 때 해당 이메일로 알려줌) : 본인이 자주 사용하는 이메일 입력
  • 약관동의 : A
  • 추가 업데이트 내용 이메일로 구독 : Y 혹은 N 아무거나 해도 상관없음.
  • 정상적으로 설치가 되면 Congratulations!이 나오고 발급과정이 종료됨.

인증서 확인하기

실제 인증서인 .pem 파일이 위치한 폴더는 SFTP로 접근 할 수 없고 root 권한하에 CLI에서 살펴볼 수 있다. 따라서 CLI에서 sudo su 를 입력하여 확인을 진행해야 한다.

sudo su
cd /etc/letsencrypt/live
ls -al
ls 폴더이름

위 명령어를 입력하면 아래처럼 pem 파일을 확인할 수 있다.

  • 공개키: /etc/letsencrypt/live/{도메인 주소}/fullchain.pem
  • 개인키: /etc/letsencrypt/live/{도메인 주소}/privkey.pem

아파치 설정파일을 수정해서 인증서 적용하기

su bitnami
cd ~
sudo vi /opt/bitnami/apache2/conf/bitnami/bitnami.conf

위 명령어를 이력하여 bitnami.conf 파일을 연 후 <VirtualHost default:443> 이라는 글자가 있고, SSLEngine on 이라고 되어있는 줄 아래 쪽을 수정해야 함.

#####아래 2개 부분을 주석처리 함.#####
# SSLCertificateFile “/opt/bitnami/apache2/conf/server.crt”
# SSLCertificateKeyFile “/opt/bitnami/apache2/conf/server.key”

#####아래 3개를 추가함#####
# Let’s Encrypt
SSLCertificateFile /etc/letsencrypt/live/도메인이름의폴더/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/도메인이름의폴더/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/도메인이름의폴더/fullchain.pem

그리고 아파치 재시작 한다.

sudo /opt/bitnami/ctlscript.sh restart apache

아파치 재시작이 완료되면 인증서를 정보를 아래 명령어로 확인한다.

$ certbot certificates

인증서가 적용된 것을 확인했으므로 실제 웹에서 https가 적용된 모습을 확인한다. 참고로 ‘인증서:(유효)’ 항목을 클릭하면 인증서 유효기간도 확인할 수 있다.

웹에서확인 https 확인


http → https로 리다이렉팅 설정하기

아파치 설정파일 변경하기

http를 https로 redirecting 시키기 위해서는 아파치 설정을 변경해야 한다. 우선 아래 명령어로 설정파일을 연다.

sudo vi /opt/bitnami/apps/wordpress/conf/httpd-prefix.conf

그리고 RewriteEngine On 아래에 아래 두줄을 추가해야 한다.

RewriteCond %{HTTPS} !=on
RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R=301,L]

위 내용을 적용한 후 아파치를 다시 시작한다.

sudo /opt/bitnami/ctlscript.sh restart apache

wp-config.php 파일 수정

아래처럼 http를 https로 수정해야 한다. 처음 wp-config.php 파일에는 http로 되어 있을 것이다.

define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/');

SSL 인증서 자동 갱신하기

여기까지 오면 사실 나머지는 쉽다. 인증서 갱신테스트를 해보고 문제 없으면 갱신명령어를 crontab에 등록하기만 하면 된다.

SSL 인증서 갱신하기

인증서 갱신 테스트 명령어는 다음과 같다.

$ certbot renew --dry-run

위 명령어를 실행하여 문제가 없다면 아래와 같이 Congratulations 메세지가 나온다.

Let's encrypt 갱신테스트 성공

*참고사항 : --dry-run만 빼고 실행시키면 실제 갱신이 된다. 단, 참고로 알아야 할 사항은 인증서는 만료되기 30일 전부터 갱신이 가능하다는 점이다. 따라서, 만료되기 50일이나 60일전에는 갱신이 되지 않는다.

그런데 나는 처음에 갱신할 수 없다는 에러메세지를 받았다. 그래서 여러가지 이유를 찾아봤는데 아래 블로거님의 글에서 힌트를 얻을 수 있었다.

https://servedev.tistory.com/76

위 블로그 내용을 보고 webroot_map이 잘못되었을 것 같다는 생각이 들었다.

그래서 실제로 설정파일을 열어보니 www.junholee.me에 대한 webroot정보만 있고 junholee.me에 대한 webroot정보가 없길래 이미지에 표시한 부분을 추가했다. 즉, junholee.me 도메인에 대한 webroot정보도 추가하였다.

그랬더니 정상적으로 갱신을 할 수 있었다. 상식적으로는 2개 도메인에 대해서 인증서를 발급받았다면 2개 도메인 모두 webroot 정보가 들어가야 정상일텐데….왜 1개 도메인만 webroot 정보가 들어간 것인지 이유를 잘 모르겠다. 만약, 나처럼 2개의 도메인에 대해서 인증서를 발급받은 후 2개 도메인 모두 갱신을 하는 과정에서 갱신이 되지 않는다면 위 사항을 확인해보는 것이 좋다.


Crontab에 자동갱신 명령어 등록하기

사실, 3개월에 한 번씩 위에서 언급한 갱신 명령어를 입력하면 이용하는데 문제가 없다. 즉, 3개월에 한 번씩 아래 명령어를 입력하면 문제없이 이용할 수 있다.

$ certbot renew

그런데 이렇게 매 번 수동으로 갱신을 하는 것은 소모적인 일이다. 그래서 자동으로 갱신이 되도록 crontab에 명령어를 등록했다.

$ crontab -e

일단, 위 명령어로 crontab에 들어온다. 그리고 아래 방식대로 반복하고자 하는 날짜방식과 명령어를 입력하면 된다.

crontab 반복 날짜지정 방식 설명
0 18,23 1 */2 * /usr/bin/certbot renew --renew-hook "sudo /opt/bitnami/ctlscript.sh restart apache"
  • 월 단위(*/2) : 인증서가 한 번 갱신될 때마다 기간이 90일씩 연장되므로 매월 갱신되도록 하는 것 보다는 격월로 갱신을 하도록 했다.
  • 일 단위(1) : 매 월 1일
  • 시간 단위(18,23) : 인증서 갱신이 실패할 수도 있으므로 18시와 23시에 실행되도록 했다.(서버시간 기준)
  • 분 단위(0) : 18시와 23시 정각에 실행되도록 한다.

위 내용을 종합하자면 격월 1일마다 18시 00분과 23시 00분에 인증서가 갱신되도록 한 것이다. 그리고 인증서 갱신이 끝나면 apache가 재실행 되도록 했다. 그 외 명령어에 대한 설명은 아래와 같다.

  • /usr/bin/certbot renew : certbot으로 인증서 갱신을 시도한다.
  • --renew-hook "sudo /opt/bitnami/ctlscript.sh restart apache" --renew-hook : 인증서 갱신을 시도한 이후에 apache를 재실행한다.

*추가 업데이트 사항

페이스북에서 내 글을 본 어떤 분께서 말씀하시기를 라이트세일 SSL은 비트나미가 공식적으로 제공하는 sudo /opt/bitnami/bncert-tool 명령어 한줄로도 간편하게 가능하다고 한다. 다음에 한 번 이용해봐야 겠다.


이것으로 블루호스트에서 아마존 라이트세일로 블로그를 이전하고 SSL인증서를 발급받아 https를 적용하는 작업이 끝났다. 예상했던 것보다 삽질을 많이 하진 않았지만 언제나 그렇듯이 리눅스 서버 설정작업은 어렵다. 물론, 재미있기도 하다.

첫 시작은 낙후된 국내 호스팅에서 운영중이던 내 블로그를 좀 더 안정적이고 좋은 호스팅으로 옮겨서 https를 적용하는 간단한 계획이었는데 일이 커저벼려서 결국 서버운영까지 내가 직접해야하는 상황으로 접어들었다. 뭐 그래도 기분은 좋다. 이상하게 리눅스 서버에서 뭔가를 건드리고 그게 잘 돌아가면 기분이 좋다. 윈도우나 맥에서 좋은 프로그램을 설치한 것과는 다른 느낌이다.

나의 블로그 이사 스토리는 아래 글들에서 확인 할 수 있다. 혹시 다른 이야기들도 더 궁금하다면 뉴스레터를 구독해주세요.

1 Shares:
답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

You May Also Like
Read More

기획자와 스토아철학

기획자로서 일을 하다보면 생각보다 많은 부분에서 우울할 때가 있다. 그 우울함이 심해지면 '나는 과연 필요한 존재가 맞는가?'라는 생각까지 들곤 한다. 문제는 이런 경험을 자주 할수록 자존감이 낮아진다는 것이다. 내가 겪어온 경험을 토대로 이 문제를 어떻게 극복했는지 이야기하고자 한다.
Read More

내 리더가 회사를 떠났다.

어떤 한 사람이 있다. 그 사람을 보면서 나는 이런 생각을 했다. "저 분의 인성과 역량을 닮고 싶다. 내 아들이 커서 어른이 된다면 나의 모습보다는 저 분의 모습을 닮았으면 좋겠다." 그 분은 내가 현재 재직중인 회사의 CTO이자 나의 리더였다. 아이러니하게도 그 분과 나는 전혀 다른 성격의 소유자이고 업무 스타일도 많이 달랐다. 하지만 난 정말로 그분을 닮고 싶었다.
2021년 회고
Read More

2021년 회고(Product Owner, 가족, 성장)

회사에는 동료와 일이 있다. 가정에는 아내와 애들, 육아업무가 있다. 그러나 그 어디에도 나는 없었다. 원래 나 본연의 내가 존재할 수 있는 시간과 장소는 없었다. 단지, 의무로서의 나만 존재했다. 언뜻 생각해보면 참 서글프기도 하지만 잘 생각해보면 꼭 그렇지도 않다. 현재 나의 상황, 역할, 가족, 일.....그 모든 것이 결국은 나를 구성한다. 원래 나 본연의 나는 처음부터 없는 것인지도 모르겠다.