🔐 OpenClaw 远程访问安全指南
<p class="subtitle">如何配置 HTTPS 实现安全的远程访问 | 2026-03-19</p>
<div class="info">
<div class="info-title">📋 目录</div>
<ul>
<li><a href="#背景" style="color:#60a5fa;">背景:为什么需要安全的远程访问?</a></li>
<li><a href="#http-https" style="color:#60a5fa;">HTTP vs HTTPS:为什么 HTTP 不安全?</a></li>
<li><a href="#ssh-tunnel" style="color:#60a5fa;">SSH 隧道:临时的安全方案</a></li>
<li><a href="#https原理" style="color:#60a5fa;">HTTPS 工作原理:TLS/SSL 加密</a></li>
<li><a href="#nginx-https" style="color:#60a5fa;">Nginx + 自签名证书:实现 HTTPS 访问</a></li>
<li><a href="#安全配置" style="color:#60a5fa;">安全配置清单</a></li>
<li><a href="#总结" style="color:#60a5fa;">总结</a></li>
</ul>
</div>
<h2 id="背景">🔍 背景:为什么需要安全的远程访问?</h2>
<div class="section">
<p>当我们部署 OpenClaw Gateway 在服务器上后,自然希望能从任何地方访问它的 Dashboard。但是,如果直接开放访问,就会面临安全风险。</p>
</div>
<div class="info">
<div class="info-title">🎯 本文目标</div>
<p>在不购买域名的情况下,实现安全的 HTTPS 远程访问。</p>
</div>
<h2 id="http-https">🌐 HTTP vs HTTPS:为什么 HTTP 不安全?</h2>
<div class="section">
<h3>HTTP 的工作方式</h3>
<p>HTTP(HyperText Transfer Protocol)是"超文本传输协议",用于浏览器和服务器之间的通信。</p>
</div>
<div class="warning">
<div class="warning-title">⚠️ HTTP 的致命问题</div>
<p>数据在网络中以明文传输,任何中间人都能窃听!</p>
</div>
<div class="section">
<p>这意味着:</p>
<ul>
<li>❌ <strong>用户名/密码</strong> 可被窃取</li>
<li>❌ <strong>Token/会话</strong> 可被劫持</li>
<li>❌ <strong>业务数据</strong> 可被窥探</li>
</ul>
</div>
<div class="section">
<h3>HTTPS 的工作方式</h3>
<p>HTTPS = HTTP + TLS(Transport Layer Security),在传输层对数据进行加密。</p>
</div>
<table>
<tr>
<th>特性</th>
<th>HTTP</th>
<th>HTTPS</th>
</tr>
<tr>
<td>数据传输</td>
<td>明文 ❌</td>
<td>加密 ✅</td>
</tr>
<tr>
<td>身份验证</td>
<td>无 ❌</td>
<td>证书验证 ✅</td>
</tr>
<tr>
<td>安全性</td>
<td>不安全</td>
<td>安全</td>
</tr>
<tr>
<td>端口</td>
<td>80</td>
<td>443</td>
</tr>
</table>
<h2 id="ssh-tunnel">🚇 SSH 隧道:临时的安全方案</h2>
<div class="section">
<h3>为什么需要 SSH 映射到本地?</h3>
<ol>
<li><strong>HTTP 明文传输</strong>:直接通过公网 IP 访问 HTTP,Token 会被明文发送,极其危险</li>
<li><strong>无身份验证</strong>:HTTP 不验证服务器身份,可能被中间人攻击</li>
<li><strong>SSH 隧道提供加密</strong>:SSH 本身是加密的,所以本地映射相对安全</li>
</ol>
</div>
<div class="info">
<div class="info-title">💡 SSH 隧道的工作原理</div>
<p>本地端口 ──[SSH 加密隧道]──> 服务器</p>
<p>浏览器访问本地 127.0.0.1:18789,数据通过 SSH 加密隧道传输到服务器。</p>
</div>
<div class="section">
<h3>SSH 隧道的缺点</h3>
<ul>
<li>❌ 需要 SSH 客户端,不是所有设备都有</li>
<li>❌ 配置相对繁琐</li>
<li>❌ 无法从手机等设备直接访问</li>
</ul>
</div>
<h2 id="https原理">🔒 HTTPS 工作原理:TLS/SSL 加密</h2>
<div class="section">
<h3>TLS 握手过程</h3>
<ol>
<li><strong>Client Hello</strong>:客户端告诉服务器支持的加密套件</li>
<li><strong>Server Hello</strong>:服务器选择加密方式,返回证书</li>
<li><strong>证书验证</strong>:客户端验证服务器证书(自签名需手动信任)</li>
<li><strong>密钥协商</strong>:双方生成会话密钥</li>
<li><strong>加密通信</strong>:后续数据用会话密钥加密传输</li>
</ol>
</div>
<div class="section">
<h3>证书类型对比</h3>
<table>
<tr>
<th>类型</th>
<th>价格</th>
<th>需要域名</th>
<th>浏览器信任</th>
</tr>
<tr>
<td>Let's Encrypt (免费)</td>
<td>免费 ✅</td>
<td>是</td>
<td>自动信任</td>
</tr>
<tr>
<td>自签名证书</td>
<td>免费 ✅</td>
<td>否</td>
<td>需手动信任</td>
</tr>
<tr>
<td>商业证书</td>
<td>付费</td>
<td>是</td>
<td>自动信任</td>
</tr>
</table>
</div>
<h2 id="nginx-https">⚙️ Nginx + 自签名证书:实现 HTTPS 访问</h2>
<p>由于我们没有域名,使用<strong>自签名证书</strong>是最佳方案。</p>
<div class="warning">
<div class="warning-title">⚠️ 重要提示</div>
<p>首次访问 https://你的IP:443 时,浏览器会显示"您的连接不是私密连接"。点击"高级" → "继续前往(不安全)"即可。只需要信任一次,之后就正常了。</p>
</div>
<div class="section">
<h3>步骤一:安装 Nginx</h3>
<pre><code># Ubuntu/Debian
sudo apt update
sudo apt install nginx
验证安装
nginx -v
<div class="section">
<h3>步骤二:生成自签名 SSL 证书</h3>
<pre><code># 创建证书存放目录
sudo mkdir -p /etc/nginx/ssl
生成私钥和证书
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/openclaw.key \
-out /etc/nginx/ssl/openclaw.crt
<div class="section">
<h3>步骤三:配置 Nginx 反向代理</h3>
<pre><code>server {
listen 443 ssl;
server_name _;
ssl_certificate /etc/nginx/ssl/openclaw.crt;
ssl_certificate_key /etc/nginx/ssl/openclaw.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:18789;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
server {
listen 80;
server_name _;
return 301 https://$server_name$request_uri;
}
<div class="section">
<h3>步骤四:启用配置</h3>
<pre><code>sudo ln -s /etc/nginx/sites-available/openclaw /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
<h2 id="安全配置">✅ 安全配置清单</h2>
<div class="section">
<h3>1. 强密码/Token</h3>
<ul>
<li>Token 长度至少 32 位</li>
<li>包含大小写字母、数字、特殊字符</li>
<li>定期更换</li>
</ul>
</div>
<div class="section">
<h3>2. 防火墙配置</h3>
<pre><code>sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 22/tcp # SSH
sudo ufw enable
<div class="section">
<h3>3. 阿里云安全组</h3>
<table>
<tr>
<th>端口</th>
<th>协议</th>
<th>授权对象</th>
</tr>
<tr>
<td>443</td>
<td>TCP</td>
<td>0.0.0.0/0 或你的IP</td>
</tr>
</table>
</div>
<h2 id="常见问题">🔧 常见问题排查</h2>
<div class="section">
<h3>1. 浏览器提示"您的连接不是私密连接"</h3>
<p>这是自签名证书的正常提示。点击"高级" → "继续前往(不安全)"即可。仅首次需要,之后浏览器会记住证书。</p>
</div>
<div class="section">
<h3>2. Dashboard 提示"control ui requires device identity"</h3>
<p>浏览器安全策略要求 Device Identity API 必须通过安全上下文(HTTPS 或 localhost)访问。如果直接用 HTTP 访问公网 IP 就会触发此错误。</p>
<p><strong>解决方法:</strong>按照上面的步骤配置 HTTPS 访问,通过 HTTPS 访问即可解决。</p>
</div>
<div class="section">
<h3>3. 点 Connect 显示 "disconnected (1006): no reason"</h3>
<p>WebSocket 连接失败,通常是 nginx 没有正确配置 WebSocket 代理。</p>
<p><strong>解决方法:</strong>确保 nginx 配置中包含以下 4 个关键 headers:</p>
<pre><code>proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
然后重载 nginx:
sudo nginx -t && sudo systemctl reload nginx <h2 id="总结">📝 总结</h2>
<div class="success">
<div class="success-title">✅ 配置完成后</div>
<ul>
<li>浏览器访问 https://你的公网IP:443</li>
<li>数据全程加密传输</li>
<li>无需 SSH 隧道</li>
<li>支持手机等所有设备</li>
</ul>
</div>
<table>
<tr>
<th>方式</th>
<th>安全性</th>
<th>便捷性</th>
</tr>
<tr>
<td>HTTP + 公网IP</td>
<td>❌ 极不安全</td>
<td>最方便</td>
</tr>
<tr>
<td>HTTP + SSH隧道</td>
<td>✅ 安全</td>
<td>较繁琐</td>
</tr>
<tr>
<td>HTTPS + 自签名</td>
<td>✅ 安全</td>
<td>方便</td>
</tr>
</table>