Frp 使用 https2http 配置 HTTPS
之前我的网站一直通过 Cloudflare 代理 实现 HTTPS,但由于 CF 在中国的访问速度波动较大,不够稳定,因此我开始寻找其它方案。感谢 @eee_CY 的方法与支持,让我找到了更优解。
背景问题
最初我咨询了 ChatGPT,它建议我开一个 type = tcp
的隧道,但这种方式需要服务器端部署证书,而且无法使用标准的 443
端口。
在请教了 @eee_CY 之后,我发现了 plugin = https2http
这个更合适的方案:只需要在本地部署一个自动续期脚本,之后就可以完全“放手不管”了。
配置过程(支持 Termux)
我使用的是 acme.sh
来申请并自动续期证书。
1. 安装 acme.sh
使用以下命令安装:
curl https://get.acme.sh | sh
然后在 ~/.bashrc
中添加路径环境变量:
export PATH="$HOME/.acme.sh":$PATH
source ~/.bashrc
2. 注册账户
acme.sh --register-account -m your@email.com
3. 暂停占用 80 端口的服务
例如 Apache:
apachectl stop
否则你可能会遇到以下报错:
Cannot init API for: https://acme-v02.api.letsencrypt.org/directory
4. 申请证书
acme.sh --issue --standalone -d <你的域名>
⚠️ 注意坑点:ZeroSSL 限制
如果遇到:
retry-after=86400
这是 ZeroSSL 的限制,建议立刻切换为 Let’s Encrypt:
acme.sh --set-default-ca --server letsencrypt
5. 安装证书到指定位置
acme.sh --install-cert -d <你的域名> \
--key-file ~/frp-cert/privkey.pem \
--fullchain-file ~/frp-cert/fullchain.pem \
--reloadcmd "pkill -HUP frpc"
--reloadcmd
会在证书更新后重载frpc
,确保自动生效。
6. 自动更新证书
可以使用 cron
实现自动续期,但在 Termux 中配置 Cron 有些繁琐。
我选择了更适合 Android 的工具:Tasker 来定期运行更新脚本。
frp 配置(使用 https2http Plugin)
设置一个 type = https
的隧道,并重点加上以下配置:
type = https
plugin = https2http
plugin_local_addr = 127.0.0.1:80
plugin_crt_path = /data/data/com.termux/files/home/frp-cert/fullchain.pem
plugin_key_path = /data/data/com.termux/files/home/frp-cert/privkey.pem
plugin_host_header_rewrite = <你的域名>
然后 启动 Apache 与 frp 即可
apachectl start
frpc
总结
通过这个方案:
- 不再依赖 Cloudflare;
- 证书自动续期;
- 网站加载速度:15s -> 3s;
终于不再受 Cloudflare 时快时慢的寸止折磨了
这个不错,不过还是建议有条件上云或者家里云,买个小主机放着,我就是这样,另外只要有公网IPv6+刷光猫关掉防火墙和限制,可以做到任意CDN回源。