본문 바로가기

어떻게 할까/소프트웨어

Let's encrypt 인증서 자동 갱신 하기

 

 HTTP/2.0 이 나온지 벌써 5년이 지났습니다만, 평문 socket 통신을 하는 http 규격으로는 각 종단간 데이터에 대한 유효성을 입증하기가 사실 어려운 부분들이 많은 것은 물론, GET/POST 등으로 넘어가는 데이터가 전혀 암호화 되어 있지 않기 때문에 중간 공격자가 이를 가로 챌 경우 데이터를 보호할 방법이 없는 사실 알고 보면 위험할 수 있는 프로토콜 규격 입니다.

 그걸 방지하기 위해서 SSL 을 적용한 https 라는 것이 요즘은 기본적인 웹 서버들의 교양 같은 것이 되었습니다만, 이 SSL 을 쓰기 위해서는 인증기관이 필요 하고, 이것의 의미는SSL 을 쓰려면 거대한 금액을 지불해야 한다는 것이 https 도입의 가장 큰 걸림돌 이었습니다.

 이러한 문제를 해결 하기 위해 Let's Encrypt 는 개인 또는 비영리 서버를 운영 하는 존재 ( 또는 상업적인 서버를 돌리더라도 쓸 수 있지만 비양심 적이라 하겠습니다 ) 라면 자신의 도메인 단위로 SSL 인증을 받게 해 주는 고마운 존재 입니다.

 현재 이 서비스는 tistory 에서도 각자 도메인 단위로 이 SSL 인증을 받아 https 서비스를 지원 하고 있고, 제가 따로 구동 하는 https://rageworx.info 또한 google domain 과 더불어 이 SSL 인증을 서버에 적용하고 있습니다. 이런 고마운 인증에 대한 대가는 없지만, 단점이 인증 기간이 3개월 이라는 짧은 시간마다 갱신 해야 한다는 것이기 때문에 무척 귀찮은 일이 됩니다.

 이런 문제를 해결 하기 위해서는 linux 기반 서버에 한해 다음과 같은 스크립트를 하나 만들고 이를 매 달 초 crontab 으로 호출 하는 방법을 사용하고 있는 것을 공유 하고자 합니다.

 

 원리는 간단 합니다, 먼저 /usr/bin/id 로 현재 실행 되는 user 의 id 가 root ( sudo 로 구동 되는 것 ) 권한이 아니라면 종료를 하고, let's encrypt 를 설치 하여 쓰고 계시면 다들 가지고 있는 certbot 을 통해 인증서의 남은 날짜를 확인 합니다. 단, 이 방법은 인증서가 1개 도메인에 한해서만 가능하기 때문에 여려개를 돌리시는 분들이라면 뭔가 다른 방법을 찾아야 합니다.

 남은 날짜가 30일 미만이라면 인증서 갱신이 가능하기 떄문에 apache2 서비스를 끈 다음 certbot 을 통해 인증서 갱신을 한 다음 다시 apache2 서비스를 구동하는 형태로 crontab 에 다음과 같이 매달 초에 구동하도록 해 두면 기간이 되면 자동으로 갱신을 하게 됩니다.

 

 필요 하신 분들은 아래 코드내에 script 를 복사 하셔서 쓰시되, apache2 대신 다른 서비스를 쓰시는 분들은 해당 서비스 이름로 간단히 바꿔 쓰시면 3개월 마다 찾아오는 압박에 대해 자유로워 질 수 있지 않을까 합니다.

 

#!⁄bin⁄bash
# sudo test
if [[ $(⁄usr⁄bin⁄id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi
# test valid date left.
TESTDATE=`certbot certificates | grep VALID`
ATD=($TESTDATE)
LEFTDATE=`expr ${ATD[5]}`
echo "date left : ${LEFTDATE}"
if [ ${LEFTDATE} -lt 30 ]; then
    echo "Left date less than a month, OK, proceeding update !"
    service apache2 stop
    certbot renew
    service apache2 start
else
    echo "No need to update, yet"
fi