本指南介绍了如何使用外部主机和EAB(外部账户绑定)在TrueNAS上安装ACME SSL证书。它与TrueNAS CORE和TrueNAS SCALE兼容。

TrueNAS具有原生ACME支持,但只能通过其内置的DNS-01集成支持Let’s Encrypt。如果您想在ACME + EAB中使用商业ACME提供商(Sectigo、DigiCert等),您必须使用acme.sh等ACME客户端在外部生成和更新证书,然后将其部署到TrueNAS中。
开始之前
以下是您需要的物品:
- 指向您的 TrueNAS 公共 IP 的域名(例如,nas.example.com)
- TrueNAS CORE 13.x 或 TrueNAS SCALE 23.x+
- 外部 Linux/BSD 机器、VPS 或家庭服务器(用于运行 acme.sh)
- 来自商业 CA 的 ACME 目录 URL、EAB 密钥 ID 和 EAB HMAC
- 如果您计划自动同步,可通过 SSH 访问 TrueNAS
注释: TrueNAS的用户界面不支持任意的ACME提供商。所有商业ACME自动化都必须在TrueNAS之外进行。
步骤 1:在外部主机上安装 acme.sh
这台机器将处理 ACME 账户的注册、发放和续费。
运行:
curl https://get.acme.sh | sh
source ~/.bashrc
acme.sh --version
如果版本打印正确,就没问题了。
步骤 2:在商业 CA(ACME + EAB)上注册 ACME 帐户
您的 CA 仪表板将提供
- EAB Key ID
- EAB HMAC 密钥
- ACME 目录 URL
注册您的 ACME 账户:
acme.sh --register-account \
--server https://acme.yourca.com/v2/acme \
--eab-kid YOUR_EAB_KID \
--eab-hmac-key YOUR_EAB_HMAC_KEY \
--accountemail [email protected]
用你自己的值代替。只运行一次。
步骤 3:颁发证书(需要 DNS-01 验证)
TrueNAS 几乎总是在 NAT 后面,因此 DNS 验证是最安全的。
下面是一个 Manaul DNS 的例子:
acme.sh --issue \
-d nas.example.com \
--dns dns_manual \
--server https://acme.yourca.com/v2/acme
acme.sh 会告诉您创建 TXT 记录:
_acme-challenge.nas.example.com TXT <token>
在 DNS 管理器中创建 TXT 记录,等待传播。
检查传播:
dig TXT _acme-challenge.nas.example.com +short
令牌出现后,重新运行同一命令,acme.sh 将完成证书签发。文件将保存在 ~/.acme.sh/nas.example.com/。
里面有
- fullchain.cer:服务器证书 + 中间证书
- nas.example.com.key:私人密钥
- ca.cer: CA 链(如果单独提供)
第 4 步:将证书导入 TrueNAS
- 转到TrueNAS UI > 系统 > 证书
- 单击添加并选择导入证书
- 上传证书文件并点击保存
将证书分配给您的服务:
- 网络用户界面
- SMB / NFS 服务(如适用)
- 中间件应用程序接口
- 使用 HTTPS 的反向代理或应用程序(TrueNAS SCALE)
步骤 5:自动续订和部署
TrueNAS不会自动拔出证书。您必须将更新的证书推送到TrueNAS。
1.创建部署脚本
在外部 ACME 主机上创建/usr/local/bin/truenas-deploy.sh:
注意:该脚本只有在TrueNAS允许SSH访问且用户被允许运行midclt 时才起作用。它通过 TrueNAS API 将新密钥+证书上传到/tmp/ ,并替换当前证书。确保您的路径和域与您的 acme.sh 设置相匹配。
#!/bin/bash
DOMAIN="nas.example.com"
NAS_USER="root"
NAS_HOST="truenas.local"
CERT_PATH="$HOME/.acme.sh/$DOMAIN"
KEY="$CERT_PATH/$DOMAIN.key"
CERT="$CERT_PATH/fullchain.cer"
scp "$KEY" "$NAS_USER@$NAS_HOST:/tmp/key.key"
scp "$CERT" "$NAS_USER@$NAS_HOST:/tmp/cert.cer"
ssh "$NAS_USER@$NAS_HOST" <<EOF
midclt call certificate.update '{"certificate": "custom", "csr": null, "privatekey": "$(cat /tmp/key.key)", "certificate": "$(cat /tmp/cert.cer)"}'
EOF
使其可执行:
chmod +x /usr/local/bin/truenas-deploy.sh
2.添加续订挂钩
在 acme.sh 中添加部署钩子:
acme.sh --deploy-hook truenas-deploy \
-d nas.example.com
或在~/.acme.sh/deploy/truenas-deploy.sh 中添加此内容。
3.让 acme.sh 处理一切
下面是 acme.sh 自动执行的操作:
- 每天检查续订情况
- 更新证书
- 触发部署脚本
- 将更新的证书推送至 TrueNAS
- 无声地应用更改
一旦配置完成,您就不必再接触 TrueNAS 进行证书更新。
常见问题
如果您是第一次在 TrueNAS 上设置 ACME 自动化,这些快速解答涵盖了用户最常遇到的问题。
我可以为 TrueNAS GUI 和其他服务(SMB、NFS、iSCSI 门户)使用一个证书吗?
可以。在系统 > 证书中导入证书后,就可以为网络用户界面和任何使用 HTTPS 的服务(网络用户界面、应用程序接口、反向代理/HAProxy(如果使用))选择相同的证书。除非你想使用不同的主机名,否则不需要为每项服务分别选择不同的证书。
我的 NAS 位于 CGNAT 或双重 NAT 后面。我还能使用 ACME 吗?
可以,但必须使用 DNS-01 验证。HTTP-01 不起作用,因为 ACME 服务器无法通过 80 端口连接 NAS。使用 DNS-01,CA 只检查您在_acme-challenge.yourdomain.com 上的 TXT 记录,因此它并不关心 NAS 的实际位置。
如果 acme.sh 更新了证书,但我忘记将其重新导入 TrueNAS,会发生什么情况?
TrueNAS 将继续使用您上次导入的旧证书。更新后的文件将保存在外部主机上,直到您再次上传(或由脚本/API 处理)。
你的网站仍能正常运行,但最终浏览器会发出证书过期的警告。这就是为什么值得在重新导入时编写脚本或在临近到期日时设置提醒。
我能否在 TrueNAS 中使用通配符证书(如 *.example.com)?
是的。只要私钥和证书相匹配,TrueNAS 并不关心它是通配符还是单主机证书。您仍然需要在acme.sh中通过DNS-01签发通配符,然后将fullchain.cer+*.example.com.key导入TrueNAS。请注意不要在任何地方重复使用该密钥。通配符证书可完全控制其涵盖的所有子域。
最后的话
该工作流程为您在TrueNAS上安装ACME证书提供了一种稳定、可靠的方式,而无需与系统对抗。您的外部主机负责证书的签发、更新和管理,而TrueNAS只需在文件更新时接收干净的导入。
一旦程序就绪,一切都会在后台悄无声息地运行,只有当你想调整脚本或旋转证书时才会介入。

