办公室内网的 OpenClaw Gateway 之前用 Caddy 做了反向代理,但只有自签名证书,浏览器每次弹出安全警告。需要换上合法的 Let’s Encrypt 证书,又不能把 80/443 端口暴露到公网。
方案:Caddy + Aliyun DNS-01 链接到标题
DNS-01 挑战不要求目标服务器开放 80 或 443 端口,只要 DNS API 能写入 _acme_challenge 的 TXT 记录就能完成验证。Caddy 的 alidns 模块直接对接阿里云 DNS API,适合纯内网服务。
步骤 链接到标题
1. DNS 记录 链接到标题
添加 A 记录,指向内网 IP:
aliyun alidns AddDomainRecord \
--DomainName example.com \
--RR openclaw \
--Type A \
--Value 192.168.*.*
DNS 记录只在办公室内网可达,公网无法直接访问。
2. Caddy 安装 alidns 插件 链接到标题
现有 Caddy(apt 安装)不自带 alidns 模块,用 add-package 在线构建包含该模块的二进制:
sudo caddy add-package github.com/caddy-dns/alidns
命令会自动从 caddyserver.com 下载包含该模块的 arm64 二进制替换 /usr/bin/caddy。
3. Caddyfile 链接到标题
openclaw.example.com {
tls {
dns alidns {
access_key_id {env.ALIBABA_CLOUD_ACCESS_KEY_ID}
access_key_secret {env.ALIBABA_CLOUD_ACCESS_KEY_SECRET}
}
}
reverse_proxy localhost:18789
}
密钥通过 {env.xxx} 占位符引用环境变量,不写死在配置文件里。
4. Systemd 环境变量 链接到标题
阿里云 AccessKey 通过 systemd drop-in 注入,避免修改主 unit 文件:
# /etc/systemd/system/caddy.service.d/aliyun-dns.conf
[Service]
Environment=ALIBABA_CLOUD_ACCESS_KEY_ID=***
Environment=ALIBABA_CLOUD_ACCESS_KEY_SECRET=***
5. OpenClaw 允许来源 链接到标题
新域名不在 gateway 的允许来源列表中,需要在 openclaw.json 中添加:
"allowedOrigins": ["https://openclaw.example.com"]
然后重启 gateway 容器:
docker restart <gateway_container>
6. 设备配对 链接到标题
首次从新域名访问时,OpenClaw 会要求设备配对:
docker exec <gateway_container> openclaw devices approve <request_id>
批准后刷新浏览器即可进入 Control UI。
验证 链接到标题
浏览器打开 https://openclaw.example.com/,Let’s Encrypt 证书,TLS 1.3,绿锁正常显示。
要点 链接到标题
- DNS-01 挑战不要求目标端口对外开放,特别适合内网场景
- Caddy 的
{env.xxx}占位符比直接写密钥更安全 - 阿里云 DNS API 密钥需要 AliyunDNSFullAccess 权限
- 多台设备首次访问时需要逐一 approve