ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • certbot 으로 let's encrypt 인증서 발급받기
    linux 2022. 1. 30. 00:48
    반응형

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


    준비

      • 외부에서 접근 가능한 ip
      • 도메인 (여기서는 필자가 소유하고 있는 crudewebtools.com 도메인을 사용한다.)
      • 서버
      • 열린 http(80) 포트 (인증서 발급에 필요), 열린 https(443) 포트 (인증서 발급 받고 사용할 것)
    • 환경
      • CentOS 7.9
      • Nginx 1.20.2
    • 참고
      • 본문의 명령들은 모두 root 권한으로 실행하였다. root 가 아닌 경우 일부 sudo 로 실행해야 하는 경우가 있다.

     

    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 crudewebtools.com

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

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

     

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

    # ls -l /etc/letsencrypt/live/crudewebtools.com/
    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  crudewebtools.com;
    
        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.

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

    반응형

    댓글

Designed by Tistory.