办公室内网的 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