在企业内部有一个研发云平台,可以启动Docker容器,并通过端口映射的服务给用户访问。我想在该平台上参考各大云厂商的做法,让用户可以基于Openclaw来启动自己的容器,提供个人助手的服务。目前Openclaw的版本迭代演进很快,基于最新的3.8版本,测试一下应如何在云平台通过安全的方式来提供Openclaw服务给用户。
由于Openclaw的功能很强大,同时不可避免的有很多安全漏洞,如果不注意安全问题,那么用户自己部署的Openclaw服务很容易受到攻击。结合Openclaw官网中对安全这部分的介绍,我打算在Openclaw容器中配置Nginx服务,通过https的方式来给外部提供连接。
生成云平台IP的自签证书
1. 创建 OpenSSL 配置文件
因为Openclaw不是在本地运行,要通过云平台的IP和端口访问,因此需要开启https。为云平台生成自签证书,首先创建一个openssl.cnf的配置文件
[req]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_req # 生成自签名证书时使用的扩展
prompt = no
[req_distinguished_name]
countryName = CN
stateOrProvinceName = Beijing
localityName = Beijing
organizationName = Example Inc.
organizationalUnitName = IT
commonName = 192.168.1.100 # 这里填写云平台IP 或一个描述名称
[req_ext]
subjectAltName = @alt_names
[v3_req]
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.100 # 云平台IP
# 如果有多个 IP 可以继续添加 IP.2, IP.3...
# 也可以添加 DNS 名称,例如 DNS.1 = internal.example.com
2. 生成私钥和自签名证书
为云平台生成证书,执行以下命令
# 生成私钥
openssl genrsa -out myip.key 2048
# 使用配置文件生成证书(有效期 365 天)
openssl req -x509 -new -nodes \
-key myip.key \
-sha256 -days 365 \
-out myip.crt \
-config openssl.cnf \
-extensions v3_req
3. 验证证书是否包含正确 IP
执行以下命令
openssl x509 -in myip.crt -text -noout | grep -A 1 "Subject Alternative Name"
生成Nginx配置文件
可以通过Nginx来处理Https协议,在Openclaw容器内监听https端口并转发到对应的服务。创建一个default.conf文件,内容如下:
server {
listen 18999 ssl http2; # 关键:监听 443 端口并启用 SSL
server_name 172.18.193.247;
# SSL 证书配置
ssl_certificate /etc/nginx/certs/myip.crt; # 证书文件路径(容器内)
ssl_certificate_key /etc/nginx/certs/myip.key; # 私钥文件路径(容器内)
# 推荐的安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 根路径配置
location / {
#root /usr/share/nginx/html; # 或你的静态文件路径
#index index.html index.htm;
# 如果是反向代理到后端服务,使用 proxy_pass
proxy_pass http://localhost:18789;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
server {
listen 3001 ssl http2; # 关键:监听 443 端口并启用 SSL
server_name 172.18.193.247;
# SSL 证书配置
ssl_certificate /etc/nginx/certs/myip.crt; # 证书文件路径(容器内)
ssl_certificate_key /etc/nginx/certs/myip.key; # 私钥文件路径(容器内)
# 推荐的安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 根路径配置
location / {
#root /usr/share/nginx/html; # 或你的静态文件路径
#index index.html index.htm;
# 如果是反向代理到后端服务,使用 proxy_pass
proxy_pass http://localhost:3000;
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_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
在这个配置文件里面,监听了两个https端口,其中18999这个端口会转发服务到openclaw的本地服务端口18789,另一个3001端口会转发到OpenClaw-bot-review的服务端口3000。这是一个轻量级 Web 仪表盘,用于一览所有openclaw机器人/Agent/模型/会话的运行状态,其内置像素风动画办公室,让openclaw的 Agent 化身像素角色在办公室里行走、就座、互动,为枯燥的运维增添一份趣味。另外配置文件里面也设置了使用刚才生成的证书和Key。
生成Openclaw配置文件
为了便利用户部署Openclaw,可以把常用的大模型,channel都先配置好。另外还需要设置配置文件openclaw.json中的gateway部分的设置,内容如下:
{
"gateway": {
"port": 18789,
"mode": "local",
"bind": "loopback",
"controlUi": {
"allowedOrigins": [
"http://localhost:18789",
"http://127.0.0.1:18789",
"https://云IP:18999"
],
},
"auth": {
"mode": "token",
"token": "xxxxxxxxxxxxxxxxxxx"
},
...
}
在这个设置中,限定了openclaw只能通过本地localhost来访问。如果是远程访问,只允许在allowedOrigins里面的源才可访问。
构建私有Openclaw镜像
在本地创建一个目录,拷贝default.conf、openclaw.json文件到该目录,另外创建一个名为certs的子目录,把之前生成的证书和Key拷贝到该目录。在该目录下创建一个debian.sources文件,定义要用到的国内源。
Types: deb deb-src
URIs: https://mirrors.tuna.tsinghua.edu.cn/debian
Suites: trixie trixie-updates trixie-backports
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb deb-src
URIs: https://mirrors.tuna.tsinghua.edu.cn/debian-security
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
在目录中运行git clone命令,拉取OpenClaw-bot-review代码
git clone https://github.com/xmanrui/OpenClaw-bot-review.git
新建一个Dockerfile文件,内容如下:
FROM m.daocloud.io/ghcr.io/openclaw/openclaw:2026.3.8
USER root
#复制Debian国内源设置
COPY debian.sources /etc/apt/sources.list.d/
#安装Nginx
RUN apt-get update && apt-get install nginx nano -y
COPY default.conf /etc/nginx/conf.d/default.conf
COPY certs/ /etc/nginx/certs/
COPY OpenClaw-bot-review/ /app/OpenClaw-bot-review/
RUN chown -R node:node /app/OpenClaw-bot-review
USER node
#设置npm国内源
RUN npm config set registry https://registry.npmmirror.com
WORKDIR /app/OpenClaw-bot-review
RUN npm install
WORKDIR /app
最后运行以下命令构建镜像
docker build -t openclaw:local .
服务验证
在本地可以进行验证,例如查询本地docker服务的IP地址是172.18.193.247,在以上的配置中设置该IP,然后拉取openclaw的代码,然后通过docker compose up来运行。
git clone https://github.com/openclaw.git
git checkout v2026.3.8
cd openclaw
export OPENCLAW_IMAGE=openclaw:local
docker compose up -d
容器启动之后,可以通过以下命令进入gateway容器,然后启动nginx
docker exec -it -u root openclaw-openclaw-gateway-1
nginx
之后在浏览器中输入https://172.18.193.247:18999/?token=XXXXXX接口打开页面,这时会提示说deivce pairing require,以下命令进入容器,然后批准pair即可
docker exec -it openclaw-openclaw-gateway-1 bash
openclaw devices list
openclaw devices approve XXXXX(requestid)