大家好,今天我要分享一次在物理服务器上折腾OpenClaw的经历,重点是如何解决那个烦人的“device identity required”错误。如果你也在自己的物理机上部署类似工具,希望这篇文章能帮你少走弯路。
- 背景:为什么选择OpenClaw?
OpenClaw是一个强大的网关工具,可以用来管理AI代理、执行任务、远程控制等。我把它部署在自己的物理服务器(一台家里运行的Linux主机)上,打算通过浏览器随时随地访问它的控制面板。服务器是Linux系统,通过Docker运行OpenClaw,端口映射为 60004(公网)→ 18789(容器内)。没有云厂商的一键部署,所有网络配置、端口转发都得自己动手。 - 问题现象:浏览器拒绝服务
部署完成后,我兴冲冲地在浏览器输入 http://我的域名:60004,结果页面加载了一部分,却弹出一个红色警告:
device identity required
此页面为 HTTP,因此浏览器阻止设备标识。请使用 HTTPS (Tailscale Serve) 或在网关主机上打开 http://127.0.0.1:18789。
如果您必须保持 HTTP,请设置 gateway.controlUi.allowInsecureAuth: true (仅限令牌)。
页面中间显示“已断开与网关的连接”,左侧菜单可以点开,但无法真正使用。
- 原因分析:浏览器安全策略与Tailscale的“冲突”
为什么会有这个错误?因为OpenClaw为了安全,使用了Web Crypto API进行设备身份验证,这要求页面必须在安全上下文中运行。安全上下文只有两种:
HTTPS 页面(https://)
本地地址(http://127.0.0.1 或 http://localhost)
而我通过公网域名和HTTP访问,自然被浏览器拦下。更关键的是,我的物理服务器上安装了Tailscale(为了方便内网穿透),它在后台尝试注入身份获取脚本,而HTTP页面阻止了脚本执行,所以报错。
- 探索解决方案:从修改配置到SSH隧道
4.1 尝试修改OpenClaw配置
错误提示中建议设置 gateway.controlUi.allowInsecureAuth: true。于是我进入物理服务器,找到OpenClaw的配置文件(通常位于 ~/.openclaw/openclaw.json 或容器内的 /home/node/.openclaw/openclaw.json)。
原文件内容大致如下:
json
{
"gateway": {
"auth": {
"mode": "token",
"token": "一串长长的token"
},
"controlUi": {
"allowInsecureAuth": false,
...
}}
}
将 allowInsecureAuth 改为 true,保存后重启容器。
满怀期待地刷新页面……错误依旧!这是因为 allowInsecureAuth 只是允许服务端接受HTTP令牌认证,但无法改变浏览器对页面上下文的判定。这个配置只解决了服务端的问题,没解决浏览器的问题。
4.2 使用Tailscale Serve(HTTPS方案)
既然浏览器要求HTTPS,而Tailscale可以自动提供证书,那用 tailscale serve 应该最完美。在物理服务器上执行:
bash
tailscale serve 18789
然后通过 https://你的设备名.你的网络名.ts.net 访问。确实,HTTPS页面加载正常,设备身份验证通过。但问题是,我需要分享给其他人,或者用自定义域名访问,这个方案就不太方便了,而且Tailscale在物理机上也需要额外配置。
4.3 SSH隧道:最简单的“曲线救国”
我不想为了一个面板专门配HTTPS(物理机上配HTTPS还要折腾证书和反向代理),于是想到了SSH隧道。原理是:将远程物理服务器的端口通过SSH加密隧道映射到本地,然后用 http://127.0.0.1 访问,这样浏览器就认为是在访问本地安全上下文。
我的Windows电脑上需要安装OpenSSH客户端(Win10/11一般自带,如果没有可以通过“设置”→“应用”→“可选功能”安装)。然后在PowerShell中执行:
powershell
ssh -L 18789:127.0.0.1:60004 用户名@你的物理服务器IP -p 22
输入密码后,保持窗口打开。现在在浏览器中访问 http://127.0.0.1:18789,页面终于完全加载,不再报错!
4.4 输入Token完成登录
页面虽然加载了,但显示“离线”并提示“device identity required”,这是因为OpenClaw需要令牌认证。我的配置文件中已经有一个token,需要在页面上输入。
输入正确的token后,状态变为“在线”,左侧菜单功能都可以使用了。
- 进阶:如何让token更安全?
我配置里的token是在对话中无意暴露的,为了安全,我重新生成了一个:
bash
openssl rand -hex 20
然后用新token替换配置文件中的旧值,重启容器。以后登录都要用新token。
- 总结与展望
对于我这种物理机用户,没有云厂商的一键部署,SSH隧道成了最快捷的临时方案。而长期我会考虑用Nginx配置HTTPS,或者体验腾讯的QClaw——据说可以直接通过微信控制,那才是真正的“远控自由”。
希望这篇文章能帮到同样在物理机上折腾的朋友。如果你在部署中也遇到了奇怪的问题,不妨从“安全上下文”这个角度想想,或许能豁然开朗。
谢谢博主,学到了很多🙏🙏🙏