잡생각

시놀로지 와일드카드 인증서 자동갱신 스크립트(acme.sh, let's encrypt)

daily-kim 2024. 7. 4. 00:32

몇 년간 집에서 나스를 사용하면서 다양한 트러블을 경험하고 있다. 

무료 ddns를 비롯, 여러 세팅을 바꿔보다가 현재는 외부도메인을 결제하여 사용 중이다. 

예를 들면 'aaa.bbb' 도메인을 설정, 서브도메인을 사용해 'ccc.aaa.bbb' 형태로 나스에 접속, 이외 다양한 서브도메인을 잡고, 웹서버에서 리다이렉트 하는 식으로 링크들을 설정하여 사용 중인데, HTTPS 접속을 위한 SSL 인증서가 매번 말썽이다.

처음 외부도메인을 설정할때는 별생각 없이 하나의 서브도메인에 대해서만 시놀로지 제어판 인증서를 사용했고 자동 갱신하도록 해서 문제가 없었는데, 이것저것 도메인을 늘리다가 설정도 손보다 보니 자꾸 인증서가 만료되어 접속이 불가능한 경우가 많았다. 

시놀로지 제어판에서 깔끔하게 설정할 수 있으면 좋겠는데, synology.me 도메인을 제외하고는 와일드카드 도메인을 자동갱신할 수 없도록 제한되어있는 부분이 있어, 이참에 깔끔하게 설정하려다가 좋은 포스팅을 발견했다. 

https://www.hlog.io/ssl-cert-auto-renew-on-synology

 

시놀로지 NAS Wildcard SSL 자동 갱신 설정 (acme.sh + Cloudflare API)

acme.sh+Cloudflare DNS API를 사용하여 Synology NAS에 Wildcard SSL 인증서 발급받고, 이후 인증서 갱신 작업을 자동화할 수 있다.

www.hlog.io

해당 포스팅 저자는 cloudflare dns를 사용중이신 것으로 보이는데 아쉽지만 난 porkbun을 사용 중이다. 이제 와서 도메인을 이사하자니 얼마 전에 갱신했는데 아까운 것도 있고, 여행 중에 괜히 건드리다가 접속이 안되면 굉장히 귀찮아질 것 같아 스크립트를 슬쩍 수정해서 사용했다.

비슷한 상황에 처한 사람이 있을까 하는 생각 겸, 기록을 위해 간단하게 방법을 남긴다. 

1. porkbun API 발급

https://porkbun.com/account/api  사용중인 도메인에 대해 API 키를 발급한다. Private key는 사이트를 벗어나면 사라지기 때문에, 잘 기록해 둘 필요가 있다. 

잘 복사 해 두면 된다

2. 링크한 블로그 원본 내용에 따라 스크립트 작성

저자 분 내공이 상당한듯 하다. 스크립트 생성기까지 잘 만들어 두셨다.  감사한 마음으로 필요한 부분만 잘 수정했다. 

/* 원본 - Cloudflare */

wget https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh #acme.sh 다운로드
chmod a+x acme.sh # 권한 설정
mkdir /root/.acme.sh # 디렉토리 생성
sh acme.sh --upgrade # 스크립트 업데이트
sh acme.sh --set-default-ca --server letsencrypt # CA 변경
export CF_Token="[Cloudflare 토큰]" # Cloudflare 토큰
export CF_Email="[Cloudflare 계정 이메일 주소]" # Cloudflare 계정 이메일 주소
sh acme.sh --issue --dns dns_cf -d [나의 도메인] -d '*.[나의 도메인]' # 와일드카드 인증서 발급

cp /root/.acme.sh/[나의 도메인]_ecc/[나의 도메인].cer /usr/syno/etc/certificate/_archive/[기본 인증서 경로]/cert.pem
cp /root/.acme.sh/[나의 도메인]_ecc/ca.cer /usr/syno/etc/certificate/_archive/[기본 인증서 경로]/chain.pem
cp /root/.acme.sh/[나의 도메인]_ecc/fullchain.cer /usr/syno/etc/certificate/_archive/[기본 인증서 경로]/fullchain.pem
cp /root/.acme.sh/[나의 도메인]_ecc/[나의 도메인].key /usr/syno/etc/certificate/_archive/[기본 인증서 경로]/privkey.pem # 인증서 등록
cp /root/.acme.sh/[나의 도메인]_ecc/[나의 도메인].cer /usr/syno/etc/certificate/system/default/cert.pem
cp /root/.acme.sh/[나의 도메인]_ecc/ca.cer /usr/syno/etc/certificate/system/default/chain.pem
cp /root/.acme.sh/[나의 도메인]_ecc/fullchain.cer /usr/syno/etc/certificate/system/default/fullchain.pem
cp /root/.acme.sh/[나의 도메인]_ecc/[나의 도메인].key /usr/syno/etc/certificate/system/default/privkey.pem # 기본 인증서 등록

synosystemctl restart nginx # nginx 서비스 재시작

/* 수정 - Porkbun */
wget https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh # 스크립트 다운로드
chmod a+x acme.sh # 권한 설정
mkdir /root/.acme.sh # 디렉토리 생성
sh acme.sh --upgrade # 스크립트 업데이트
sh acme.sh --set-default-ca --server letsencrypt # CA 변경
export PORKBUN_API_KEY="[API KEY]" # [수정]Porkbun API
export PORKBUN_SECRET_API_KEY="[SECRET API KEY]" #[수정] Porkbun API(SECRET)
sh acme.sh --issue --dns dns_porkbun -d [나의 도메인] -d '*.[나의 도메인]' # [수정]와일드카드 인증서 발급

cp /root/.acme.sh/[나의 도메인]_ecc/[나의 도메인].cer /usr/syno/etc/certificate/_archive/[기본 인증서 경로]/cert.pem
cp /root/.acme.sh/[나의 도메인]_ecc/ca.cer /usr/syno/etc/certificate/_archive/[기본 인증서 경로]/chain.pem
cp /root/.acme.sh/[나의 도메인]_ecc/fullchain.cer /usr/syno/etc/certificate/_archive/[기본 인증서 경로]/fullchain.pem
cp /root/.acme.sh/[나의 도메인]_ecc/[나의 도메인].key /usr/syno/etc/certificate/_archive/[기본 인증서 경로]/privkey.pem # 인증서 등록
cp /root/.acme.sh/[나의 도메인]_ecc/[나의 도메인].cer /usr/syno/etc/certificate/system/default/cert.pem
cp /root/.acme.sh/[나의 도메인]_ecc/ca.cer /usr/syno/etc/certificate/system/default/chain.pem
cp /root/.acme.sh/[나의 도메인]_ecc/fullchain.cer /usr/syno/etc/certificate/system/default/fullchain.pem
cp /root/.acme.sh/[나의 도메인]_ecc/[나의 도메인].key /usr/syno/etc/certificate/system/default/privkey.pem # 기본 인증서 등록

synosystemctl restart nginx # nginx 서비스 재시작

보면 알겠지만, porkbun 용으로 환경변수와, acme 실행 시 argument 만 변경했다. 
acme.sh 깃헙 에 porkbun 외에도 다양한 api를 지원하는 것으로 보이니, 적당히 수정해서 사용하면 다른 dns 사용자들도 비슷하게 적용해서 사용할 수 있을 것으로 보인다. 

3. 자동갱신 스케줄 추가

역시 비슷한 방법으로 스크립트를 수정하면 된다. 
나는 블로그 글을 쓰면서 갱신 스크립트에 cloudflare 를 porkbun으로 수정하지 않았음을 깨달았다. 까먹고 있으면 몇 달 후 꽤나 귀찮아질 테니, 미리미리 체크하자.

/* 원본 */

sh acme.sh --issue --force --dns dns_cf -d [나의 도메인] -d '*.[나의 도메인]'

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

synosystemctl restart nginx

/* 수정 */

sh acme.sh --issue --force --dns dns_porkbun -d [나의 도메인] -d '*.[나의 도메인]'

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

synosystemctl restart nginx