
1. 内网 openclaw 网关为什么总被 HTTPS 卡住SSH 隧道加密转发实战openclaw 是一个可以本地部署的 AI 网关/工作台跑起来之后会监听一个端口默认常见是 18789对外提供 WebUI 和 API。它适合谁适合那些想把模型调用、插件、MCP 服务都收拢在自己机器上又不想把数据丢到别人服务器里的人。问题也随之而来一旦你想从另一台电脑、另一台虚拟机、或者边缘节点访问它就会撞上 HTTPS 这道墙。我自己的场景是这样的openclaw 跑在一台内网 Ubuntu 上没有公网 IP也没有域名更不可能去申请一张受信任的 HTTPS 证书。宿主是 Windows浏览器直接访问http://内网IP:18789时页面会提示需要 HTTPS 或者直接拒绝加载。于是我去折腾自签证书改了一堆 JSON 配置前后花了两个小时浏览器依旧不认。这条路对没有证书体系的内网环境来说性价比极低。真正稳的做法是换一个思路不去解决 HTTPS而是用 SSH 把远程端口加密转发到本地。SSH 本身就是一条加密通道本地浏览器访问http://localhost:18789流量经 SSH 隧道到达远程 openclaw 网关全程加密且不需要任何证书。这就是标题里说的「免 HTTPS 实践」——不是绕过安全而是用 SSH 的加密能力替代 HTTPS 的加密能力。这里要区分两个概念。HTTPS 解决的是「传输加密 身份认证」SSH 隧道解决的是「传输加密 主机认证」。在内网或边缘节点这种你本来就信任目标主机的场景里SSH 隧道完全够用而且部署成本几乎为零。你不需要买证书、不需要配反向代理、不需要开放额外的公网端口。再叠加一层 TaoToken 的统一 Key 通道整个链路就完整了本地浏览器 → SSH 隧道 → 远程 openclaw 网关 → TaoToken API 通道完成鉴权与模型调用。openclaw 网关侧只需要配置好 Base URL 和 Key剩下的加密转发交给 SSH。这样既满足了「不暴露 HTTPS 端口」的要求又能稳定接入。下面我会把整条链路拆开先讲 TaoToken 侧要准备什么再给可复制的 SSH 转发命令和 openclaw 网关配置片段然后用 curl 验证隧道连通性和 401/429 响应最后把常见报错逐个排掉。你可以直接照着做。2. TaoToken 前置准备统一 Key 通道与 openclaw 网关的 Base URL 配置在打通 SSH 隧道之前先把 TaoToken 这一侧准备好。TaoToken 在这里扮演的是「统一 Key / API 通道」的角色openclaw 网关不需要自己管理一堆模型厂商的 Key只要指向 TaoToken 的 API 地址用一把 Key 就能调用后端模型。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 这个地址不加 UTM 参数配置里直接用。第一步是拿到 API Key。进入控制台的 API Keys 页面创建一把新 Key建议按用途命名比如openclaw-gateway方便以后区分。创建后立刻复制保存页面刷新后就看不到完整 Key 了。这一步对应的是「拿 Key 章」我不展开太多重点在后面 openclaw 网关怎么用它。第二步是确认 openclaw 网关侧的配置位置。openclaw 的网关配置通常是一个 JSON 或 TOML 文件里面会有模型提供方的 Base URL 和 API Key 字段。你要做的是把 Base URL 指向 TaoToken 的 API 地址把 Key 填成刚创建的那把。下面给一个通用的配置片段字段名以你实际版本的 openclaw 为准路径和原文保持一致{ gateway: { host: 127.0.0.1, port: 18789 }, providers: { taotoken: { baseUrl: https://taotoken.net/api, apiKey: sk-你的TaoTokenKey, model: claude-sonnet-4-5 } } }注意host这里我写的是127.0.0.1不是0.0.0.0。这是关键网关只监听本地回环地址不对外暴露安全性最高。外部访问全部通过 SSH 隧道进来。如果你之前为了图省事把它设成0.0.0.0建议改回来否则等于把网关直接摊在内网上。如果你用的是 TOML 格式等价写法是这样[gateway] host 127.0.0.1 port 18789 [providers.taotoken] baseUrl https://taotoken.net/api apiKey sk-你的TaoTokenKey model claude-sonnet-4-5Model ID 这一项要写清楚不同模型对应的 ID 不一样填错了会返回模型不存在的错误。Base URL、Key、Model ID 这三件套是后面所有验证的基础缺一不可。配置改完后重启 openclaw 网关让它重新加载。这里有个容易忽略的点openclaw 网关自己发起的模型请求走的是它所在机器的网络而不是你本地浏览器的网络。所以只要那台机器能访问 TaoToken 的 API 地址隧道这头就不需要额外配置网络。SSH 隧道只负责把「浏览器到网关」这一段加密网关到 TaoToken 这一段是网关自己直连的。准备阶段做完你应该有一把 TaoToken Key、一个指向https://taotoken.net/api的 Base URL、一个正确的 Model ID以及一个只监听127.0.0.1:18789的 openclaw 网关。接下来就是打通 SSH 隧道。3. 可复制的 SSH 本地端口转发命令与 openclaw 网关鉴权配置这一节是整篇的核心操作。SSH 本地端口转发local port forwarding的语法是ssh -N -L 本地端口:目标主机:目标端口 用户跳板机。放到我们的场景里目标主机就是 openclaw 网关所在的那台机器目标端口是 18789。先看最基础的一条命令ssh -N -L 18789:127.0.0.1:18789 boxsc192.168.233.129拆开解释-N表示不执行远程命令只做端口转发-L是本地转发18789:127.0.0.1:18789表示把本地的 18789 端口转发到远程主机视角下的127.0.0.1:18789boxsc192.168.233.129是远程机器的用户名和地址。执行后输入密码终端会挂起这就是隧道建立成功的状态别关这个窗口。如果你觉得每次输密码麻烦可以配 SSH 密钥登录把公钥放到远程机器的~/.ssh/authorized_keys之后就能免密。生产环境更推荐密钥密码登录容易被暴力破解。隧道建立后本地浏览器访问http://localhost:18789流量就会经 SSH 加密送到远程网关。openclaw 启动时通常会打印一个带 token 的 URL类似http://localhost:18789/#tokenxxxx这个 token 是网关自己的会话鉴权和 TaoToken 的 Key 是两回事别混淆。前者是访问 WebUI 用的后者是网关调用模型用的。如果你想让隧道更稳可以加几个参数ssh -N -L 18789:127.0.0.1:18789 \ -o ServerAliveInterval30 \ -o ServerAliveCountMax3 \ -o ExitOnForwardFailureyes \ boxsc192.168.233.129ServerAliveInterval30每 30 秒发一次心跳防止空闲被断开ExitOnForwardFailureyes表示如果端口转发失败就直接退出避免你以为连上了其实没转发。这几个参数在长时间挂机时很有用。Windows 上如果不想每次开 PowerShell 敲命令可以把这条命令写成一个.bat或.ps1脚本双击就跑。PowerShell 里直接执行上面的 ssh 命令即可Windows 10/11 自带 OpenSSH 客户端。再回到 openclaw 网关侧的鉴权配置。前面给的 JSON 片段里apiKey就是 TaoToken 的 Key。有些版本的 openclaw 会把鉴权信息放在环境变量里比如export TAOTOKEN_API_KEYsk-你的TaoTokenKey export TAOTOKEN_BASE_URLhttps://taotoken.net/api然后在配置里引用这两个变量。这样做的好处是 Key 不写死在配置文件里降低泄露风险。你可以根据自己版本选择写死还是走环境变量。如果你用的是 Claude Code 这类工具配置通常落在settings.json里Base URL 和 Key 的字段名会不同但逻辑一样指向 TaoToken 的 API 地址填上 Key。Cline 的 MCP 配置也是同理在 MCP server 的配置块里指定 Base URL、Key、Model ID 三件套。Codex 的auth.json里同样需要这三项。不管哪个工具只要记住「Base URL Key Model ID」这个组合就不会迷路。配置完成后先别急着开浏览器用 curl 验证隧道和鉴权是否都通了这是下一节的内容。4. 用 curl 验证 SSH 隧道连通与 401/429 响应隧道建好、配置改完最忌讳的就是直接开浏览器点点点出了问题不知道是哪一层。正确做法是用 curl 分层验证。curl 能明确告诉你状态码401 是鉴权问题429 是限流200 才是真的通。第一步验证隧道本身通不通。在本地开一个新终端别关隧道那个窗口执行curl -i http://localhost:18789/如果隧道正常你会看到 openclaw 网关返回的 HTTP 响应头可能是 200 或者 302 跳转。如果返回Connection refused说明隧道没建好或者本地端口被占用。如果卡住不动多半是 SSH 连接断了。第二步验证网关到 TaoToken 的鉴权。这一步要打的是网关的 API 端点具体路径看你的 openclaw 版本常见的是/v1/chat/completions或类似的代理路径。假设网关把模型请求代理在/api/chat下可以这样测curl -i -X POST http://localhost:18789/api/chat \ -H Content-Type: application/json \ -H Authorization: Bearer sk-你的TaoTokenKey \ -d {model:claude-sonnet-4-5,messages:[{role:user,content:ping}]}这里要注意Authorization 头到底填 TaoToken 的 Key 还是网关自己的 token取决于 openclaw 的鉴权设计。如果网关自己校验 Key就填网关的如果网关把请求透传给 TaoToken就填 TaoToken 的。多数情况下网关会用配置里的 Key 去调 TaoToken你本地请求只需要带上网关自己的会话 token。以你实际版本的文档为准。第三步故意制造 401 来确认鉴权生效。把 Key 改成一个错误的字符串curl -i -X POST http://localhost:18789/api/chat \ -H Content-Type: application/json \ -H Authorization: Bearer sk-wrong-key \ -d {model:claude-sonnet-4-5,messages:[{role:user,content:ping}]}如果返回 401 Unauthorized说明鉴权链路是通的错误 Key 被正确拒绝。这一步很重要它能证明你的请求确实经过了鉴权层而不是被某个默认放行的中间件吞掉了。第四步观察 429。429 是限流响应通常出现在短时间内高频请求时。你可以用循环快速打几次for i in $(seq 1 20); do curl -s -o /dev/null -w %{http_code}\n \ -X POST http://localhost:18789/api/chat \ -H Content-Type: application/json \ -H Authorization: Bearer sk-你的TaoTokenKey \ -d {model:claude-sonnet-4-5,messages:[{role:user,content:ping}]} done如果看到 429 混在 200 里说明限流策略在工作。这时候不要慌429 不是错误是保护机制等一会儿再试即可。真正要排查的是持续 401 或者 500。第五步确认成功结果。当 curl 返回 200 且 body 里有正常的模型回复内容时整条链路就通了本地 curl → SSH 隧道 → openclaw 网关 → TaoToken API → 模型。这时候再打开浏览器访问http://localhost:18789/#tokenxxxWebUI 应该能正常对话。把这几步的返回码记下来后面排错时对照着看能省很多时间。5. 常见报错排查401、local proxy failed、reading choices、OAuth 逐条对照排错的核心是「分层定位」。整条链路有四层本地 curl/浏览器、SSH 隧道、openclaw 网关、TaoToken API。每一层都有典型报错对号入座就行。401 Unauthorized。这是最常见的。可能原因有三个Key 填错、Key 过期、Key 没被正确传递。先检查配置文件里的apiKey是不是完整复制有没有多余空格。然后确认请求头里的 Authorization 格式对不对Bearer后面要有一个空格。如果网关是透传模式确认网关有没有把 Key 带上去。还有一种情况是 Key 权限不足比如只开了某个模型的权限却调用了别的模型也会 401 或 403。local proxy failed。这个报错通常出现在网关尝试连接 TaoToken 的时候。含义是网关本地的出站代理失败。检查两点一是网关所在机器能不能直接访问https://taotoken.net/api用curl -i https://taotoken.net/api测一下二是如果机器上配了 HTTP 代理环境变量确认代理是否可用或者干脆清掉http_proxy/https_proxy再试。SSH 隧道只影响入站不影响网关的出站所以这个错和隧道无关。reading choices 相关报错。这类报错一般出现在解析模型响应时比如error reading choices或choices is empty。原因通常是上游返回的不是预期的 JSON 结构可能是返回了错误页、HTML、或者空 body。先用 curl 直接打 TaoToken 的 API 看原始返回确认返回结构正常。如果返回里带error字段按里面的 message 排查。常见的是 Model ID 写错导致上游返回模型不存在。OAuth 相关报错。如果你用的是 Claude Code 这类走 OAuth 的工具可能会遇到 token 过期或刷新失败。检查settings.json或auth.json里的凭据是否还有效必要时重新走一遍授权流程。注意 OAuth 和 API Key 是两套机制别混用。用 TaoToken 统一 Key 通道时通常走的是 API Key 模式不需要 OAuth。Connection refused / 端口占用。隧道建不起来时先看本地 18789 是不是被别的程序占了netstat -ano | findstr 18789Windows或lsof -i:18789Linux。如果被占换个本地端口比如-L 18790:127.0.0.1:18789浏览器访问localhost:18790。隧道频繁断开。加前面说的ServerAliveInterval参数。如果是网络抖动考虑用autossh自动重连。浏览器提示需要 HTTPS。这说明你访问的是远程 IP 而不是 localhost。确认浏览器地址栏是http://localhost:18789不是http://192.168.x.x:18789。走隧道就必须用 localhost。把这几条对照着查基本能覆盖 90% 的问题。剩下的看日志openclaw 网关和 TaoToken 的返回里通常有更详细的错误信息。6. 稳定接入的收尾把 SSH 隧道和统一 Key 通道固化成日常流程链路跑通之后最后一步是让它变成日常可用的东西而不是每次手动敲一堆命令。我的做法是写一个启动脚本把 SSH 隧道和必要的检查都包进去。Windows 上可以写一个start-tunnel.ps1# 检查本地端口是否已被占用 $port 18789 $inUse Get-NetTCPConnection -LocalPort $port -ErrorAction SilentlyContinue if ($inUse) { Write-Host 端口 $port 已被占用请先关闭占用进程 exit 1 } # 建立 SSH 隧道 ssh -N -L 18789:127.0.0.1:18789 -o ServerAliveInterval30 -o ServerAliveCountMax3 -o ExitOnForwardFailureyes boxsc192.168.233.129Linux/macOS 上对应一个 shell 脚本逻辑一样。这样每次只需要跑一个脚本隧道就起来了。openclaw 网关侧把 Base URL、Key、Model ID 三件套固定下来写进配置文件或环境变量。如果团队多人用建议每人一把 TaoToken Key方便审计和吊销。网关只监听127.0.0.1所有外部访问走 SSH 隧道这样即使内网里有其他机器也无法直接碰到网关端口。关于资源占用如果你像我一样在虚拟机里跑 openclaw可以关掉图形界面省内存。在 Ubuntu 里执行sudo systemctl isolate multi-user.target切到多用户命令行模式需要图形界面时再sudo systemctl isolate graphical.target切回来。这样 8G 内存的机器也能跑得比较舒服。还有一个实用技巧把常用的 curl 验证命令存成一个脚本每次改完配置先跑一遍确认 200 再开浏览器。这比在浏览器里瞎点高效得多。如果你后面要做长期编码或者 Agent 类的任务可以考虑 TaoToken 的 Coding Plan把调用额度固定下来避免临时限流打断工作流。验证模型是否可用时直接用模型对话页面测一下最快。接入过程中遇到鉴权或隧道问题优先查 API Keys 页面和接入文档那里有最新的字段说明。整套方案的核心就一句话用 SSH 的加密能力替代 HTTPS用 TaoToken 的统一 Key 通道替代分散的模型鉴权。内网和边缘节点场景下这套组合部署成本低、安全性够、维护简单。把脚本和配置固化下来之后就是开机、跑脚本、开浏览器三步走。