1. 先搞清楚 1008 到底在拦什么
openclaw 控制台弹出disconnected (1008): control ui requires HTTPS or localhost (secure context),很多人第一反应是网关挂了或者端口没开。其实这条报错跟网络连通性关系不大,它拦的是浏览器的secure context判定。简单说,浏览器认为你当前访问页面的来源不够安全,于是拒绝让页面里的 WebSocket 或部分 API 正常工作,openclaw 的控制 UI 检测到这个情况后主动断开,并抛出 1008 这个关闭码。
那什么算 secure context?浏览器有一套明确规则:协议是https://的算;来源是http://localhost、http://127.0.0.1、http://[::1]的也算;通过file://打开的本地文件在部分浏览器里算。除此之外,你用http://192.168.1.50:19000这种局域网 IP 访问,哪怕服务本身跑得好好的,浏览器也会判定为非安全上下文,控制 UI 就直接罢工。
这就解释了一个很常见的现象:你在本机用http://localhost:19000打开一切正常,换到另一台电脑用http://192.168.1.50:19000打开就报 1008。服务没变,变的是浏览器对来源的安全判定。openclaw 的控制 UI 依赖 WebSocket 长连接来推送状态,而现代浏览器对非安全上下文里的部分能力做了限制,openclaw 干脆在检测到非安全上下文时主动断开,避免出现更难排查的半死状态。
所以排查顺序应该是:先确认你当前访问的 URL 是什么协议加什么主机名,再判断它是否落在 secure context 白名单里,最后才去看网关绑定模式和端口。很多人一上来就改--bind lan,结果局域网能连上了但浏览器照样报 1008,因为问题根本不在绑定,而在访问入口的协议。
我试过在同一个局域网里用两台机器对比:A 机用http://localhost:19000访问,控制台正常;B 机用http://192.168.1.50:19000访问,立刻 1008。把 B 机的访问地址换成通过反向代理暴露的https://claw.example.com,问题消失。这个对比基本能锁定病根。
下面这张表可以帮你快速判断自己属于哪种情况:
| 访问地址 | 是否 secure context | 控制 UI 表现 |
|---|---|---|
http://localhost:19000 | 是 | 正常 |
http://127.0.0.1:19000 | 是 | 正常 |
http://192.168.x.x:19000 | 否 | 报 1008 |
http://公网IP:19000 | 否 | 报 1008 |
https://任意域名 | 是 | 正常 |
http://任意域名 | 否 | 报 1008 |
理解这张表,后面所有配置都是围绕「让访问入口变成 secure context」来做的。要么把访问入口收敛到 localhost,要么给它套一层 HTTPS。没有第三条路。
2. TaoToken 前置:把模型侧先跑通
在折腾 openclaw 控制 UI 的 HTTPS 之前,建议先把模型调用这条链路跑通,否则你修好了控制台,点进去发现模型请求也报错,排查会互相干扰。openclaw 这类终端 AI 助手最终要调用大模型 API,TaoToken 提供的就是这层兼容接口,Base URL 指向https://taotoken.net/api,用标准的 OpenAI 兼容协议,openclaw 里配置模型时直接填这个地址即可。
你需要先在 TaoToken 控制台创建一个 API Key。打开https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite,登录后新建一个 Key,复制出来。这个 Key 就是 openclaw 调用模型时的凭证,格式通常以sk-开头。注意 Key 只在创建时完整显示一次,丢了就重新建一个。
拿到 Key 之后,在 openclaw 的配置里填三件套:Base URL、API Key、Model ID。Base URL 填https://taotoken.net/api,注意不要带多余的路径后缀;API Key 填你刚复制的那串;Model ID 填你要用的模型名,比如claude-sonnet-4-20250514这类。这三者缺一不可,少填一个就会在模型请求阶段报 401 或 model not found。
如果你用的是 Claude Code 这类工具,配置方式类似,在 settings 里指定ANTHROPIC_BASE_URL为https://taotoken.net/api,再配上对应的 Key。openclaw 本身对 OpenAI 兼容协议支持较好,所以优先用 OpenAI 格式的 Base URL 接入。
这里有个容易踩的坑:有人把 Base URL 填成https://taotoken.net/api/v1,结果请求 404。TaoToken 的兼容层入口就是https://taotoken.net/api,具体版本路径由客户端自己拼接,你手动加/v1反而会错位。填之前先确认客户端默认会拼什么路径。
模型侧跑通的标志很简单:在 openclaw 里发一条测试消息,能正常返回内容,说明 Base URL、Key、Model ID 三件套都对。这时候再去处理控制 UI 的 1008,就不会被模型报错干扰判断。如果你还没决定用哪个模型,可以打开https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite看看当前可用的模型列表,挑一个响应速度合适的。
需要说明的是,TaoToken 在这里的角色是模型 API 的接入层,它不负责 openclaw 控制 UI 的 HTTPS 问题。控制 UI 的 secure context 是浏览器和 openclaw 网关之间的事,跟模型 API 是两条独立的链路。把这两件事分开看,排查思路会清晰很多。
3. 可复制配置:本地访问与反向代理 HTTPS
解决 1008 有两条路线,选哪条取决于你的使用场景。如果只是本机自己用,走 localhost 路线最省事;如果需要局域网或远程访问,就必须上 HTTPS 反向代理。
3.1 本机访问:收敛到 localhost
openclaw 网关默认绑定模式是loopback,也就是只监听本机回环地址,这是最安全的默认值。你可以用下面的命令显式指定:
openclaw gateway --bind loopback --port 19000启动后用http://localhost:19000或http://127.0.0.1:19000访问,这两个地址天然是 secure context,控制 UI 不会报 1008。如果你之前为了局域网访问改成了--bind lan,现在改回loopback就能恢复。
配置文件在 Windows 下位于C:\Users\用户名\.openclaw\openclaw.json,macOS 和 Linux 在~/.openclaw/openclaw.json。控制 UI 相关的配置片段如下:
{ "controlUi": { "enabled": true, "allowInsecureAuth": true }, "gateway": { "bind": "loopback", "port": 19000 } }allowInsecureAuth这个字段的作用是允许在非 HTTPS 环境下进行认证,但它并不能绕过 secure context 判定。也就是说,即使你开了allowInsecureAuth,用http://192.168.x.x访问照样会报 1008,因为浏览器层面就不认这个来源。这个字段主要影响的是认证流程的宽松度,不是安全上下文的开关。很多人误以为加上它就能解决 1008,结果白折腾。
3.2 局域网或远程访问:反向代理上 HTTPS
如果你确实需要从别的机器访问,正确做法是在 openclaw 前面放一个反向代理,由代理负责 TLS 终止,openclaw 本身仍然监听 loopback。这样浏览器访问的是https://地址,secure context 成立,1008 消失。
以 Nginx 为例,配置片段如下:
server { listen 443 ssl; server_name claw.example.com; ssl_certificate /etc/nginx/certs/claw.crt; ssl_certificate_key /etc/nginx/certs/claw.key; location / { proxy_pass http://127.0.0.1:19000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }这里有几个关键点。proxy_http_version 1.1和Upgrade/Connection两个 header 是 WebSocket 透传必须的,少了它们控制 UI 的长连接会握手失败,表现可能是连上了但状态不刷新,或者直接又断。X-Forwarded-Proto告诉后端原始请求是 HTTPS,某些框架会据此判断 secure context。证书可以用 Let's Encrypt 签发的正式证书,内网环境也可以用自签证书,但自签证书浏览器会警告,需要手动信任,否则 WebSocket 可能被拦。
如果你用 Caddy,配置更简单:
claw.example.com { reverse_proxy 127.0.0.1:19000 }Caddy 会自动申请证书并处理 WebSocket 升级,适合不想手写一堆 header 的场景。
配置完成后,openclaw 网关仍然用--bind loopback启动,不要改成lan。因为外部流量是通过 Nginx 转发进来的,openclaw 只需要接受来自本机代理的连接即可。这样既满足了 secure context,又没有把网关直接暴露到局域网。
3.3 关于 Tailscale 的说明
openclaw 支持--bind tailnet和--tailscale serve这类模式,通过 Tailscale 网络暴露服务。Tailscale 的 MagicDNS 域名通常带 HTTPS 能力,访问时是 secure context,所以也能解决 1008。但这类方案依赖额外的网络组件,配置门槛比本机 localhost 高。如果你只是想本机用,没必要引入。如果你已经在用 Tailscale 组网,那--tailscale serve是个顺手的选项,它会把服务挂到一个带证书的域名下。
不管走哪条路线,核心原则不变:让浏览器最终访问的 URL 是https://或http://localhost。抓住这一条,1008 就不会再出现。
4. 验证请求:用浏览器控制台和日志确认恢复
配置改完不代表问题就解决了,得实际验证。验证分两层:浏览器侧看 secure context 是否成立,openclaw 侧看 WebSocket 是否握手成功。
4.1 浏览器控制台验证 secure context
打开控制台页面,按 F12 调出开发者工具,切到 Console 面板,输入:
window.isSecureContext如果返回true,说明当前页面处于安全上下文,1008 的根因已经消除。如果返回false,说明你访问的地址仍然不满足条件,回去检查 URL 是不是还在用http://加非 localhost 主机名。
再切到 Network 面板,筛选WS类型,刷新页面,找到那条 WebSocket 连接。看它的状态码,正常应该是101 Switching Protocols。如果看到1008或者连接直接 failed,说明握手阶段就被拒了。点开这条请求看 Headers,确认Origin头是什么,openclaw 会校验 Origin 是否在允许列表里。如果你用了反向代理,Origin 应该是https://claw.example.com,而不是内网 IP。
还可以在 Console 里手动建一个 WebSocket 测试:
const ws = new WebSocket('wss://claw.example.com/ws'); ws.onopen = () => console.log('connected'); ws.onclose = (e) => console.log('closed', e.code, e.reason);如果onopen触发,说明 WebSocket 链路通了。如果onclose里 code 是 1008,reason 里会带具体原因,对照着排查。
4.2 openclaw 日志验证
openclaw 网关启动时会在终端输出日志。正常启动后,当你从浏览器连上控制 UI,日志里会出现类似control ui connected或 WebSocket 升级成功的记录。如果连接被拒,日志里会有rejected connection或origin not allowed之类的提示。
启动命令加上详细日志:
openclaw gateway --bind loopback --port 19000 --log-level debug--log-level debug会打印握手细节,包括收到的 Origin、协议协商结果。如果你看到日志里 Origin 是http://192.168.1.50:19000,那就说明浏览器还在用旧地址访问,secure context 没生效,需要清一下浏览器缓存或者确认你打开的 URL 确实换了。
一个完整的成功链路应该是这样的:浏览器访问https://claw.example.com,Nginx 收到请求转发到127.0.0.1:19000,openclaw 日志显示收到来自 127.0.0.1 的连接,Origin 为https://claw.example.com,WebSocket 升级成功,控制 UI 状态变为 connected。浏览器 Console 里window.isSecureContext为 true,Network 里 WS 请求状态 101。
如果中间任何一环对不上,就停在那一步排查。比如 Nginx 转发了但 openclaw 没收到,检查proxy_pass地址和端口;openclaw 收到了但 Origin 校验失败,检查代理有没有正确传递Host和X-Forwarded-*头。
4.3 模型请求的验证
控制 UI 连上之后,顺手验证一下模型链路。在 openclaw 里发一条消息,观察是否正常返回。如果报 401,检查 TaoToken 的 API Key 是否填对;如果报 model not found,检查 Model ID 拼写;如果超时,检查 Base URL 是否可达。这一步能确认你的三件套配置无误,避免控制台修好了但模型用不了。
5. 本篇常见错排查
实际排查中,报错信息往往不止 1008 一条,下面按真实遇到的报错逐个对照。
报错一:disconnected (1008): control ui requires HTTPS or localhost (secure context)
这是本篇主问题。根因是访问地址不是 secure context。排查顺序:先看浏览器地址栏协议和主机名,http://加非 localhost 就是它。解决要么改用http://localhost:端口,要么上 HTTPS 反向代理。注意allowInsecureAuth: true不能解决这个,别在这上面浪费时间。
报错二:401 Unauthorized
这个通常出现在模型请求阶段,不是控制 UI。说明 TaoToken 的 API Key 没填、填错或者过期。检查 openclaw 配置里的 Key 字段,确认以sk-开头且没有多余空格。如果 Key 是对的还报 401,检查 Base URL 是不是写成了https://taotoken.net/api/v1这种带多余路径的形式,改成https://taotoken.net/api。
报错三:local proxy failed或proxy error
如果你在 openclaw 前面挂了反向代理,这个错说明代理转发失败。常见原因是 Nginx 的proxy_pass指向了错误的端口,或者 openclaw 网关根本没启动。先在服务器上curl http://127.0.0.1:19000确认后端活着,再检查 Nginx 配置里的端口。另外 WebSocket 升级失败也会表现为 proxy error,检查Upgrade和Connection两个 header 有没有配。
报错四:Error reading choices或invalid response
这是模型返回格式解析失败,通常发生在 Base URL 指向了不兼容的端点。确认你用的是 OpenAI 兼容协议,Base URL 为https://taotoken.net/api。如果客户端默认按 Anthropic 格式解析,而端点返回的是 OpenAI 格式,就会报这个。检查客户端的协议设置,必要时切换成 OpenAI 兼容模式。
报错五:OAuth相关错误
如果你用的是 Claude Code 这类带 OAuth 流程的工具,可能会遇到 OAuth 回调失败。这类工具通常需要配置ANTHROPIC_BASE_URL指向https://taotoken.net/api,并配合 API Key 使用。如果它坚持走 OAuth 而你的接入层不支持,就会卡在授权环节。解决办法是改用 API Key 认证模式,在 settings 里显式指定 Key,跳过 OAuth。
报错六:控制 UI 连上了但状态不刷新
WebSocket 握手成功但数据不更新,多半是反向代理没透传 WebSocket 帧。检查 Nginx 的proxy_http_version 1.1和Upgradeheader。Caddy 默认处理,一般不会出这个问题。另外确认没有中间层做缓冲,某些 CDN 会缓冲 WebSocket 导致延迟。
报错七:origin not allowed
openclaw 校验 WebSocket 的 Origin 头,如果代理没有正确传递Host,Origin 可能变成127.0.0.1:19000,不在允许列表里。在 Nginx 里加上proxy_set_header Host $host;和proxy_set_header X-Forwarded-Proto $scheme;,让后端看到原始域名和协议。
排查时建议按「浏览器地址 → 代理转发 → openclaw 日志 → 模型请求」这个顺序逐层确认,每层都有明确的成功标志,不要跳步。跳步容易把两个独立问题混在一起,越查越乱。
6. 把链路固定下来
控制 UI 的 1008 本质是浏览器安全策略和访问入口不匹配,跟 openclaw 本身健不健壮没关系。把访问入口固定成http://localhost:端口或https://域名,问题就不会反复出现。本机自用就老老实实--bind loopback,别为了图方便改成lan,改完迟早撞上 1008。需要远程访问就认真配一次反向代理,把 WebSocket 透传的 header 写全,一次配好长期省心。
模型侧的三件套也建议固定下来:Base URL 用https://taotoken.net/api,Key 存在配置里别硬编码到脚本,Model ID 选一个稳定的。这样控制台和模型两条链路都稳,日常用起来就不会今天修这个明天修那个。如果后面要长期跑编码任务或者 Agent 流程,可以考虑用 Coding Plan 这类方案把调用额度固定下来,避免临时 Key 过期打断工作流。