certbot 으로 let’s encrypt 인증서 발급받기

certbot 으로 let’s encrypt 인증서 발급받기

linux 2022. 1. 30. 00:48

certbot 을 통해 let’s encrypt 인증서를 발급받아보자. 현재로서는 가장 간단한 방법인 것 같다. 공식 사이트 가이드를 따라 진행한다. 아래 페이지를 참고했다.


준비

  • 외부에서 접근 가능한 ip
  • 도메인 (여기서는 필자가 소유하고 있는 crudewebtools.com 도메인을 사용한다.)
  • 서버
  • 열린 http(80) 포트 (인증서 발급에 필요), 열린 https(443) 포트 (인증서 발급 받고 사용할 것)

1. Nginx 설치

인증서를 nginx 를 통해 등록하려고 한다. 설치되어 있지 않아서 먼저 설치한다. 이미 설치되어 있다면 생략한다.

nginx 설치는 https://www.nginx.com/resources/wiki/start/topics/tutorials/install/ 를 참고하여 진행하였다.

먼저 repo 를 등록한다. /etc/yum.repos.d/ 디렉토리에 nginx.repo 를 만들고 아래와 같이 작성한다.

[nginx]
name=nginx repo
baseurl=https://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

이제 설치하자.

# yum -y install nginx

설치가 되었으면 확인해 보자. 1.20.2 로 설치가 되었다.

# nginx -v
nginx version: nginx/1.20.2

2. nginx 구동

외부에서 도메인으로 접근 가능한 상태여야 한다. 서버의 ip 에 대한 도메인 등록은 이미 되어 있다고 가정하고 진행한다.

nginx 를 시작해서 접근 가능한지 확인해 보자.

# systemctl status nginx

http 로 접근해 보자 http://crudewebtools.com

접근해 보면 nginx 가 구동중임을 알 수 있다. 인증서가 없기 때문에 경고 표시가 나온다.

3. snapd 설치

certbot 설치 페이지에서는 snapd 로 설치하는 것을 권장하고 있다. 먼저 snapd 를 설치해 보자.

먼저 snapd 가 centos 기본 저장소에 없기 때문에, epel-release 설치가 필요하다.

# yum -y install epel-release

이제 snapd 를 설치하자.

# yum -y install snapd

이제 systemd 에 등록하자.

# systemctl enable --now snapd.socket
Created symlink from /etc/systemd/system/sockets.target.wants/snapd.socket to /usr/lib/systemd/system/snapd.socket.

잘 되었는지 확인. enabled 로 되어 있는 것을 볼 수 있다.

# systemctl list-unit-files | grep snapd.socket
snapd.socket                                  enabled

공식 페이지에는 classic snap support 를 위해서 아래와 같이 링크를 만들라고 하고 있다. 정확히 어떤 의미인지는 모르겠는데, 나중에 –classic 옵션을 사용하게 되기 때문에 추가해 두도록 하였다.

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

아직 snapd 데몬이 뜨지 않았기 때문에 띄워준다.

# systemctl start snapd

3. certbot 설치

먼저 snapd 를 최신화하라고 한다.

# sudo snap install core; sudo snap refresh core

완료되면 확인해보자

# snap version
snap    2.54.2-1.el7
snapd   2.54.2-1.el7
series  16
centos  7
kernel  3.10.0-1127.19.1.el7.x86_64

이제 certbot 을 설치하자

# sudo snap install --classic certbot
certbot 1.22.0 from Certbot Project (certbot-eff✓) installed

certbot 명령어를 사용하기 위해 심볼릭링크를 걸자.

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

확인해 보자.

# certbot --version
certbot 1.22.0

잘 된다.

4. 인증서 발급

발급을 받아보자.

  • certonly 옵션은 인증서만 발급받는다는 의미이다. 이 옵션이 없으면 자동으로 nginx 설정을 수정해 준다고 하는데, 어떻게 바꿔주는 지 정확하게 인지하고 있는 것이 아니라면 사용하지 않는 것이 나을 것 같다. 필자의 경우 nginx 설정을 직접 해 줄 것이기 때문에 certonly 옵션을 추가한다.
  • nginx 에 설정할 것이기 때문에 –nginx 옵션을 추가한다.
  • 도메인이 crudewebtools.com 이니 이것도 정확하게 써 준다.
# certbot certonly --nginx -d ycit.co.kr

이메일을 요구한다. 적어준다. 

약관 동의 요구에는 y 로 동의하고, 이메일을 통해 소식을 전달해 준다는 것에 대해서는 거절하였다.

인증서는 /etc/letsencrypt/live 아래 위치한다. 정상적으로 발급되었는지 확인해 보자

# ls -l /etc/letsencrypt/live/ycit.co.kr/
total 4
lrwxrwxrwx 1 root root  41 Jan 30 00:09 cert.pem -> ../../archive/crudewebtools.com/cert1.pem
lrwxrwxrwx 1 root root  42 Jan 30 00:09 chain.pem -> ../../archive/crudewebtools.com/chain1.pem
lrwxrwxrwx 1 root root  46 Jan 30 00:09 fullchain.pem -> ../../archive/crudewebtools.com/fullchain1.pem
lrwxrwxrwx 1 root root  44 Jan 30 00:09 privkey.pem -> ../../archive/crudewebtools.com/privkey1.pem
-rw-r--r-- 1 root root 692 Jan 30 00:09 README

5. nginx 에 인증서 적용

위에서 발급 받은 인증서를 nginx 에 적용해 보자. 테스트를 위한 것이라 간단하게 /etc/nginx/conf.d/default.conf 를 고쳐보았다. 이 때, nginx 의 경우 꼭 fullchain.pem 을 사용해야 한다.

server {
    listen       80;
    listen       443 ssl;
    server_name  ycit.co.kr;

    ssl_certificate     /etc/letsencrypt/live/crudewebtools.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/crudewebtools.com/privkey.pem;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

nginx 를 reload 하자.

# nginx -s reload

이제 https 로 접근해 보자. https://crudewebtools.com

인증서가 적용되었다.

6. 인증서 갱신에 대한 정보

원래 let’s encrypt 에서 발급하는 인증서는 유효기간이 3개월이기 때문에 주기적으로 갱신을 해 주어야 한다. certbot 의 경우에도 갱신을 위한 명령어가 존재한다.

그런데, 위 과정을 거쳐 certbot 을 통해 인증서를 발급 받은 경우, 자동으로 만료되기 20 일 전 쯤 갱신을 해준다.

해당 예약 명령은 systemd.timer 에 등록되어 있다.

확인해 보자.

# systemctl list-timers
NEXT                         LEFT       LAST                         PASSED       UNIT                         ACTIVATES
Sun 2022-01-30 01:32:00 KST  49min left n/a                          n/a          snap.certbot.renew.timer     snap.certbot.renew.service
Sun 2022-01-30 22:55:40 KST  22h left   Sat 2022-01-29 22:55:40 KST  1h 46min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

2 timers listed.
Pass --all to see loaded but inactive timers, too.

서버에 별 문제가 생기지 않는다면 자동으로 알아서 계속 갱신해 줄 것이다.

답글 남기기

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