☰
OpenClaw 个人专属登录手册:用 SSH 隧道与 Nginx 打通 TaoToken 统一 Key 通道
2026/10/17 11:14:56 网站建设 项目流程

1. 为什么本地 OpenClaw 一暴露到公网就登录失败

OpenClaw 是一个可以跑在个人服务器上的 AI 网关服务,它把模型调用、会话管理和工具链统一在一个本地端口上,适合个人开发者做私有化 AI 工作台。它默认只信任https://或者localhost来源的请求,这个设计本身是为了防止 Token 在明文 HTTP 里裸奔。问题就出在这里:你把它部署在云服务器上,想从自己的笔记本访问,直接敲http://公网IP:18789会被判定为「不安全上下文」,页面要么白屏,要么提示你换地址。

我一开始也踩过这个坑。服务明明在跑,netstat能看到 18789 在监听,但浏览器就是不给面子。后来才想明白,OpenClaw 的鉴权链路里有一个来源校验,它不认公网 IP 的 HTTP 请求。解决思路有两条:一条是用 SSH 隧道把远程端口「搬」到本地,让浏览器以为自己在访问localhost;另一条是用 Nginx 做 HTTPS 反向代理,给公网地址套一层证书。两条路都能走通,区别在于使用场景。

SSH 隧道适合日常快速访问,配置一次,之后每次登录两步搞定,安全性也高,因为端口根本没对公网开放。HTTPS 代理适合长期稳定使用,配好证书和 Nginx 之后,任何设备打开浏览器就能访问,不用每次开隧道。这篇手册会把两条路都走一遍,重点放在 Token 统一管理和鉴权链路的验证上,因为很多人卡的不是「连不上」,而是「连上了但 Token 不认」。

还有一个容易被忽略的点:OpenClaw 的 Token 和 TaoToken 的 API Key 是两套东西。前者是 OpenClaw 网关自己的登录凭证,后者是调用模型时用的统一 Key。很多人把这两个搞混,结果隧道通了、页面开了,一调模型就报 401。所以这篇会先把两套凭证的关系理清楚,再动手配隧道和 Nginx。

适合谁看:在云服务器上跑 OpenClaw、想从本地安全访问的个人开发者;已经配了 Nginx 但 Token 校验总出问题的同学;以及想把模型调用统一到一个 Key 通道、不想在每个工具里重复填 Key 的人。下面从 TaoToken 的前置准备开始,一步步把链路打通。

2. TaoToken 统一 Key 通道的前置准备与凭证关系

在动手配隧道之前,得先把 TaoToken 这边的凭证准备好,否则后面验证请求时会分不清是网络问题还是鉴权问题。TaoToken 的定位是一个统一的模型调用入口,你可以在它的控制台里生成 API Key,然后用同一个 Key 去调不同厂商的模型,省得在每个工具里分别配置。对 OpenClaw 这种网关型服务来说,统一 Key 的好处很明显:网关只需要维护一份凭证,模型切换在服务端完成,客户端不用改配置。

先打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 注册并登录,进入控制台。控制台的入口在 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console。进去之后找到 API Keys 页面,路径是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys。在这里创建一个新的 Key,建议命名带上用途,比如openclaw-gateway,方便以后排查是哪个服务在用。

创建完 Key 之后,你会拿到一串以sk-开头的字符串。这串东西就是 TaoToken 的统一 Key,后面 OpenClaw 调模型时会用到它。注意,这个 Key 和 OpenClaw 自己的 gateway token 不是一回事。gateway token 是 OpenClaw 用来校验「谁可以登录这个网关」的,而 TaoToken 的 Key 是网关用来「向模型服务证明自己有调用权限」的。两者一个管入口,一个管出口,别混。

TaoToken 的 API 基础地址是 https://taotoken.net/api,这个地址在配置 OpenClaw 的模型 provider 时会用到。如果你用的是 OpenAI 兼容的调用方式,Base URL 就填这个,Key 填刚才生成的sk-串。模型 ID 则根据你要用的模型来填,比如claude-sonnet-4-20250514或者gpt-4o这类。这三个要素——Base URL、Key、Model ID——是后面所有配置的核心,缺一个都调不通。

