#

> **适用场景**:将本地运行的 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/...` 等占位符替换为实际值。
 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