🔐 OpenClaw "Pairing Required" 机制详解
一、这是什么问题?
当您通过 非本地地址(如 https://192.168.195.130)访问 Control UI 时,OpenClaw 会要求您进行设备配对,提示 "pairing required"。
二、为什么需要这个机制?
🔍 安全背景
OpenClaw 是一个个人助理系统,可以:
- 📁 访问您的文件
- 💬 读取消息(QQ、邮件等)
- 🔧 执行系统命令
- 🌐 浏览网页、控制浏览器
如果任何知道 IP 的人都能访问,会导致严重的安全风险。
⚠️ 威胁场景
| 场景 | 风险 |
|---|---|
| 局域网内其他设备扫描端口 | 发现 Gateway |
| 未经授权的设备连接 | 获取您的控制权 |
| 中间人攻击 | 窃听或篡改通信 |
三、配对机制的工作原理
🔄 配对流程图解
┌─────────────┐ ┌──────────────────┐
│ 浏览器/客户端 │ │ OpenClaw Gateway │
└──────┬──────┘ └─────────┬─────────┘
│ │
│ 1. 尝试连接 WebSocket │
├────────────────────────────────────>│
│ │
│ 2. 检查设备身份 │
│ (device identity) │
│ │
│ 3. 未找到已知设备 → 拒绝连接 │
│<────────────────────────────────────┤
│ │
│ 4. 显示 "pairing required" │
│ │
│ 5. 用户输入配对码或批准设备 │
├────────────────────────────────────>│
│ │
│ 6. Gateway 保存设备指纹 │
│ (token/cookie/证书) │
│<────────────────────────────────────┤
│ │
│ 7. 连接成功 ✅ │
│ │
📝 技术实现
OpenClaw 使用以下方式验证设备身份:
- Token 认证:Gateway 配置中的 token(
openclaw.json→gateway.auth.token) - 设备指纹:浏览器 Cookie、LocalStorage、证书指纹等
- 配对表:已知设备的白名单(存储在 Gateways 本地)
当第一次访问时,这些凭证都不存在,所以需要配对。
四、这个机制的意义
✅ 安全价值
| 目标 | 实现方式 |
|---|---|
| 防止未授权访问 | 只有配对过的设备才能连接 |
| 防重放攻击 | 每次连接都有唯一的 session token |
| 防中间人攻击 | HTTPS + 双向验证 |
| 设备可见性 | 可以查看哪些设备已配对(openclaw devices list) |
| 撤销权限 | 可以随时移除不信任的设备 |
🛡️ 与 SSH 对比
| 对比项 | OpenClaw Pairing | SSH 密钥认证 |
|---|---|---|
| 初始设置 | 需要配对码/批准 | 生成公钥对 |
| 存储方式 | 服务端白名单 | 客户端私钥 |
| 可视化 | 有设备列表管理 | 需手动检查 authorized_keys |
| 撤销权限 | 一键移除设备 | 需编辑文件 |
五、其他解决办法/绕过方式
🎯 方案对比
方案 1: 使用 SSH 隧道(最安全)⭐⭐⭐
# 在客户端执行
ssh -L 18789:localhost:18789 user@YOUR_IP
# 然后访问 localhost
http://localhost:18789/chat?session=main
优点:
- ✅ 浏览器认为来自 localhost(本地安全上下文)
- ✅ 无需配对
- ✅ SSH 加密传输
- ✅ 不暴露 Gateway 端口到公网
缺点:
- ❌ 需要 SSH 客户端
- ❌ 每台设备都需要建立隧道
方案 2: Nginx 伪造 Host/Origin(已采用)⭐⭐
proxy_set_header Host localhost;
proxy_set_header Origin https://localhost:18789;
优点:
- ✅ Gateway 认为请求来自本地
- ✅ 无需配对
- ✅ 可直接 HTTPS 访问
缺点:
- ❌ 本质上绕过了安全验证
- ❌ 任何知道 IP 的人都能访问(仅靠 Token 保护)
- ⚠️ 降低安全性
方案 3: 正式配对(最规范)⭐⭐⭐
# 1. 查看待批准的设备
openclaw devices list
# 2. 批准特定设备
openclaw devices approve <device-id>
# 3. 或临时允许所有本地请求(不推荐)
优点:
- ✅ 官方推荐方式
- ✅ 保留审计日志
- ✅ 可以随时撤销设备权限
缺点:
- ❌ 每台新设备都需要配对
- ❌ 需要命令行操作
方案 4: 关闭 Pairing 验证(不推荐)❌
目前没有配置项可以直接关闭 pairing 验证,因为这是 OpenClaw 核心安全机制。
但可以:
// openclaw.json - 仅信任特定域名
"gateway": {
"controlUi": {
"allowedOrigins": ["*"] // ⚠️ 允许所有来源(非常危险)
}
}
⚠️ 强烈不推荐:这会完全绕过安全检查。
方案 5: 使用 Let's Encrypt HTTPS + 正式配对(最佳实践)⭐⭐⭐⭐
| 步骤 | 描述 |
|---|---|
| 1. | 申请域名(如 openclaw.yourdomain.com) |
| 2. | 配置 A 记录指向服务器 IP |
| 3. | 使用 Certbot 获取免费 SSL 证书 |
| 4. | 更新 Nginx 配置使用真实证书 |
| 5. | 首次访问时正式配对设备 |
优点:
- ✅ 浏览器信任的证书(无警告)
- ✅ 完整的安全验证流程
- ✅ 支持跨域、移动端访问
📊 方案总结
| 方案 | 安全性 | 便利性 | 适用场景 |
|---|---|---|---|
| SSH 隧道 | 🔒🔒🔒🔒🔒 | ⚡⚡⭐️⭐️ | 个人使用、临时访问 |
| Nginx 伪造 Origin | 🔒🔒⭐️⭐️⭐️ | ⚡⚡⚡⚡ | 家庭局域网、信任环境 |
| 正式配对 | 🔒🔒🔒🔒🔒 | ⚡⚡⚡⭐️ | 生产环境、多设备 |
| Let's Encrypt + 配对 | 🔒🔒🔒🔒🔒 | ⚡⚡⚡⚡ | 公网访问、专业部署 |
六、当前您的配置分析
✅ 已配置的安全措施
┌─────────────────────────────────────┐
│ 🔒 Layered Security (多层防护) │
├─────────────────────────────────────┤
│ 1. Token 认证:8e3b7...54 │
│ → Gateway API 请求需要此 token │
├─────────────────────────────────────┤
│ 2. HTTPS (自签名证书) │
│ → 加密传输,防窃听 │
├─────────────────────────────────────┤
│ 3. UFW 防火墙 │
│ → 18789 仅允许 192.168.0.0/16 │
├─────────────────────────────────────┤
│ 4. Device Pairing (已完成) │
│ → 已批准设备:4f9db1...2464e │
└─────────────────────────────────────┘
⚠️ 潜在风险点
| 风险 | 说明 | 建议 |
|---|---|---|
| Nginx 绕过配对验证 | 所有请求伪造为 localhost | 限制 IP 或启用正式配对 |
QQBot allowFrom: ["*"] | 任何 QQ 账号都可连接 | 改为具体账号列表 |
| 自签名证书 | 无法防止中间人攻击(理论上) | 长期使用建议 Let's Encrypt |
七、最佳实践建议
🏠 家庭/个人使用(当前场景)
- ✅ 保持现状:已配对 + Token + HTTPS
- ⚡ 可选优化:添加 UFW IP 限制到特定设备
- 📝 记录 Token,丢失后需重新配置
🌐 公网访问
- 🔒 必须使用正式配对流程(移除 Nginx 伪造)
- 🔑 申请 Let's Encrypt 证书
- 🛡️ 启用 Fail2ban 防暴力破解
- 🔍 定期审查设备列表:
openclaw devices list
📚 参考命令速查
# 查看已配对设备
openclaw devices list
# 批准新设备
openclaw devices approve <device-id>
# 移除设备
openclaw devices remove <device-id>
# 修改 Token(重新生成)
nano ~/.openclaw/openclaw.json # gateway.auth.token
# 查看访问日志
journalctl -f openclaw-gateway.service
# 检查防火墙规则
ufw status numbered
希望这个详细解读帮助您理解 OpenClaw 的安全机制!有什么具体问题可以继续问我。🔐