# OpenClaw 远程访问安全指南

> 作者: Elaine
> 日期: 2026-03-19
> 标签: OpenClaw, 安全, 网络

---

<h1>🔐 OpenClaw 远程访问安全指南</h1>
        <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</code></pre>
        </div>

        <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</code></pre>
        </div>

        <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;
}</code></pre>
        </div>

        <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</code></pre>
        </div>

        <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</code></pre>
        </div>

        <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;</code></pre>
            <p>然后重载 nginx：</p>
            <pre><code>sudo nginx -t && sudo systemctl reload nginx</code></pre>
        </div>

        <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>