配置 frpc 的自动 HTTPS 功能

请确保您完全理解这个功能再进行配置

我们已经碰到上百例因为 乱开自动 HTTPS 开关 造成 隧道访问不了出现神秘报错 的问题了
在打开自动 HTTPS 前请先 完全搞清楚 这个功能有什么用,如果看不懂就 不要开 这个功能
打开前必须阅读 禁忌证 里列出的 典中典不适用自动 HTTPS 功能的情况 并与使用场景进行对照

功能简介

首先让我们粗略的理解一下 HTTP 和 HTTPS 的关系:

  • HTTP = 用明文传输的网页
  • HTTPS = 用 TLS 对明文进行加密再传输,也就是把 HTTP 流量包在叫 TLS 的壳里

再看一下自动 HTTPS 功能的工作原理简图:

显然,这个功能的本质就是要求 frpc 采用 TLS 接受对外连接,对流量进行 ”脱壳“ 后再用明文协议连接本地服务。

适应证

这个功能最典型的应用场景是本地服务 不支持 HTTPS 时,却 需要用 HTTPS 进行访问。

下面这行字是写给 非 HTTP 流量 的用户看的,如果您穿透的是 HTTP 流量请 不要auto_https_mode 这个选项

当然,这个功能也可以用在其他地方。如果您有 非 HTTP 流量 需要用 TLS 进行一个套,也可以启用这个功能,但是最好把 auto_https_mode 配置为 passthrough 来避免 frpc 对流量进行修改。

禁忌证

典中典不适用自动 HTTPS 功能的情况

  1. 如果您穿透的已经是 HTTPS 协议 了,就 不要开 这个功能
  2. 如果您穿透的 不是 Web 应用,比如 游戏联机 或者 远程桌面,就 不要开 这个功能
  3. 如果您不知道自己在干什么,或者不知道自己的服务需不需要 TLS,就 不要开 这个功能

如果穿透的 已经是 HTTPS 协议了,再打开这个功能会把流量变成 TLS 套 TLS,并且 frpc 在请求本地服务时会使用 明文 HTTP 协议。

但是此时本地服务需要的显然是 HTTPS 协议,用明文 HTTP 去连接就 不能用,而且会 报错

  • Nginx 会报 400 Bad Request,错误信息为 The plain HTTP request was sent to HTTPS port
  • Apache 会报 Bad Request,错误信息为 Your browser sent a request that this server could not understand
    错误原因为 You're speaking plain HTTP to an SSL-enabled server port

如果看到上述错误,请关掉自动 HTTPS 功能然后重启 frpc,然后大概就可以用了。

配置方法

打开这个功能很简单,只要开一个开关就可以了,剩下的 frpc 都会自动处理:

  1. 编辑隧道并在 自动 HTTPS 处选择 自动

  2. 重启 frpc

  3. 使用 https://连接方式 的形式访问您穿透的服务即可

  4. (可选) 如果您想避免证书错误提示,请 配置 SSL 证书

进阶配置

主开关 auto_https 取值如下:

auto_https说明
留空
[默认值]
禁用自动 HTTPS 功能
autofrpc 将使用 server_name 作为证书 Common Name (CN) 生成自签证书
其他值frpc 将尝试加载 工作目录 下的 <auto_https>.crt<auto_https>.key 两个证书文件
- 若加载成功,<auto_https> 就作为一个单纯的文件名进行处理,不会对证书产生影响
- 若文件不存在或解析失败则使用 <auto_https> 作为 CN 生成一份自签名证书并保存到上述文件中

考虑到部分用户穿透的可能不是 Web 应用,frpc 默认会在启动时发送 HEAD /\r\n\r\n 并检查回包的头 4 个字节来决定工作模式。如果是 HTTP 就采用 http 模式,否则采用 passthrough 模式。

当然,自动检测并非完美,因此自 v0.42.0-sakura-2.1 起您可以通过 auto_https_mode 开关强制覆写工作模式:

auto_https_mode说明
留空
[默认值]
自动探测是否为 HTTP 服务并选择恰当的工作模式
http使用 HTTP 服务器进行反代并在发给本地服务的请求中追加 X-Forwarded-For 请求头
passthrough直通模式,单纯的在 TCP 流外面套上一层 TLS,不对数据包进行其他修改操作

提示

下面的请求修改功能仅当工作在 http 模式时可用,如果您在使用 直通模式,配置下面的参数将没有任何效果。

对于特定应用需要修改请求中的 Host 的情况,您可以在高级设置中使用下面的配置来修改请求:

plugin_host_header_rewrite = <指定 Host,如 www.natfrp.com>

对于特定应用或情况需要修改请求中 Header 的,您可以使用下面的配置来修改请求:

plugin_header_<头部名> = <值>

; 例如,您可以使用下面的配置来替换请求中的 Cookie
plugin_header_cookie = "logged_in=yes;"
; 或者为所有用户都返回移动端页面
plugin_header_user-agent = "Mozilla/5.0 (Linux; Android 13; Pixel 6 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36"