首页 在群晖 NAS 上解决 acme.sh 因双重身份验证无法运行的问题

在群晖 NAS 上解决 acme.sh 因双重身份验证无法运行的问题

考虑到安全性问题,我将家里群晖 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 上有好几个值,比如 _SSIDdid_CrPoStidio,我们只需要 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 .
  1. https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide ↩︎

或许您会对以下内容感兴趣