본문 바로가기

볼봇의 코딩 생활/Linux

Certbot 으로 웹 사이트에 https 적용하기

  홈페이지를 만들때, API 서버 하나를 만들때도 https 적용은 이제 필수가 되었다. 최근에는 안드로이드에서 https 적용이 되지 않은 어플리케이션은 API 호출이 안되게 막거나, 상위 노출을 제한하는 등의 패널티를 주기도 한다. 하지만 개인이 수십~수백만원 하는 https 인증서를 단 하나의 토이 프로젝트를 위해 구입하는거는 경제적으로 무리가 있다.

 

따라서, Let's Encrypt 와 같은 무료 https 인증서 발급 사이트가 있는것이다.

 

Certbot 설치하기

  몇몇 블로그들을 참고해보면 epel-release 리포에서 cerbot 을 설치하는 경우가 있는데, 이렇게 하면 잘 안된다. 공식 웹 사이트에서 설명하는대로 설치해야만 편리하게 인증서를 발급&갱신 할 수 있다.

 

Certbot (eff.org)

 

Certbot

Different Internet services are distinguished by using different TCP port numbers. Unencrypted HTTP normally uses TCP port 80, while encrypted HTTPS normally uses TCP port 443. To use certbot –webroot, certbot –apache, or certbot –nginx, you should h

certbot.eff.org

 

My HTTP website is running (Software) on (OS) 부분에 본인 환경을 입력한다. 필자는 Nginx 소프트웨어를

CentOS 8 (RHEL 8) 에서 사용하기 때문에, 위 그림과 같이 입력했다.

 

그러면 snapd 라는 패키지관리 도구를 설치하라고 안내한다.

 

snapd 설치하기

Installing snapd | Snapcraft documentation

 

Installing snapd | Snapcraft documentation

Snaps are containerised software packages that are simple to create and install. They auto-update and are safe to run. And because they bundle their dependencies, they work on all major Linux systems without modification.

snapcraft.io

각 OS 별로 snapd 설치하는 방법에 대해 안내하고 있다.

필자는 아래와 같은 명령어를 사용해서 snapd 를 설치했다. 

 

dnf install snapd

snapd 를 설치한다.

 

systemctl enable --now snapd.socket

 

ln -s /var/lib/snapd/snap /snap

 

 

snapd 설치를 마쳤다면, snapd 를 업데이트 한다.

snap install core
snap refresh core

필자는 이미 했다.

 

certbot 을 설치한다.

snap install --classic certbot

 

링크를 만들어서 certbot 명령어를 적용한다.

ln -s /snap/bin/certbot /usr/bin/certbot

 

설치 끝!

 

인증서 적용하기

필자는 localhost 에서 서비스 되고 있는 nextcloud 를 nginx 의 proxy 기능을 사용하여 외부로 서비스 하고 있다.

즉, nginx 에서는 cloud.saintdev.kr 라는 도메인이 하나 등록되어 있다고 보면 된다.

certbot --nginx

 

도메인을 선택하고 Enter

 

 

축하한다고 하면 오류 없이 잘 설치된거다.

certbot 이 자동으로 .conf 파일을 수정하여 인증서를 설치해줬다.

 

systemctl restart nginx

.conf 파일이 수정되었으니 nginx 을 재시작 해주어 적용한다.

 

접속이 안되는 경우

필자의 경우, 443 포트를 뚤어주지 않아서 접속이 안되는 오류가 있었다.

firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload

https 적용이 완료되었다.

 

 

crontab 으로 자동 갱신 설정

Let's encrypt 의 아쉬운점은 3개월 마다 한번씩 갱신해줘야 한다는 점 이다.

인간이 3개월에 한번씩 갱신 버튼을 누르는건 만만치 않게 어려우므로, 컴퓨터에게 이 작업을 맡기겠다.

 

우선, 갱신이 잘 작동하는지 테스트 해본다.

certbot renew --dry-run

 

별 문제 없이 갱신이 작동하면 crontab 에 등록한다.

 

crontab -e

crontab 에디터를 연다.

 

* * * * 0 /usr/bin/certbot renew --renew-hook="sudo systemctl restart nginx"

매주 일요일에 renew 를 시도하고, 성공 한다면 nginx 를 재시작 하도록 한다.

 

끝.