使用 acme.sh 给群晖申请 SSL 证书

本文简单的阐述了如何在 443 端口无法访问时申请证书并部署到群晖 DSM 中。简单来说,就两个重要步骤: DNS 验证证书部署证书到群晖 DSM

在申请证书的时候,acme.sh 需要验证当前域名的所有权,有两种验证方式:HTTP 和 DNS 验证。HTTP 验证需要 443 端口能够访问,而 DNS 方式则不受此限制。

适用版本

注意:
若软件版本不一致,此笔记中的方法有较小的概率无效。之前遇到过 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 服务商

  1. 申请 CloudFlare token,参考 CloudFlare 官方文档:https://developers.cloudflare.com/fundamentals/api/get-started/create-token
  2. 导出 token:export CF_Token="xxxx"
  3. 导出 email:export CF_Email="[email protected]"
  4. 执行命令:/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

  1. 导出群晖的管理员用户名: export SYNO_USERNAME="xxx"
  2. 导出群晖的管理员密码:export SYNO_PASSWORD="xxx"
  3. 导出群晖 DSM 使用的 http schema:export SYNO_SCHEME="http"。可选 http 或者 https,默认为 http
  4. 导出群晖 DSM 的 url:export SYNO_HOSTNAME="localhost"。可选,默认为 localhost
  5. 导出 DSM 所在的端口号:export SYNO_PORT="5000"。可选,默认为 5000
  6. 执行:/root/.acme.sh/acme.sh --deploy --deploy-hook synology_dsm -d xxx.com,如果开启了两步验证,会被要求输入 OTP 码(从群晖的 Secure SignIn APP 获取)

注意:

  1. 以上环境变量需要区分大小写。
  2. 如果终端使用了代理,请移除,否则 acme 可能会无法访问 localhost:5000

renew 证书

定时执行以下脚本即可更新证书的有效期:

#!/bin/bash
 
export CF_Token="xxx"
 
export CF_Email="[email protected]"
 
/root/.acme.sh/acme.sh --renew -d xxx.com
 
 
export SYNO_USERNAME="xxx"
 
export SYNO_PASSWORD="xxx"
 
export SYNO_SCHEME="http"
 
export SYNO_HOSTNAME="localhost"
 
export SYNO_PORT="5000"
 
/root/.acme.sh/acme.sh --deploy --deploy-hook synology_dsm -d xxx.com

如何执行定时任务,可参考群晖官网文档: https://kb.synology.cn/zh-cn/DSM/help/DSM/AdminCenter/system_taskscheduler

注意:
如果将来升级了群晖的版本,.acme.sh 文件夹可能会被删除。