Synology에서 Wildcard SSL 인증서 자동 갱신하기

원투데이·2023년 10월 15일
0

글 쓰다가 임시저장 누르고 다른 페이지 이동했는데 저장 안돼서 날리고 대충 씁니다.

(대충 와일드카드 인증서 자동 갱신 때문에 고생하다가 블로그까지 개설해서 글로 정리해두기로 결심했다는 내용)

개요

제가 사용한 방법은 도커로 certbot 구동하고 cloudflare DNS txt 레코드 자동 등록하는 방법입니다. 따라서 도메인 네임서버 관리는 cloudflare에서 해야 합니다. certbot 공식 문서 중 dns-plugins라는 내용을 보면 cloudflare 말고도 몇 가지 DNS 서비스들을 지원하고 있으니 확인해보세요.

Wildcard 인증서 최초 설정

letsencrypt 인증서 발급받기

3개월 전에 하고 정리 안 해둬서 디테일을 까먹었으니 '왜 이렇게 구성했냐?'라고 물어보면 정확하게 설명하기는 어렵습니다.

  1. root 계정으로 전환합니다.
sudo -i
  1. 적당한 경로에 폴더를 하나 만듭니다. 저는 /volume1/docker/ssl 경로에 만들었습니다.
$ mkdir /volume1/docker/ssl
$ cd /volume1/docker/ssl
  1. certbot의 결과물(인증서)을 저장하기 위한 디렉토리도 만듭니다.
    사실 여기서 var 쪽 폴더는 실행 후에 backups 폴더도 생기는데 왜 필요한지 기억이 안 납니다.
$ mkdir etc
$ mkdir var
  1. certbot 실행 스크립트를 작성하겠습니다. 최초 설정을 위한 것이라 한 번만 실행할 것이지만 기록용으로 스크립트로 작성하는 편입니다. 저는 certbot.sh라는 이름으로 만들겠습니다. (이 스크립트 파일 위치는 별로 중요하지 않습니다.)
#!/bin/bash

CONTAINER_NAME=certbot
docker run -it --rm \
  --pull=always \
  --name=${CONTAINER_NAME} \
  -e "TZ=Asia/Seoul" \
  -v '/volume1/docker/ssl/etc:/etc/letsencrypt' \
  -v '/volume1/docker/ssl/var:/var/lib/letsencrypt' \
  certbot/certbot certonly \
  -d 'example.com' \
  -d '*.example.com' \
  --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

당연한 소리지만 example.com은 자신의 도메인으로 바꿔주세요.

  1. 방금 작성한 스크립트에 실행 권한을 추가합니다.
$ chmod u+x ./certbot.sh
  1. 스크립트를 실행하면 대화형으로 certbot 명령이 시작됩니다.
$ ./certbot.sh
  1. 하지만 안타깝게도 저는 이미 인증서를 발급 받았기 때문에 자세한 내용을 작성하기 어렵네요. 여기부터는 제 기억에 의존한 설명입니다.
    certbot이 실행되면서 출력하는 로그를 보다보면 _acme_challenge DNS 레코드가 두 개 나올텐데, 두 레코드를 cloudflare > DNS > records 메뉴에서 TXT 타입으로 추가하면 됩니다. DNS 레코드가 반영될 때까지 약간의 시간이 필요하니 바로 엔터를 누르지 마세요.
    꼭 certbot에서 출력하는 내용을 꼼꼼하게 읽어보시기 바랍니다. 저는 대충 읽고 엔터 눌러서 레코드 값이 바뀌고 계속 다시 설정하는 삽질을 좀 했습니다.

  2. 여기까지 완료하면 etc 경로 안에 대략 다음과 같은 구조로 파일들이 생성됩니다. 저는 이미 최초 설정 후 두 번째 갱신을 했기 때문에(한 번 갱신 성공 했었네요...?) 인증서 파일이 3개씩 있습니다.

$ tree  # 이건 제가 따로 설치한 것이고 synology에는 기본적으로 이 명령어가 존재하지 않습니다.
.
├── etc
│   ├── accounts
│   │   └── acme-v02.api.letsencrypt.org
│   │       └── directory
│   │           └── 19539536317214ac58ec7cab8a413562
│   │               ├── meta.json
│   │               ├── private_key.json
│   │               └── regr.json
│   ├── archive
│   │   └── example.com
│   │       ├── cert1.pem
│   │       ├── cert2.pem
│   │       ├── cert3.pem
│   │       ├── chain1.pem
│   │       ├── chain2.pem
│   │       ├── chain3.pem
│   │       ├── fullchain1.pem
│   │       ├── fullchain2.pem
│   │       ├── fullchain3.pem
│   │       ├── privkey1.pem
│   │       ├── privkey2.pem
│   │       └── privkey3.pem
│   ├── cloudflare.ini
│   ├── live
│   │   ├── README
│   │   └── example.com
│   │       ├── cert.pem -> ../../archive/example.com/cert3.pem
│   │       ├── chain.pem -> ../../archive/example.com/chain3.pem
│   │       ├── fullchain.pem -> ../../archive/example.com/fullchain3.pem
│   │       ├── privkey.pem -> ../../archive/example.com/privkey3.pem
│   │       └── README
│   ├── renewal
│   │   └── example.com.conf
│   └── renewal-hooks
│       ├── deploy
│       ├── post
│       └── pre
...

Synology에 인증서 등록하기

발급 받은 인증서를 Synology가 인식할 수 있게 할 차례입니다. Synology 기본 인증서를 바꿔치기 하는 방식입니다.

