Search

시놀로지 NAS Wildcard SSL (Let's encrypt)

시놀로지 나스(Synology Nas) 와일드카드(Wildcard) SSL - Let's Encrypt
개인적으로 이용하는 나스에서 와일드카드 인증서를 구매해서 사용하다 기간만료가 다가왔다.. ㅠ
이번 기회에 Let's Encrypt로 넘어가고자 검색 후 방법을 찾아 정리해둔다.

실행하기에 앞서..

1.
나스의 웹용 대시보드가 아닌 ssh로 접근해서 로그인해야 한다.
제어판 → 터미널 및 SNMP → SSH 서비스 활성화
보안상 방화벽에서 내부로만 허용하길 권장한다.
2.
평소에 이용하는 계정이 관리자 계정일지라도 root계정으로 전환을 해야 한다.
ssh로 접근을 했다면 아래 명령어로 root로 전환 가능하다.
sudo -i
Bash

인증서 발급 진행과정

아래 명령어부터는 root 계정의 기본 경로인 /root 기준으로 진행한다

스크립트 다운로드

wget https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh
Bash

권한설정

chmod a+x acme.sh
Bash

기본 CA 변경

sh acme.sh --set-default-ca --server letsencrypt
Bash
아래처럼 나올경우 하위에 .acme.sh 폴더 생성
touch: cannot touch '/root/.acme.sh/account.conf': No such file or directory grep: /root/.acme.sh/account.conf: No such file or directory grep: /root/.acme.sh/account.conf: No such file or directory acme.sh: line 2249: /root/.acme.sh/account.conf: No such file or directory grep: /root/.acme.sh/account.conf: No such file or directory [Wed Nov 3 17:12:40 KST 2021] Changed default CA to: https://acme-v02.api.letsencrypt.org/directory
Bash
하위에 .acme.sh 폴더 생성 후 실행
mkdir /root/.acme.sh
Bash
[Wed Nov 3 17:12:40 KST 2021] Changed default CA to: https://acme-v02.api.letsencrypt.org/directory
Bash

TXT값 받아오기

sh acme.sh --issue --dns --force -d [도메인] -d *.[도메인] --yes-I-know-dns-manual-mode-enough-go-ahead-please
Bash
[Wed Nov 3 17:14:04 KST 2021] Using CA: https://acme-v02.api.letsencrypt.org/directory [Wed Nov 3 17:14:05 KST 2021] Create account key ok. [Wed Nov 3 17:14:06 KST 2021] Registering account: https://acme-v02.api.letsencrypt.org/directory [Wed Nov 3 17:14:07 KST 2021] Registered [Wed Nov 3 17:14:07 KST 2021] ACCOUNT_THUMBPRINT='....' [Wed Nov 3 17:14:07 KST 2021] Creating domain key [Wed Nov 3 17:14:08 KST 2021] The domain key is here: /root/.acme.sh/[도메인]/[도메인].key [Wed Nov 3 17:14:08 KST 2021] Multi domain='DNS:[도메인],DNS:*.[도메인]' [Wed Nov 3 17:14:08 KST 2021] Getting domain auth token for each domain [Wed Nov 3 17:14:10 KST 2021] Getting webroot for domain='[도메인]' [Wed Nov 3 17:14:10 KST 2021] Getting webroot for domain='*.[도메인]' [Wed Nov 3 17:14:11 KST 2021] Add the following TXT record: [Wed Nov 3 17:14:11 KST 2021] Domain: '_acme-challenge.[도메인]' [Wed Nov 3 17:14:11 KST 2021] TXT value: '[TXT_VALUE]' [Wed Nov 3 17:14:11 KST 2021] Please be aware that you prepend _acme-challenge. before your domain [Wed Nov 3 17:14:11 KST 2021] so the resulting subdomain will be: _acme-challenge.[도메인] [Wed Nov 3 17:14:11 KST 2021] Add the following TXT record: [Wed Nov 3 17:14:11 KST 2021] Domain: '_acme-challenge.[도메인]' [Wed Nov 3 17:14:11 KST 2021] TXT value: '[TXT_VALUE]' [Wed Nov 3 17:14:11 KST 2021] Please be aware that you prepend _acme-challenge. before your domain [Wed Nov 3 17:14:11 KST 2021] so the resulting subdomain will be: _acme-challenge.[도메인] [Wed Nov 3 17:14:11 KST 2021] Please add the TXT records to the domains, and re-run with --renew. [Wed Nov 3 17:14:11 KST 2021] Please add '--debug' or '--log' to check more details. [Wed Nov 3 17:14:11 KST 2021] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
Bash
위에서 나온 _acme-challenge.[도메인] TXT value 값을 도메인에 2개를 추가 설정한다 (서브도메인)

변경여부 확인

nslookup > set type=txt > _acme-challenge.[도메인]
Bash

변경이 확인되면 인증서 발급

sh acme.sh --renew --dns --force -d [도메인] -d *.[도메인] --yes-I-know-dns-manual-mode-enough-go-ahead-please
Bash
[Wed Nov 3 17:38:21 KST 2021] Renew: '[도메인]' [Wed Nov 3 17:38:22 KST 2021] Using CA: https://acme-v02.api.letsencrypt.org/directory [Wed Nov 3 17:38:22 KST 2021] Multi domain='DNS:[도메인],DNS:*.[도메인]' [Wed Nov 3 17:38:22 KST 2021] Getting domain auth token for each domain [Wed Nov 3 17:38:22 KST 2021] Verifying: [도메인] [Wed Nov 3 17:38:24 KST 2021] Pending, The CA is processing your order, please just wait. (1/30) [Wed Nov 3 17:38:27 KST 2021] Success [Wed Nov 3 17:38:27 KST 2021] Verifying: *.[도메인] [Wed Nov 3 17:38:28 KST 2021] Pending, The CA is processing your order, please just wait. (1/30) [Wed Nov 3 17:38:31 KST 2021] Success [Wed Nov 3 17:38:31 KST 2021] Verify finished, start to sign. [Wed Nov 3 17:38:31 KST 2021] Lets finalize the order. [Wed Nov 3 17:38:31 KST 2021] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/.../...' [Wed Nov 3 17:38:32 KST 2021] Downloading cert. [Wed Nov 3 17:38:32 KST 2021] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/...' [Wed Nov 3 17:38:33 KST 2021] Cert success. -----BEGIN CERTIFICATE----- .... .... -----END CERTIFICATE----- [Wed Nov 3 17:38:33 KST 2021] Your cert is in: /root/.acme.sh/[도메인]/[도메인].cer [Wed Nov 3 17:38:33 KST 2021] Your cert key is in: /root/.acme.sh/[도메인]/[도메인].key [Wed Nov 3 17:38:33 KST 2021] The intermediate CA cert is in: /root/.acme.sh/[도메인]/ca.cer [Wed Nov 3 17:38:33 KST 2021] And the full chain certs is there: /root/.acme.sh/[도메인]/fullchain.cer
Bash

기본 인증서 경로 확인

cat /usr/syno/etc/certificate/_archive/DEFAULT
Bash
/usr/syno/etc/certificate/_archive/ 하위에 존재하는 폴더명이다

인증서 등록

/bin/cp /root/.acme.sh/[도메인]/[도메인].cer /usr/syno/etc/certificate/_archive/[기본 인증서 경로]/cert.pem /bin/cp /root/.acme.sh/[도메인]/ca.cer /usr/syno/etc/certificate/_archive/[기본 인증서 경로]/chain.pem /bin/cp /root/.acme.sh/[도메인]/fullchain.cer /usr/syno/etc/certificate/_archive/[기본 인증서 경로]/fullchain.pem /bin/cp /root/.acme.sh/[도메인]/[도메인].key /usr/syno/etc/certificate/_archive/[기본 인증서 경로]/privkey.pem
Bash

기본 인증서로 등록

/bin/cp /root/.acme.sh/[도메인]/[도메인].cer /usr/syno/etc/certificate/system/default/cert.pem /bin/cp /root/.acme.sh/[도메인]/ca.cer /usr/syno/etc/certificate/system/default/chain.pem /bin/cp /root/.acme.sh/[도메인]/fullchain.cer /usr/syno/etc/certificate/system/default/fullchain.pem /bin/cp /root/.acme.sh/[도메인]/[도메인].key /usr/syno/etc/certificate/system/default/privkey.pem
Bash

웹서버 서비스 재시작

# DSM 7.0 미만 버전 /usr/syno/sbin/synoservicectl --reload nginx # DSM 7.0 이후 /usr/syno/bin/synosystemctl restart nginx
Bash

인증서 복사

저장위치 경우 본인의 홈폴더 하위로 지정한다. (ex : /volume1/homes/[계정명]/)
/bin/cp /root/.acme.sh/[도메인]/[도메인].cer [저장위치]/cert.pem /bin/cp /root/.acme.sh/[도메인]/ca.cer [저장위치]/chain.pem /bin/cp /root/.acme.sh/[도메인]/fullchain.cer [저장위치]/fullchain.pem /bin/cp /root/.acme.sh/[도메인]/[도메인].key [저장위치]/privkey.pem
Bash

인증서 나스에 등록

home폴더로 복사된 인증서를 다운로드 받아 최초 한번은 직접 등록을 해야 한다.
1.
제어판 → 보안 → 인증서 → 추가버튼
2.
새 인증서 추가 → 인증서 가져오기
3.
다운로드 받은 인증서 등록
개인키 : privkey.pem
인증서 : cert.pem
중간인증서 : chain.pem

인증서 갱신시

/root/acme.sh --renew --dns --force -d [도메인] -d *.[도메인] --yes-I-know-dns-manual-mode-enough-go-ahead-please --server letsencrypt
Bash
[Sun Nov 3 18:24:04 KST 2021] Renew: '[도메인]' [Sun Nov 3 18:24:05 KST 2021] Using CA: https://acme-v02.api.letsencrypt.org/directory [Sun Nov 3 18:24:05 KST 2021] Multi domain='DNS:[도메인],DNS:*.[도메인]' [Sun Nov 3 18:24:05 KST 2021] Getting domain auth token for each domain [Sun Nov 3 18:24:09 KST 2021] Getting webroot for domain='[도메인]' [Sun Nov 3 18:24:09 KST 2021] Getting webroot for domain='*.[도메인]' [Sun Nov 3 18:24:09 KST 2021] [도메인] is already verified, skip dns-01. [Sun Nov 3 18:24:09 KST 2021] *.[도메인] is already verified, skip dns-01. [Sun Nov 3 18:24:09 KST 2021] Verify finished, start to sign. [Sun Nov 3 18:24:09 KST 2021] Lets finalize the order. [Sun Nov 3 18:24:09 KST 2021] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/.../...' [Sun Nov 3 18:24:12 KST 2021] Downloading cert. [Sun Nov 3 18:24:12 KST 2021] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/....' [Sun Nov 3 18:24:13 KST 2021] Cert success. -----BEGIN CERTIFICATE----- ... ... ... -----END CERTIFICATE----- [Sun Nov 3 18:24:13 KST 2021] Your cert is in: /root/.acme.sh/[도메인]/[도메인].cer [Sun Nov 3 18:24:13 KST 2021] Your cert key is in: /root/.acme.sh/[도메인]/[도메인].key [Sun Nov 3 18:24:13 KST 2021] The intermediate CA cert is in: /root/.acme.sh/[도메인]/ca.cer [Sun Nov 3 18:24:13 KST 2021] And the full chain certs is there: /root/.acme.sh/[도메인]/fullchain.cer
Bash

인증서 자동 갱신 스크립트

방법을 찾아본 결과 시놀로지 웹서버 재시작 하는 명령어가 조금 달랐다.
아래 스크립트를 홈폴더에 저장하고 도메인 부분은 본인의 도메인으로 변경해 주기 바란다.

renew_ssl_cert.sh

#!/bin/sh # config domain="[도메인]" # ex) vericras.com # default cert path defaultFolder=$(cat /usr/syno/etc/certificate/_archive/DEFAULT) # path info baseAcme="/root/.acme.sh/$domain" certAricve="/usr/syno/etc/certificate/_archive/$defaultFolder" certDefault="/usr/syno/etc/certificate/system/default" echo "Let's Encrypt :: Renew" # lets encrypt renew /root/acme.sh --renew --dns --force -d $domain -d *.$domain --yes-I-know-dns-manual-mode-enough-go-ahead-please --server letsencrypt # copy cert :: archive /bin/cp $baseAcme/$domain.cer $certAricve/cert.pem /bin/cp $baseAcme/ca.cer $certAricve/chain.pem /bin/cp $baseAcme/fullchain.cer $certAricve/fullchain.pem /bin/cp $baseAcme/$domain.key $certAricve/privkey.pem # copy cert :: default /bin/cp $baseAcme/$domain.cer $certDefault/cert.pem /bin/cp $baseAcme/ca.cer $certDefault/chain.pem /bin/cp $baseAcme/fullchain.cer $certDefault/fullchain.pem /bin/cp $baseAcme/$domain.key $certDefault/privkey.pem echo "$domain cert files copy success!" echo "" echo "Synology Server :: restarting..." /usr/syno/bin/synosystemctl restart nginx echo "Synology Server :: restart end"
Bash
위 스크립트는 Synology DSM 7.+ 기준이므로 DSM 6.+에서는 경로나 재시작 명령어가 다를 수 있다.
스크립트 저장을 하였다면 아래 명령어로 실행권한을 준다.
chmod a+x renew_ssl_cert.sh
Bash

작업 스케줄러 등록

홈폴더에 저장을 했다면 DSM 대시보드의 작업 스케줄러에 추가해줄 차례다.
1.
제어판의 작업 스케줄러로 들어간다.
2.
생성 → 예약된 작업 → 사용자 정의 스크립트 클릭
3.
스케줄러의 이름을 적고 root 권한으로 선택을 한다.
4.
발급일로부터 두달 후에 실행되도록 했다. 3개월은 기간이 아슬할 것 같아 매월 반복으로 하였다. 실행시간은 이용하지 않는 시간대로 선택을 하였다.
5.
스크립트 경로를 적어준 후 확인 버튼을 눌러 저장한다.
6.
추가된 목록에서 마우스 우측버튼 누른 후 [실행]을 하여 제대로 갱신이 되는지 확인을 해본다. 실행하기 전 만료일을 확인하고 비교해보면 된다. (실행 후 기다리면 파일스테이션이 재시작중인 것 같은 화면이 나온다)
개인적으로 이용하기 위해 정리해둔 자료가 누군가에게 도움이 되길 바라면서 마친다.
ⓒ VeriCras 2021
vericras@gmail.com
TOP