如果你还想在浏览器里先验证一下 Key 是否可用,可以打开模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat,在里面选一个模型发一条消息。能正常返回就说明 Key 没问题,接下来配 OpenClaw 时心里有底。这一步看起来多余,但实测下来能省掉很多「到底是 Key 错了还是网络错了」的纠结。

凭证准备好之后,回到 OpenClaw 这边。你需要确认两件事:一是 OpenClaw 的 gateway token 是什么,二是 OpenClaw 的配置文件在哪。默认路径是~/.openclaw/openclaw.json,gateway token 可以用cat ~/.openclaw/openclaw.json | grep -i token查看,如果忘了或者想换新的,用openclaw doctor --generate-gateway-token重新生成。这个 token 后面会出现在访问 URL 的查询参数里,形如?token=xxx。

把这两套凭证理清楚之后,就可以开始配隧道了。下面先讲 SSH 隧道方案,因为它不需要动 Nginx,也不需要证书,最快能验证链路是否通。

3. 可复制配置:SSH 隧道命令与 Nginx 反代片段

SSH 隧道的原理是把远程服务器的某个端口映射到你本地的某个端口,浏览器访问本地端口时,流量会通过 SSH 加密通道转发到远程。对 OpenClaw 来说,远程的 18789 端口被映射到本地的 18789,浏览器访问http://localhost:18789就等价于访问远程服务,但来源被识别为 localhost,绕过了公网 HTTP 的限制。

在你的电脑上打开终端(Mac/Linux)或者 PowerShell(Windows),执行下面这条命令:

ssh -N -L 18789:127.0.0.1:18789 root@你的ECS公网IP

把你的ECS公网IP替换成实际地址。-N表示不执行远程命令,只做端口转发;-L是本地转发,格式是本地端口:远程地址:远程端口。执行后终端会「卡住」,这是正常的,说明隧道正在运行。保持这个窗口开着,别关。

然后浏览器访问:

http://localhost:18789/?token=你的gateway_token

如果页面正常打开,说明隧道通了。这个方案的好处是远程 18789 根本不需要对公网开放,安全组里也不用放行,攻击面小很多。缺点是每次访问都得先开隧道,适合个人日常使用。

如果你想要长期稳定、任何设备都能访问,那就上 Nginx 反代加 HTTPS。先在服务器上生成自签名证书:

mkdir -p ~/.openclaw/ssl && cd ~/.openclaw/ssl openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout key.pem -out cert.pem -subj "/CN=你的ECS公网IP"

然后编辑~/.openclaw/openclaw.json,在 gateway 部分加上 TLS 配置。下面是一个可复制的 JSON 片段,路径和字段名保持和原文一致:

{ "gateway": { "port": 18789, "bind": "lan", "tls": { "cert": "/root/.openclaw/ssl/cert.pem", "key": "/root/.openclaw/ssl/key.pem" } } }

改完重启服务:

openclaw gateway restart

接下来配 Nginx。在/etc/nginx/conf.d/openclaw.conf里写入下面的片段,注意把你的ECS公网IP和证书路径替换成实际值:

