使用 acme.sh 自动续签群晖的 SSL 证书¶
什么是 acme.sh¶
acme.sh 是一个纯 Shell 脚本实现的 ACME 协议客户端,可以自动化申请和续签 Let's Encrypt 等机构的免费 SSL 证书。相比 certbot 等工具,acme.sh 更轻量、依赖更少,特别适合在群晖等 NAS 设备上使用,本节使用 Docker 安装 acme.sh。
为什么需要自动续签¶
Let's Encrypt 证书有效期为 90 天,到期前需要手动续签比较麻烦。使用 acme.sh 可以实现:
- 自动申请证书
- 自动续签(默认 60 天后自动续签)
- 自动部署到群晖 DSM 系统
- 无需手动干预,一次配置永久有效
前置准备¶
- 域名:需要拥有一个域名,并能够修改 DNS 解析记录
- DNS API 支持:建议使用 DNS API 方式验证域名所有权(支持多种 DNS 服务商)
安装 Docker¶
群晖需要先安装 Container Manager(Docker)才能运行 acme.sh 容器。
安装 acme.sh¶
安装完 Container Manager(Docker)后,需要下载并运行 acme.sh 容器镜像。
设置必要的环境变量用于证书申请和部署。以下是不同 DNS 服务商的配置示例:
群晖 DSM 部署相关(必填):
SYNO_Username=admin # 群晖管理员账号
SYNO_Password=your_password # 群晖管理员登录密码
SYNO_Certificate=nas.it927.com # 证书描述名称(建议使用域名)
SYNO_Create=1 # 如果证书不存在则自动创建
DNS 服务商 API 配置(根据实际服务商选择其一):
华为云 DNS:
HUAWEICLOUD_Username=your_iam_username # IAM 用户名
HUAWEICLOUD_Password=your_iam_password # IAM 用户密码
HUAWEICLOUD_DomainName=your_account_name # 华为云账户名
阿里云 DNS:
腾讯云 DNS:
Tencent_SecretId=your_secret_id # 腾讯云 SecretId
Tencent_SecretKey=your_secret_key # 腾讯云 SecretKey
CloudFlare DNS:
CF_Token=your_api_token # CloudFlare API Token
CF_Account_ID=your_account_id # CloudFlare Account ID
更多 DNS 服务商配置请参考:acme.sh DNS API 文档
注意
如果使用华为云 DNS,必须创建 IAM 子账号并授权相应权限,详见 华为云特殊设置
检查所有配置参数,确认无误后点击 【完成】
华为云特殊设置¶
为什么需要特殊设置
华为云的 API 访问必须使用 IAM 子账号进行认证,主账号无法直接使用。因此需要创建 IAM 子账号并授予 DNS 管理权限,否则证书申请和续签会失败。
创建 IAM 子账号¶
创建并配置用户组¶
完成子用户创建后,需要创建用户组并授予 DNS 管理权限。
将用户添加到用户组¶
创建并配置好用户组后,需要将之前创建的 IAM 用户添加到该用户组中。
获取环境变量所需信息¶
完成上述配置后,需要登录子账号获取 acme.sh 所需的环境变量信息。
环境变量配置信息¶
完成以上步骤后,即可获得 acme.sh 所需的华为云环境变量:
三个环境变量的对应关系:
- HUAWEICLOUD_Username:IAM 用户名(上图中的"IAM 用户名")
- HUAWEICLOUD_Password:IAM 用户密码(修改后的新密码)
- HUAWEICLOUD_DomainName:账户名(上图中的"账户名")
配置自动续签¶
运行 acme.sh 容器后,需要创建自动续签脚本并配置计划任务,实现证书的自动申请和续签。
在本地创建名为 cert.sh 的脚本文件,根据实际情况修改以下三个必填参数:
#!/bin/bash
# 域名(必填)
DOMAIN='nas.it927.com'
# 域名 DNS 服务商(必填)
# 类型:dns_ali dns_dp dns_gd dns_aws dns_linode dns_huaweicloud 根据域名服务商而定
# 可参考:https://github.com/acmesh-official/acme.sh/wiki/dnsapi2
DNS='dns_huaweicloud'
# Docker 容器名称(必填)
DOCKER_CONTAINER_NAME='acme-sh'
# DNS API 生效等待时间 值(单位:秒),一般120即可
# 某些域名服务商的API生效时间较大,需要将这个值加大(比如900)
DNS_SLEEP=120
# 证书服务商,letsencrypt
CERT_SERVER='letsencrypt'
generateCrtCommand="acme.sh --force --log --issue --server ${CERT_SERVER} --dns ${DNS} --dnssleep ${DNS_SLEEP} -d "${DOMAIN}" -d "*.${DOMAIN}""
installCrtCommand="acme.sh --deploy -d "${DOMAIN}" -d "*.${DOMAIN}" --deploy-hook synology_dsm"
docker exec $DOCKER_CONTAINER_NAME $generateCrtCommand
docker exec $DOCKER_CONTAINER_NAME $installCrtCommand
验证证书续签¶
配置完成后,可以手动执行一次计划任务来验证证书是否能够成功申请。
故障排查
如果证书申请失败,请检查以下几点:
- 脚本参数是否正确(域名、DNS 服务商、容器名称)
- 环境变量是否正确配置
- DNS API 密钥是否有效且具备相应权限
- 查看
/volume1/docker/acme.sh/log.txt日志文件获取详细错误信息
证书部署配置¶
证书申请成功后,需要在群晖 DSM 中进行一些配置,才能正常使用 HTTPS 访问。
1. 配置 DNS 解析¶
首先需要在域名服务商处添加 DNS 解析记录,将域名指向群晖的 IP 地址。
内网访问配置:
如果仅在内网使用,将域名解析到群晖的内网 IP 地址(如 192.168.88.191)
公网访问配置:
如果需要从公网访问,将域名解析到公网 IP,并在路由器中配置端口转发(HTTPS 使用 443 端口)
2. 设置默认证书¶
证书部署成功后,需要在 DSM 中将其设置为默认证书。
进入 【控制面板】→【安全性】→【证书】→【设置】,将所有服务的证书都设置为刚申请的证书:
证书应用说明
建议将所有服务都设置为使用新证书,包括:
- DSM 桌面
- 所有套件和应用程序
- 反向代理服务(如有)
3. 配置主机名称¶
设置主机名称可以确保 DSM 正确响应来自域名的 HTTPS 请求。
进入 【控制面板】→【外部访问】→【高级设置】,在"主机名称"中填入您的域名:
验证证书¶
完成所有配置后,可以通过以下方式验证证书是否正常工作:
浏览器访问验证¶
在浏览器中访问 https://your-domain.com(替换为您的实际域名),如果看到如下页面且浏览器地址栏显示安全锁图标,说明证书配置成功:
证书信息检查¶
点击浏览器地址栏的安全锁图标,查看证书详情,确认:
- 证书颁发机构为 Let's Encrypt
- 证书有效期为 90 天
- 证书包含主域名和通配符域名(如配置了
*.your-domain.com)








































