워드프레스에 SSL 인증서 적용하기

Posted by

Let’s Encrypt는 무료 TLS/SSL 인증서를 제공하는 자동화된 개방형 인증 기관입니다. 이 서비스는 ISRG(Internet Security Research Group)에서 제공합니다. 이 포스팅에서는 Certbot을 통해 Nginx 웹서버가 동작하는 Ubuntu 20.04 서버(Vultr에서 제공하는 워드프레스용 호스팅 서버 환경)에 Let’s Encrypt SSL 인증서를 설치하는 방법을 소개합니다. 모든 작업이 완료되면 서버에 유효한 인증서가 있고 모든 HTTP 요청을 HTTPS로 리디렉션합니다.

저는 서브도메인으로 여러 개의 블로그를 운영하고 있습니다. 글 마지막 부분에 서브도메인에도 SSL 인증서를 적용하는 방법을 소개하도록 하겠습니다. 아주 작은 실수로 인해 문제가 생겨서 해결하느라 애를 먹었습니다.

서버 환경 및 요구사항

  • Linux OS는 Ubuntu이며, 웹서버는 Nginx 기준입니다.
  • 서버 주소를 가리키는 도메인 이름이 있습니다.
  • Web Console 접속 또는 PuTTY 등을 통해 SSH 연결 후, root로 로그인을 했다고 가정합니다.

1. Certbot 설치

Snap으로 Certbot을 설치합니다.

  1. Snapd (Ubuntu의 Universal package 관리 툴)이 최신 버전인지 확인합니다.
    $ sudo snap install core; sudo snap refresh core
  2. 기존에 설치된 certbot-auto Certbot OS package를 삭제합니다.
    $ sudo apt-get remove certbot
  3. Snap으로 Certbot을 설치합니다.
    $ sudo snap install --classic certbot
  4. Certbot을 /usr/bin에 연결합니다.
    $ sudo ln -s /snap/bin/certbot /usr/bin/certbot

2. 인증서 설치

설치 전 참고 사항

/etc/nginx/conf.d 폴더 내에 .conf 파일이 1개 이상 존재합니다. 여기에는 서버 설정과 관련된 내용이 들어있어서, 서버를 구동할 때 해당 폴더 내 .conf 파일들을 전부 불러옵니다.
※ nginx 환경설정 파일인 /etc/nginx/nginx.conf 파일에서 include로 불러오는 부분을 확인할 수 있습니다.

/etc/nginx/conf.d 내 .conf 파일 예제
/etc/nginx/conf.d 내 .conf 파일 예제

보통은 default.conf 파일이 있지만, 이름이 고정된 건 아닙니다. 그리고 여러 개의 사이트를 운영한다면 .conf 파일도 여러 개 들어있을 수도 있는데요, 그렇다고 파일명과 사이트가 1:1 매칭되는 것은 아닙니다. 한 파일에 몰아서 서버 설정을 할 수도 있습니다.

certbot으로 인증서를 설치하기 전에 /etc/nginx/conf.d 폴더를 백업하시기를 권합니다. 인증서를 설치하면서 certbot이 .conf 파일에 인증서 경로 등을 추가해놓기 때문입니다. 혹시라도 인증서를 삭제하거나 문제가 생기면 nginx 동작이 실패할 수 있습니다.

설치 과정

  1. vim이나 nano 등 익숙한 에디터를 사용해서 /etc/nginx/conf.d 내 conf 파일을 엽니다.
    $ vim /etc/nginx/conf.d/default.conf
  2. server_name에 도메인 이름을 추가하고 파일을 저장합니다.
  3. Certbot을 실행합니다.
    # certbot --nginx --redirect -d example.com -d www.example.com -m admin@example.com --agree-tos
  4. 인증서를 확인합니다.
    # certbot certificates

3. 인증서 자동 갱신 확인

    Let’s Encrypt 인증서는 90일 동안 유효합니다. Certbot은 systemd timer 또는 crontab을 통해 인증서를 자동으로 갱신합니다. 아래 순서는 systemd timer 또는 crontab이 잘 동작하는지 확인합니다. (정확한 출처는 찾지 못했지만, cron은 systemd timer가 활성화 되지 않은 경우에만 동작한다고 합니다. 어쨌든 둘 다 같은 역할을 수행하므로 하나만 제대로 동작하면 됩니다. )

    1. systemd timer 가 활성화되어 있는지 확인합니다.
      # systemctl list-timers | grep 'certbot\|ACTIVATES'
    2. crontab 작업 엔트리에 certbot이 있는지 확인합니다.
      # ls -l /etc/cron.d/certbot
    3. –dry-run 옵션으로 인증서 자동 갱신이 잘 동작하는지 시뮬레이션을 해봅니다.
      # certbot renew --dry-run

    타이머가 성공적으로 동작한다면 하루에 2번 인증서 자동 갱신을 시도하게 됩니다. 인증서 갱신은 만료일까지 30일 이하로 남았을 경우에 가능합니다.

    4. 서브도메인 SSL 인증서 설치하기

    서버 한 대에 두 개의 워드프레스를 돌리고 있습니다. 한 개는 2차 도메인이고 한 개는 서브도메인입니다. 서브도메인 워드프레스 사이트에 대해 SSL 인증서를 발급받아서 적용하는 방법은 간단합니다.

    ※ 혹시 실수하더라도 certbot delete 과정은 신중해야 합니다. 왜냐면 /etc/nginx/conf.d 폴더의 .conf 파일 내용을 수정했기 때문에 단순히 인증서를 삭제하다가는 nginx 서버 동작이 실패할 수 있습니다. 인증서를 안전하게 삭제하려면 https://eff-certbot.readthedocs.io/en/stable/using.html#safely-deleting-certificates 문서를 참고하시기 바랍니다.

    aaa.example.com이라는 서브 도메인에 인증서를 받는다고 가정했을 때, 아래와 같이 입력하면 됩니다. 위에서 소개한 인증서 설치 과정은 2차 도메인이었는데요, 서브도메인도 비슷합니다. 리다이렉션하는 부분만 빠졌습니다.
    # certbot --nginx -d aaa.example.com -m admin@example.com --agree-tos

    작업이 완료되어 certbot certificate를 입력해 보면 2개의 인증서가 나오는 것을 확인할 수 있습니다. 또한 웹브라우저를 통해 사이트에 접속할 때도 주소 왼쪽에 자물쇠 아이콘이 뜨는 것을 확인할 수 있습니다.

    Leave a Reply

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