server { listen 443 ssl; server_name 你的ECS公网IP; ssl_certificate /root/.openclaw/ssl/cert.pem; ssl_certificate_key /root/.openclaw/ssl/key.pem; location / { proxy_pass http://127.0.0.1:18789; proxy_http_version 1.1; 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_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }

这里有几个细节值得说。proxy_set_header X-Forwarded-Proto $scheme这行很关键,它告诉 OpenClaw 原始请求是 HTTPS,否则 OpenClaw 可能仍然认为自己在 HTTP 上下文里,导致鉴权失败。Upgrade和Connection两行是为了支持 WebSocket,OpenClaw 的会话流可能用到。配完执行nginx -t检查语法,没问题就nginx -s reload。

如果你用的是 Cline MCP 或者 Codex 这类工具去连 OpenClaw,配置里同样要写全三件套:Base URL 填https://你的ECS公网IP(或者隧道场景下的http://localhost:18789),Key 填 TaoToken 的sk-串,Model ID 填具体模型名。三件套缺一个都会报鉴权错误,后面排障章节会展开。

4. 验证请求:curl 检查返回码与登录链路

配置写完不代表链路通了,得用 curl 实际打一发请求,看返回码和响应体。这一步能帮你区分是网络层的问题还是鉴权层的问题。

先验证隧道方案。保持 SSH 隧道窗口开着,在本地另开一个终端,执行:

curl -i "http://localhost:18789/?token=你的gateway_token"

-i会把响应头一起打出来。如果返回HTTP/1.1 200 OK,说明网关正常响应,Token 也认了。如果返回401 Unauthorized,那就是 gateway token 不对,去服务器上重新生成一个。如果返回502 Bad Gateway,说明隧道通了但后端服务没起来,去服务器上ps aux | grep openclaw确认进程在不在。

再验证 Nginx 方案:

curl -ik "https://你的ECS公网IP:18789/?token=你的gateway_token"

-k是跳过自签名证书校验,因为自签证书浏览器和 curl 默认都不信任。返回 200 就说明 Nginx 反代和 TLS 都正常。如果返回 301 或 302,检查 Nginx 配置里有没有多余的 rewrite 规则。如果返回 400,多半是Host头没传对,检查proxy_set_header Host $host这行。

接下来验证 TaoToken 的模型调用链路。这一步是确认 OpenClaw 能不能用统一 Key 成功调到模型。在服务器上执行:

curl -i https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "ping"}] }'

返回 200 并且 body 里有choices字段,说明 Key 和模型 ID 都对。如果返回 401,检查 Key 有没有复制完整,注意别把前后空格带进去。如果返回 404,多半是模型 ID 写错了,去 TaoToken 的文档页 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc 核对一下可用模型列表。

两个 curl 都通过之后,再回到浏览器访问完整地址,确认页面能正常加载、能发起对话。这时候整条链路就算打通了:浏览器 → SSH 隧道或 Nginx → OpenClaw 网关 → TaoToken 统一 Key → 模型服务。

如果你用的是 Claude Code 这类工具,接入方式类似,Base URL 填 TaoToken 的 API 地址,Key 填sk-串,Model ID 填对应模型。Claude Code 的配置入口在 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude-code,里面有具体的 settings 片段可以参考。长期跑编码任务的话,Coding Plan 页面 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan 有更详细的套餐说明。

5. 常见报错排查:401、local proxy failed 与 choices 缺失

链路打通的过程中,报错基本集中在几个固定位置。下面按真实遇到的报错来对照排查,每个都给出定位方法和修复动作。

401 Unauthorized(OpenClaw 网关层):这个报错说明请求到了 OpenClaw,但 gateway token 没通过校验。先确认 URL 里的?token=参数有没有带,值是不是和~/.openclaw/openclaw.json里的一致。如果忘了 token,在服务器上执行cat ~/.openclaw/openclaw.json | grep -i token查看,或者用openclaw doctor --generate-gateway-token重新生成。注意重新生成后旧 token 立即失效,浏览器里要换成新的。

401 Unauthorized(TaoToken 模型层):这个报错出现在 curl 调/api/v1/chat/completions时,说明 TaoToken 的 Key 不对。检查三件事:Key 是不是以sk-开头、有没有多余空格、有没有过期。如果 Key 是从控制台复制的,注意别把换行符带进去。可以在模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat 里先测一下同一个 Key,能通就说明 Key 没问题,问题在 OpenClaw 的配置里。

