使用 acme.sh 给群晖申请 SSL 证书
本文简单的阐述了如何在 443 端口无法访问时申请证书并部署到群晖 DSM 中。简单来说,就两个重要步骤: DNS 验证证书和部署证书到群晖 DSM。
在申请证书的时候,acme.sh 需要验证当前域名的所有权,有两种验证方式:HTTP 和 DNS 验证。HTTP 验证需要 443 端口能够访问,而 DNS 方式则不受此限制。
适用版本
- acme.sh 版本:v3.0.8
- 群晖 DSM 版本:DSM 7.2.1-69057 Update 5
注意:
若软件版本不一致,此笔记中的方法有较小的概率无效。之前遇到过 acme.sh 官方把环境变量名改为了大写,导致出了问题。下面的步骤,都附有官方的链接,如果有问题,可以直接访问对应的官方链接。
使用 ssh 登录到 nas
参考群晖官方文档: https://kb.synology.cn/zh-cn/DSM/tutorial/How_to_login_to_DSM_with_root_permission_via_SSH_Telnet
安装 acme.sh
执行 curl https://get.acme.sh | sh -s [email protected]
即可安装。如果报错提示需要安装 crontab
,可以使用 --force
参数强制安装 curl https://get.acme.sh | sh -s [email protected] --force
。
更多信息参考 acme.sh 官方文档: https://github.com/acmesh-official/acme.sh?tab=readme-ov-file#1-how-to-install
申请证书
本步骤参考的是 acme.sh 的官方文档:https://github.com/acmesh-official/acme.sh/wiki/dnsapi#1-cloudflare-option。使用的 DNS 服务商是 CloudFlare,此外,acme.sh 还支持很多 DNS 服务商。
- 申请 CloudFlare token,参考 CloudFlare 官方文档:https://developers.cloudflare.com/fundamentals/api/get-started/create-token
- 导出 token:
export CF_Token="xxxx"
- 导出 email:
export CF_Email="[email protected]"
- 执行命令:
/root/.acme.sh/acme.sh --issue --dns dns_cf --server letsencrypt -d xxx.com -d '*.xxx.com'
把证书部署到 DSM 中
本步骤参考的是 acme.sh 的官方文档:https://github.com/acmesh-official/acme.sh/wiki/deployhooks#20-deploy-the-certificate-to-synology-dsm
- 导出群晖的管理员用户名:
export SYNO_USERNAME="xxx"
- 导出群晖的管理员密码:
export SYNO_PASSWORD="xxx"
- 导出群晖 DSM 使用的 http schema:
export SYNO_SCHEME="http"
。可选http
或者https
,默认为http
- 导出群晖 DSM 的 url:
export SYNO_HOSTNAME="localhost"
。可选,默认为localhost
- 导出 DSM 所在的端口号:
export SYNO_PORT="5000"
。可选,默认为5000
- 执行:
/root/.acme.sh/acme.sh --deploy --deploy-hook synology_dsm -d xxx.com
,如果开启了两步验证,会被要求输入 OTP 码(从群晖的 Secure SignIn APP 获取)
注意:
- 以上环境变量需要区分大小写。
- 如果终端使用了代理,请移除,否则 acme 可能会无法访问
localhost:5000
。
renew 证书
定时执行以下脚本即可更新证书的有效期:
如何执行定时任务,可参考群晖官网文档: https://kb.synology.cn/zh-cn/DSM/help/DSM/AdminCenter/system_taskscheduler
注意:
如果将来升级了群晖的版本,.acme.sh
文件夹可能会被删除。