우선 아래 이미지 처럼 Synology DSM > 제어판 > 보안 > 인증서 메뉴에서 기본 인증서를 적당히 생성해 둡니다.
이 인증서를 사용하는 게 아니기 때문에 아무렇게나 만들어도 상관없습니다.

단! 꼭 기본 인증서 설정 해 주세요!

  1. Synology 인증서 경로로 이동합니다.
$ cd /usr/syno/etc/certificate/_archive
$ ls -l
total 28
-rw------- 1 root root    7 Feb 26  2023 DEFAULT
-rw------- 1 root root 7070 Oct 12 12:24 INFO
drwx------ 2 root root 4096 Sep 14 11:22 Lkks6Q
-rwx------ 1 root root 5618 Oct 12 12:24 SERVICES
drwx------ 2 root root 4096 May 27 18:45 UbPBUK

Lkks6Q, UbPBUK는 제 인증서 폴더이기 때문에 다른 이름으로 되어 있을거고, 폴더 개수도 다를 수 있습니다.

  1. DEFAULT 파일에 저장된 텍스트는 기본 인증서 경로를 가리킵니다.
    제 경우에는 UbPBUK 폴더가 기본 인증서 폴더네요.
$ cat DEFAULT
UbPBUK
  1. 기본 인증서 파일을 certbot으로 발급 받은 인증서로 대치합니다.
$ cd UbPBUK # 본인의 기본 인증서 폴더로 이동하세요
$ rm *
$ ln -s /volume1/docker/ssl/etc/live/example.com/cert.pem cert.pem
$ ln -s /volume1/docker/ssl/etc/live/example.com/chain.pem chain.pem
$ ln -s /volume1/docker/ssl/etc/live/example.com/fullchain.pem fullchain.pem
$ ln -s /volume1/docker/ssl/etc/live/example.com/privkey.pem privkey.pem
$ ls -l
total 0
lrwxrwxrwx+ 1 root root 46 Oct 15 22:29 cert.pem -> /volume1/docker/ssl/etc/live/example.com/cert.pem
lrwxrwxrwx+ 1 root root 47 Oct 15 22:30 chain.pem -> /volume1/docker/ssl/etc/live/example.com/chain.pem
lrwxrwxrwx+ 1 root root 51 Oct 15 22:30 fullchain.pem -> /volume1/docker/ssl/etc/live/example.com/fullchain.pem
lrwxrwxrwx  1 root root 49 Oct 15 22:30 privkey.pem -> /volume1/docker/ssl/etc/live/example.com/privkey.pem
  1. 이제 Synology 웹서버를 재시작합니다. 다음 명령어는 Syonlogy DSM 7.0 이상에서 동작합니다. 잘 모르겠다면 Synology 자체를 재시작해도 됩니다.
$ synosystemctl restart nginx
  1. Synology DSM > 제어판 > 보안 > 인증서 메뉴나 도메인으로 접속하여 SSL 인증서가 잘 적용됐는지 확인해 보세요.

자동 갱신 설정

Synology 스케줄러 설정 방법까지는 자세히 설명하지 않습니다. letsencrypt 인증서는 90일의 만료일자를 가지고 있고 30일 남았을 때부터 갱신이 가능합니다. 허나 Synology에서 작업 스케줄러를 효율적으로 설정하기 힘들기 때문에 저 같은 경우 한 달마다 실행되는 스크립트를 15일 간격으로 총 2개 설정해 두었습니다.

30일 이전에 갱신을 시도할 경우 실행이 적당히 종료되니 이 정도로 설정하면 충분합니다.

그럼 작업 스케줄러 스크립트 내용부터 설명하겠습니다.

  1. 다음 스크립트를 실행하는 작업 스케줄러를 설정합니다. (renew.sh 스크립트는 아직 작성하지 않았습니다.)
# renew certificates
bash /volume1/docker/ssl/renew.sh
  1. renew.sh 스크립트를 작성합니다.
$ sudo -i
$ vi /volume1/docker/ssl/renew.sh # 편집기는 편한 걸로 사용하세요

/volume1/docker/ssl/renew.sh:

CONTAINER_NAME=certbot
docker run --rm \
  --pull=always \
  --name ${CONTAINER_NAME} \
  -e "TZ=Asia/Seoul" \
  -v '/volume1/docker/ssl/etc:/etc/letsencrypt' \
  -v '/volume1/docker/ssl/var:/var/lib/letsencrypt' \
  certbot/dns-cloudflare renew \
  --dns-cloudflare \
  --dns-cloudflare-credentials '/etc/letsencrypt/cloudflare.ini' \
  --dns-cloudflare-propagation-seconds 60
  1. cloudflare에서 DNS TXT 레코드를 편집할 수 있는 권한을 가진 API Token을 만들어 도커 볼륨으로 설정한 /etc 아래에 만듭니다.
$ cd /volume1/docker/ssl/etc
$ vi cloudflare.ini

/volume1/docker/ssl/etc/cloudflare.ini:

# Cloudflare API token used by Certbot
dns_cloudflare_api_token = '<API Token>'

API Key가 아니라 API Token입니다. 이 이상의 설명은 certbot 공식문서(Welcome to certbot-dns-cloudflare’s documentation!#Credentials)를 참고해 주세요.

  1. 여기까지 하면 설정은 완료입니다. 2개월 뒤에 봅시다.
profile
화장실은 한 줄, 지하철은 네 줄

0개의 댓글