85
考虑到安全性问题,我将家里群晖 NAS 的管理员账号添加了双重身份验证(2FA)。但也因为这个操作导致域名证书续期出了问题,错误提示如下:
[Mon Mar 4 05:43:41 UTC 2024] Domains not changed.
[Mon Mar 4 05:43:41 UTC 2024] Skip, Next renewal time is: 2024-04-27T16:01:06Z
[Mon Mar 4 05:43:41 UTC 2024] Add '--force' to force to renew.
[Mon Mar 4 05:43:41 UTC 2024] The domain 'nas.xxx.com' seems to have a ECC cert already, lets use ecc cert.
[Mon Mar 4 05:43:41 UTC 2024] Logging into nas.xxx.com:5001
[Mon Mar 4 05:43:42 UTC 2024] Unable to authenticate to https://nas.xxx.com:5001 - check your username & password.
[Mon Mar 4 05:43:42 UTC 2024] If two-factor authentication is enabled for the user:
[Mon Mar 4 05:43:42 UTC 2024] - set SYNO_Device_Name then input *correct* OTP-code manually
[Mon Mar 4 05:43:42 UTC 2024] - get & set SYNO_Device_ID via your browser cookies
[Mon Mar 4 05:43:42 UTC 2024] Error deploy for domain:nas.xxx.com
[Mon Mar 4 05:43:42 UTC 2024] Deploy error.
在群晖 NAS 上我是使用 Docker 来安装 acme.sh
这个工具来申请与部署证书的,在没有开启双重身份验证之前,Docker 版的 acme.sh
可以一直胜任它的工作。
由于 acme.sh
Github 仓库上的 Wiki1 写得很详细,所以当发现证书无法续期时我第一时间上官方的文档库和 Issues 里寻找解决办法。
文档里前半部分我没有看懂,TOTP 码一直在改变,那么在变量里添回 export SYNO_OTP_CODE=XXXXXX
的意义是什么?
但是后半部分我则明白,就是使用浏览器登陆账号,在双重身份验证输入 TOTP 码时勾选 在此设备上不再询问
,接着打开浏览器的开发者控制台,在菜单栏的视图 -> 开发者 -> 开发者工具,快捷键 F12
/ fn + F12
,最后找出网络 -> 随便一个请求 -> Cookie -> did 值(Cookie 上有好几个值,比如 _SSID
、did
、_CrPoSt
、id
、io
,我们只需要 did
这个值)。
did=AqqbTc7M_...-Acu1UI-HsILder...k1ZgrxyaOhExe...x3riIfNAA;
# = 号与 ; 号中间的值就是我们需要的变量值;
但是在容器变量里添加对应的值后重启容器并进行续期时仍然报错。难道这个方法只能在使用脚本部署时才能生效?于是我就测试了一下,果然成功了。
脚本部署方法
sudo su
cd ~
wget https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
tar xvf master.tar.gz
cd acme.sh-master/
./acme.sh --install --nocron --home /usr/local/share/acme.sh --accountemail "email@gmailcom"
source ~/.profile
配置变量
cd /usr/local/share/acme.sh
vim acme.sh.env
export LE_WORKING_DIR="/usr/local/share/acme.sh"
alias acme.sh="/usr/local/share/acme.sh/acme.sh"
export CF_Token="Cloudflare Token"
export CF_Email="Cloudflare 账号"
export CERT_DOMAIN="申请的域名"
export CERT_DNS="dns_cf"
export SYNO_Hostname="申请的域名"
export SYNO_Scheme="http"
export SYNO_Port="5000"
export SYNO_Username="群晖账号"
export SYNO_Password="群晖密码"
export SYNO_Certificate="申请的域名"
export SYNO_DEVICE_ID="AqqbTc7M_...-Acu1UI-HsILder...k1ZgrxyaOhExe...x3riIfNAA"
载入添加的变量
source ~/.profile
创建与部署证书
cd /usr/local/share/acme.sh
# 创建证书
./acme.sh --issue --server letsencrypt --home . -d "$CERT_DOMAIN" --dns "$CERT_DNS"
# 部署证书
./acme.sh --deploy --home . -d "$CERT_DOMAIN" --deploy-hook synology_dsm
创建自动续期
在 DSM 控制面板中,打开“任务计划程序”并为用户定义的脚本创建新的计划任务。
- 常规设置:任务 – 更新默认证书。用户-root
- 时间表:设置每周更新。例如,每周六上午 11:00。
- 任务设置:用户定义脚本:
# renew certificates
cd /usr/local/share/acme.sh
./acme.sh --cron --home .