local proxy failed:这个报错通常出现在 SSH 隧道场景。原因是本地端口被占用,或者隧道进程已经断了。先检查本地 18789 有没有被别的程序占用,Mac/Linux 用lsof -i :18789,Windows 用netstat -ano | findstr 18789。如果被占用,换一个本地端口,比如-L 18790:127.0.0.1:18789,然后浏览器访问http://localhost:18790。如果端口没被占用,那就是隧道断了,重新执行 ssh 命令。

reading choices 报错 / choices 字段缺失:这个报错说明请求发出去了,但返回体里没有choices字段,通常是模型 ID 写错或者请求格式不对。检查model字段的值是不是 TaoToken 支持的模型名,messages数组格式对不对。如果返回体里是error字段而不是choices,把 error 内容打出来看具体原因,常见的是model not found或invalid request format。

OAuth 相关报错:如果你在 OpenClaw 里配了 OAuth 类型的 provider,可能会遇到 token 刷新失败。这类问题多半是回调地址配错了,或者 client secret 过期。建议个人场景直接用 API Key 方式,别上 OAuth,省去刷新逻辑。TaoToken 的 Key 方式就是为这种场景设计的,一个 Key 管所有模型调用。

页面显示「不安全上下文」:这个不是报错,是 OpenClaw 的保护机制。说明你在用http://公网IP访问。改用http://localhost(隧道方案)或者https://(Nginx 方案)就能解决。别想着去关掉这个校验,它是在保护你的 Token 不被明文传输。

服务没在监听:如果 curl 直接连接被拒,去服务器上执行netstat -ntlp | grep 18789,看有没有监听在0.0.0.0:18789或127.0.0.1:18789。如果只有127.0.0.1,说明bind配的是local,Nginx 反代能通但公网直连不行。如果什么都没监听,用ps aux | grep openclaw确认进程在不在,不在就用nohup openclaw gateway --port 18789 >> ~/openclaw.log 2>&1 &启动,这样退出 SSH 后服务也不会停。

排查的顺序建议是:先确认服务在跑,再确认端口在监听,再确认隧道或 Nginx 通,最后确认两层 Token 都对。按这个顺序走,基本不会绕弯路。

6. 把统一 Key 通道固定下来的实用建议

链路打通之后,建议把配置固定成一套可复用的方案,别每次重新折腾。如果你主要在自己电脑上访问,SSH 隧道是首选,可以写一个 shell 脚本或者 alias,把 ssh 命令封装起来,每次执行一个短命令就能开隧道。比如在~/.bashrc里加一行alias openclaw-tunnel='ssh -N -L 18789:127.0.0.1:18789 root@你的ECS公网IP',之后敲openclaw-tunnel就行。

如果你有多台设备要访问,Nginx 方案更省事。自签名证书浏览器会提示不安全,可以在本地信任这个证书,或者用 Let's Encrypt 签一个正式证书(需要域名)。Nginx 配置里建议加上访问日志,方便排查问题:

access_log /var/log/nginx/openclaw.access.log; error_log /var/log/nginx/openclaw.error.log;

TaoToken 的 Key 建议定期轮换,在控制台里可以创建多个 Key,给不同服务用不同的 Key,这样某个 Key 泄露时只影响一个服务。OpenClaw 的 gateway token 也一样,别长期不换。两套凭证分开管理,出问题时能快速定位是哪一层的问题。

模型调用这块,如果你经常切换模型,可以在 OpenClaw 的配置里把多个模型 ID 都列上,用的时候按需选。TaoToken 的统一 Key 好处就在这里,换模型不用换 Key,只改 Model ID 就行。长期跑编码或 Agent 任务的话,Coding Plan 的额度比按量计费更划算,具体可以看 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan 的说明。

最后提醒一句:SSH 隧道方案下,远程 18789 不要对公网开放,安全组里也别放行,这样即使 Token 泄露,攻击者也连不上端口。Nginx 方案下,建议在 Nginx 层再加一层 basic auth 或者 IP 白名单,多一道防线。OpenClaw 的 gateway token 校验是第一道,Nginx 的访问控制是第二道,两层叠加起来,个人使用足够安全了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询