FRP 配置指南:通过 HTTPS 访问内网 HTTP 服务(全平台兼容性优化)
#
> **适用场景**:将本地运行的 Web 服务(如管理系统、相册、监控面板等)通过公网安全暴露,支持 HTTPS 访问,并解决安卓、iOS 等移动端兼容性问题。
---
## 一、环境准备
| 组件 | 要求 |
|------|------|
| 内网服务器 | 运行目标 HTTP 服务(监听 `127.0.0.1:PORT`) |
| 外网服务器(VPS) | 具有公网 IP,开放所需端口 |
| 域名 | 已解析到 VPS 的公网 IP |
| SSL 证书 | 推荐使用 Let's Encrypt 免费证书 |
| 穿透工具 | FRP 0.52+(支持 `https2http` 插件) |
---
## 二、FRP 服务端配置(frps.toml)
```toml
[common]
# FRP 通信端口
bindPort = 7000
# HTTPS 穿透端口
vhostHTTPSPort = 8443
# SSL 证书(用于 HTTPS 终止)
vhostHTTPSCertFile = "/path/to/fullchain.crt"
vhostHTTPSKeyFile = "/path/to/privkey.pem"
# (可选)仪表盘
dashboardPort = 7500
dashboardUser = "admin"
dashboardPwd = "secure_password"
```
> 🔐 证书文件必须包含完整的证书链(即 `fullchain.crt`),避免客户端因中间 CA 缺失导致校验失败。
---
## 三、FRP 客户端配置(frpc.toml)
```toml
[common]
serverAddr = "your_vps_public_ip"
serverPort = 7000
[[https]]
name = "web-service"
customDomains = ["your-domain.com"]
plugin = "https2http"
pluginLocalAddr = "127.0.0.1:8080" # 替换为你的内网服务端口
pluginHeaders = ["X-From-Where", "frp"]
```
> ✅ `customDomains` 必须与申请证书的域名完全一致。
---
## 四、SSL 证书申请(Let's Encrypt)
推荐使用 `acme.sh` 自动申请和续期:
```bash
# 安装 acme.sh
curl https://get.acme.sh | sh
# 以 DNS 验证方式申请证书(以阿里云为例)
acme.sh --issue -d your-domain.com --dns dns_ali
# 安装证书并设置自动重载
acme.sh --install-cert -d your-domain.com \
--fullchain-file "/path/to/fullchain.crt" \
--key-file "/path/to/privkey.pem" \
--reloadcmd "systemctl restart frps"
```
> ✅ 使用 `--fullchain-file` 可确保证书链完整,显著提升移动端(尤其是安卓 App 和 WebView)的兼容性。
---
## 五、启动服务
```bash
# 启动 FRP 服务端
./frps -c frps.toml
# 启动 FRP 客户端
./frpc -c frpc.toml
```
---
## 六、访问服务
在浏览器中访问:
```
https://your-domain.com:8443
```
✅ 若能正常加载页面,说明穿透成功。
---
## 七、常见问题与优化
### ❌ 问题 1:安卓手机自带浏览器无法访问(如报错 `-101`)
#### 原因分析:
- 某些安卓系统(如华为)使用定制 WebView 内核(如 X5)
- 对非标准 HTTPS 端口(如 `:8443`)支持不完善
- TLS 握手时未正确发送 SNI(Server Name Indication)
- 证书链不完整导致校验失败
#### 解决方案:
1. **确保证书链完整**
使用 `acme.sh` 的 `--fullchain-file` 参数生成完整链,避免中间 CA 缺失。
2. **清除浏览器缓存**
安卓系统可能缓存了早期连接失败状态,进入「设置 → 应用管理 → 浏览器 → 存储」清除缓存和数据。
3. **关闭“增强网页浏览”功能**(华为等厂商)
该功能启用流量压缩和代理,可能破坏 HTTPS 连接。
4. **建议用户使用第三方浏览器**(如 Chrome、Firefox、Edge)
第三方浏览器通常使用标准 Chromium 内核,兼容性更好。
---
### ❌ 问题 2:移动 App 无法连接
#### 原因分析:
- App 内嵌网络请求库对证书要求严格
- 使用系统 WebView 加载登录页时调用定制内核
- 非 `443` 端口被拦截或忽略
#### 解决方案:
1. **App 配置地址时不要加端口**(仅限后续结合 Nginx 反代场景)
本文暂不展开,但建议长期使用反向代理统一端口。
2. **重装 App 或清除应用数据**
避免缓存旧的连接失败记录。
3. **优先使用标准端口 `443`**
若条件允许,建议后续引入 Nginx 反代至 `443`,彻底解决兼容性问题。
---
### ❌ 问题 3:iOS 设备访问正常,安卓异常
#### 原因:
- iOS 所有浏览器共享 WebKit 内核,行为统一
- 安卓各厂商定制严重,WebView 表现差异大
✅ **结论**:安卓兼容性问题主要集中在 **系统浏览器 + 非标准端口 + 证书链不完整** 三者叠加。
---
## 八、验证清单
| 客户端 | 是否成功 |
|--------|----------|
| PC 浏览器 | ✅ |
| Android 浏览器(原生) | ✅(需清理缓存) |
| Android 浏览器(Chrome/Firefox) | ✅ |
| 移动 App(Android/iOS) | ✅(需证书完整) |
| 微信/QQ 内置浏览器 | ⚠️ 可能拦截,建议引导用户复制链接到外部浏览器 |
---
## 九、维护建议
1. ✅ **定期检查证书有效期**,确保 `acme.sh` 自动续期正常运行。
2. ✅ **监控 FRP 日志**,排查连接异常。
3. ✅ **保持 FRP 版本更新**,避免已知漏洞。
4. ✅ **文档化配置**,便于后期迁移或排查。
---
## 十、总结
| 步骤 | 关键点 |
|------|--------|
| 1. 部署 FRP | 实现基础穿透 |
| 2. 配置 HTTPS | 提升安全性 |
| 3. 完整证书链 | 解决移动端校验失败 |
| 4. 清理缓存 | 解决安卓浏览器 `-101` 错误 |
| 5. 用户引导 | 推荐使用标准浏览器访问 |
通过以上配置,你可以在不依赖反向代理的情况下,实现内网 HTTP 服务的安全外网访问,并最大程度保障移动端兼容性。
> ⚠️ 如需更高兼容性(如微信内访问),建议后续引入 Nginx 反代至 `443` 端口。
---
📌 **使用说明**:
- 将 `your-domain.com`、`your_vps_public_ip`、`/path/to/...` 等占位符替换为实际值。
更多推荐

所有评论(0)