於 Synology 啟用 lets encrypt 整合 name.com+2fa+auto renew

於 Synology 啟用 lets encrypt 整合 name.com+2fa+auto renew

我的 Synology 設定再防火牆內,不對外直接提供服務,即使如此也是需要上 TLS 來提升安全性。基本上 Synology 已經支援 lets encrypt ,but 預設用的方式是 HTTP-01,所以在防火牆的的限制下,無法順利自動完成,也不法自動 renew 。之前解決方式就是另外找一個點,拿到 ca, certs 之後,再手動放進去,然後就過期了...

ACMESH 有提供解決方式 https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide,主要是運用 DNS-01 的方式,這樣的方式可以再 Synology 跑,也可以再其他 linux 上執行並佈署到 NAS 內。

相關說明可以細看上面連結,我看完之後認為至少有一些需要測試:

  1. Firewall 不可更改 。應可用acme.sh 利用dns-01方式來排除
  2. OTP/U2F 啟用,自動佈署問題。疑似可以用 Syno_DID
  3. 使用 name.com api。剛好有支援name.com api
  4. 確定可以 auto-renew

第一次,我直接在 NAS 裏面做,但是權限和環境限制多,不方便做測試,決定先再linux server 上實作後再丟到NAS裏面跑。

Ubuntu 上測試

依上數網址陸續步驟執行:

取得 acme.sh 並解壓縮到 /usr/local/share/acme/

sudo su
cd /usr/local/share/
wget https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
tar xvf master.tar.gz
mv acme.sh-master/ acme
cd acme
./acme.sh --install --nocron --home /usr/local/share/acme/certs --accountemail "email@gmailcom"
source ~/.bashrc

注意--home 建議用絕對路徑,且後面不需要root了

設定 name.com dns

我的 domain 是 name.com 註冊管理的,所有支援的都可以再 這邊 找到設定方式,以我的name.com而例,需要進行

export Namecom_Username="testuser"
export Namecom_Token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

name.com 有提供 API ,用戶可以申請使用。

Creating the certificate 步驟

export Namecom_Username="testuser"
export Namecom_Token="ff........fff"
export CERT_DOMAIN="piracy.domain.org"
export CERT_DNS="dns_namecom"
./acme.sh --issue --home /usr/local/share/acme/certs -d "$CERT_DOMAIN" --dns "$CERT_DNS"

可以看到 dns record 的變化,他會自動申請一個txt 然後驗證後刪掉。成功後相關的檔案就放在 certs/ 裏面!過程不需要 http 開通防火牆,算是成功用 dns-01 完成驗證。

佈署到 NAS

我的 Synology NAS 不支援只 listen 特定 FQDN 且有換 port 又有 OTP 搞得這邊有點麻煩。依照文件依序設定 SYNO_Username, SYNO_Password, SYNO_Hostname, SYNO_Scheme, SYNO_Port 都要有正確的設定。另外因為OTP,SYNO_DID 我測試不行,會表示無法登入,可能某個環節出錯;只好暫時用比較差勁的方式取代 SYNO_DID,那就是export SYNO_TOTP_SECRET=xxx 並安裝 oathtool

sudo apt-get install oathtool
export SYNO_TOTP_SECRET=xxx

TOTP 就搜尋 export totp 就有,例如備份google Authenticator 然那的檔案就有了。可以參考 https://support.google.com/accounts/answer/1066447?hl=en&co=GENIE.Platform%3DiOS。

整個script 就像

#!/bin/bash
export CERT_DOMAIN="piracy.domain.org"
export SYNO_Username='user'
export SYNO_Password='xxxx'
export SYNO_Hostname="piracy.domain.org"
export SYNO_Scheme="https"
export SYNO_Port="8208"
export SYNO_TOTP_SECRET="ffffffff"
export SYNO_Certificate=""
./acme.sh --deploy --insecure --home /usr/local/share/acme/certs -d "$CERT_DOMAIN" --deploy-hook synology_dsm

順利就會看到完成,且佈署到 NAS 裏面。再從DSM去設定後續步驟就好。
以上,基本完成,如果 ubuntu 再加上 crontab 就可以一直renew & deploiy

但是我希望這個過程直接在 NAS 中進行,所以我把程式都搬到 NAS 裏面,再 ssh 進去處理。

Synology NAS 設定 renew

把剛剛寫的程式 acme/ 整個目錄搬到 NAS,基本上就是先從網頁上傳,然後用admin group user 用 ssh 登入,切換到 root 把程式放到 /usr/share/acme 就一樣了。

把上變步驟重新執行一次,install, dns, cert, deploy 都確認沒問題,就來renew。

NAS 上沒有 oathtool 可以另外找工具代替。

renew code 很簡單,可以手動跑看看!

#!/bin/bash
export CERT_DOMAIN="piracy.domain.org"
export SYNO_Username='user'
export SYNO_Password='xxxx'
export SYNO_Hostname="piracy.domain.org"
export SYNO_Scheme="https"
export SYNO_Port="8208"
export SYNO_TOTP_SECRET="ffffffff"
export SYNO_Certificate=""
./acme.sh --cron --home /usr/local/share/acme/certs -d "$CERT_DOMAIN" --deploy-hook synology_dsm

然後到 Synology 設定排程

In DSM control panel, open the 'Task Scheduler' and create a new scheduled task for a >user-defined script.

General Setting: Task - Update default Cert. User - root
Schedule: Setup a weekly renewal. For example, 11:00 am every saturday.
Task setting: User-defined-script:

script 長這樣

export CERT_DOMAIN="piracy.domain.org"
export SYNO_Username='user'
export SYNO_Password='xxxx'
export SYNO_Hostname="piracy.domain.org"
export SYNO_Scheme="https"
export SYNO_Port="8208"
export SYNO_TOTP_SECRET="ffffffff"
export SYNO_Certificate=""
./acme.sh --cron --home /usr/local/share/acme/certs -d "$CERT_DOMAIN" --deploy-hook synology_dsm

差不多之後就是觀察會不會自動renew了!

後來也注意到 deploy 方法不少,也許之後換個更好的方式!

reference

https://lippertmarkus.com/2020/03/14/synology-le-dns-auto-renew/
https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide#configuring-certificate-renewal
https://github.com/acmesh-official/acme.sh/wiki/deployhooks#20-deploy-the-cert-into-synology-dsm
https://github.com/acmesh-official/acme.sh/wiki/deployhooks#20-deploy-the-cert-into-synology-dsm
https://github.com/acmesh-official/acme.sh/wiki/dnsapi
https://github.com/acmesh-official/acme.sh/issues/2727