群晖 Nas ➕ Let’s Encrypt 自动更新证书
前言
服务器证书又过期了,每次更换证书还是挺耽误事儿的。早前听说过 Let’s Encrypt 提供免费证书,并且能够通过定时任务实现自动更新,便决定趁有空的时候尝试一下。
虽然群晖系统本身已经支持通过 Let’s Encrypt 自动更新订阅证书,但有个前提是需要开启 80 端口。作为一名开通公网 IP 的用户,我显然无法满足这一条件,所以只能选择自己部署服务了。
Let’s Encrypt 使用 ACME 协议来验证域名并颁发证书,若想获取 Let’s Encrypt 的证书,你需要选择合适的 ACME 客户端软件。ACME 有多种第三方客户端实现,包括 Bash、Java、Python、Node 等等。这次,我选择了 acme.sh
,这个客户端不仅社区活跃、文档丰富,而且支持多种 DNS 供应商,还特别优化了对群晖 NAS 的支持。
acme.sh 部署证书
ACME 客户端既支持 Docker 部署,也支持本地部署。考虑到群晖系统的优化,我选择了本地部署方式。这样不仅不需要提供管理员用户名和密码,还能直接使用临时角色进行部署。而 Docker 部署方式则需要明文保存用户名和密码,显然不如本地部署方便。
下载 acme.sh
通过 SSH 登录到服务器后,为了简化操作,我直接以 root 权限登录。
1 |
|
acme.sh 提供了多种安装方式,支持 curl
和 wget
等工具,个人偏好通过 Git 来直接 Clone 项目。
1 |
|
进入项目目录后,执行以下命令进行安装。在安装时只需填写你的电子邮箱地址。
1 |
|
安装完成后,需要通过以下命令加载环境变量。
1 |
|
部署证书
获取 DNS API 密钥
acme.sh 支持超过 100 个 DNS 供应商的 API 接入方式。由于我的域名是通过 Cloudflare 管理的,因此这里以 Cloudflare 为例进行演示。其他供应商(如 DNSPod、Aliyun 等)也可以参考 DNS API 文档 进行配置。
在 Cloudflare 个人资料中,你可以找到 API 令牌页面,点击【Global API Key】的查看按钮来获取密钥。
获取到全局 API Key 后,你需要在终端设置以下环境变量,其中 CF_Key
为全局 API 密钥,CF_Email
为你在 Cloudflare 注册的邮箱地址。
1 |
|
创建证书
接下来,执行以下命令来创建证书。需要将 CERT_DOMAIN
替换成你自己的域名,将 CERT_DNS
设置为 DNS 供应商(如果是 Cloudflare,直接使用 dns_cf
即可)。
1 |
|
成功运行后,终端将显示证书生成相关信息。
部署证书
为了便捷地在群晖 NAS 上部署证书,acme.sh 提供了一个简单的部署脚本。SYNO_USE_TEMP_ADMIN=1
表示通过临时用户进行部署,这样无需提供管理员凭据,脚本会自动处理身份验证。需要注意的是,这种方式仅适用于本地部署,Docker 或远程部署无法使用此方法。
1 |
|
如果你的群晖 Web UI 的端口不是默认的 5000
,需要修改以下环境变量。
1 |
|
运行命令后,稍等片刻即可完成部署。
安装完成后,登录群晖系统页面,你会发现证书已经成功部署。
定时更新
为了确保证书在到期前能够自动更新,你可以设置定时任务来定期执行证书更新。操作步骤如下:
打开群晖控制面板,点击【新增】 -> 【计划任务】 -> 【用户定义脚本】。
常规
- 任务名称:
Update default Cert
- 用户:
root
计划
Let’s Encrypt 的证书有效期为三个月,你可以设置任务每三个月或每个月重复一次。
任务设置
在“运行命令”字段中输入以下脚本来触发自动更新:
1 |
|
你可以选择勾选“通过电子邮件发送运行详情”,以便任务完成后接收更新通知。
配置完成后,点击确认并输入密码即可。
结语
通过使用 acme.sh,我成功实现了群晖 NAS 上证书的自动部署和更新。得益于 acme.sh 的内置支持,整个过程比我想象的要简单得多。如果你也在使用群晖 NAS,并且需要定期更新 Let’s Encrypt 证书,不妨试试这个方案,既能节省时间,又能确保网站的安全。