boa-https-proxy
由于场景需要,需要用到https,作为嵌入式主机里的简单内置web,原来用的服务是boa,比较简单,也不支持https,后来找lighttpd移植测试,移植过程的艰辛不必多说了,也是好多坑,最崩溃的是移植完以后http是可以用, https访问就会挂掉……
后来换个思路,做个代理算了,也有开源的类似工具,但是功能比较多,编译出来也比较大,最后还是让AI写了一个基于go语言的https代理。
为嵌入式设备上仅支持 HTTP 的 boa Web 服务提供 HTTPS 访问的 TLS 终结反向代理,纯 Go 标准库实现,无任何第三方依赖,可直接交叉编译到嵌入式 Linux。
源码
https://gitee.com/fensnote/https-proxy
工作原理
浏览器/客户端 ──HTTPS(443)──> boa-https-proxy ──HTTP(80)──> boa Web 服务
代理监听 HTTPS 端口,完成 TLS 握手解密后,把请求以明文 HTTP 转发给本机(或局域网内)的 boa 服务,再将响应原样返回。boa 本身不需要任何改动,也感知不到 HTTPS 的存在。
快速开始
1. 编译
本机(Windows):
go build -o boa-https-proxy.exe .
交叉编译到嵌入式设备(在 Windows/Linux 开发机上执行):
# ARMv7(常见于 Cortex-A 嵌入式板子)
GOOS=linux GOARCH=arm GOARM=7 go build -trimpath -ldflags "-s -w" -o boa-https-proxy-armv7 .
# ARM64 / aarch64
GOOS=linux GOARCH=arm64 go build -trimpath -ldflags "-s -w" -o boa-https-proxy-arm64 .
# MIPS(老式路由器/网关常用)
GOOS=linux GOARCH=mips GOMIPS=softfloat go build -trimpath -ldflags "-s -w" -o boa-https-proxy-mips .
# x86_64
GOOS=linux GOARCH=amd64 go build -trimpath -ldflags "-s -w" -o boa-https-proxy-amd64 .
设备架构不确定时,登录设备执行
uname -m确认(
armv7l选 arm/7,
aarch64选 arm64,
mips选 mips)。
2. 部署到设备
把可执行文件拷到设备(如 /usr/sbin/ 或 /opt/),确保有执行权限:
chmod +x boa-https-proxy-armv7
3. 启动
最简单的启动方式(自动生成自签名证书,10 年有效):
# 假设 boa 在本机 80 端口
./boa-https-proxy-armv7 -selfsigned
# boa 不在本机 / 想换端口 / 把 HTTP 80 也接管做跳转
./boa-https-proxy-armv7 -listen :443 -target http://192.168.1.50:80 -selfsigned -redirect :80
启动后访问 https://设备IP/ 即可。
4. 开机自启(可选)
设备是 busybox 系(boa 的典型环境)时,在 /etc/init.d/S99httpsproxy 写:
#!/bin/sh
case "$1" in
start)
/opt/boa-https-proxy-armv7 -selfsigned >/dev/null 2>&1 &
;;
stop)
killall boa-https-proxy-armv7
;;
esac
命令行参数
| 参数 | 默认值 | 说明 |
-listen |
:443 |
HTTPS 监听地址,如 :443、0.0.0.0:8443 |
-target |
http://127.0.0.1:80 |
后端 boa 服务地址,可指向局域网内其它主机 |
-cert / -key |
server.crt / server.key |
TLS 证书与私钥文件路径 |
-selfsigned |
false |
证书文件不存在时自动生成自签名证书(10 年有效) |
-cert-hosts |
localhost,127.0.0.1 |
自签名证书包含的主机名 / IP(逗号分隔),部署时建议填入设备 IP 或域名,如 -cert-hosts 192.168.1.50,mydevice.local |
-host |
空 | 强制转发给 boa 的 Host 头;留空则透传客户端原始 Host |
-redirect |
空 | 额外监听一个 HTTP 地址(如 :80),把访问 301 跳转到 HTTPS |
-v |
false |
详细访问日志(含 Host 与 UA) |
-version |
false |
打印版本号 |
验证
# 忽略自签证书告警访问
curl -k https://设备IP/
# 查看 301 跳转
curl -sI http://设备IP/ | grep -i location
浏览器访问自签名证书页面会提示 "不安全",点 "继续访问" 即可;若不想看到告警,见下文。
常见问题
1. 浏览器提示证书不受信任?
自签名证书必然告警。生产 / 长时间使用建议:
• 用设备实际 IP / 域名配合 -cert-hosts 重新生成证书,并在客户端电脑上把 server.crt 导入 "受信任的根证书颁发机构";
• 或购买 / 申请泛域名证书(如 Let's Encrypt),用 -cert / -key 指定。
2. boa 页面里的绝对路径跳转带了 https 端口?
boa 是 HTTP 服务,生成的绝对 URL 只会带自己的端口,与 HTTPS 无关。代理默认透传客户端 Host。若 boa 根据 Host 头生成重定向,可用 -host 强制指定(如 -host 设备IP)。
3. 代理能转发 WebSocket / 长连接吗?
能。底层 httputil.ReverseProxy 支持 HTTP/1.1 keep-alive 与 WebSocket 升级,代理层已透传 Flush/Hijack。
4. 内存占用?
极小。默认 idle 连接池上限 64,嵌入式设备上运行无压力;静态编译的单文件二进制约 5MB。
目录结构
boa-https-proxy/
├── main.go # 全部源码(单文件)
├── go.mod
├── boa-https-proxy.exe # Windows 本机编译产物
├── boa-https-proxy-armv7# Linux/ARMv7 交叉编译产物
├── server.crt/server.key# 测试生成的证书(可删除,-selfsigned 会重建)
└── test_www/ # 本地模拟 boa 的测试页面(可删除)
280