Frpc+Nginx将内网http流量穿透为外网的https ERR SSL PROTOCOL ERROR解决
用frpc将内网http流量转发为外网可访问的https ERR SSL PROTOCOL ERROR解决
试错过程简述
我搭建博客使用的是onepannel后台管理系统+halo来完成的。全程跟着官方手册和教学视频进行,然而为了安全,http流量需要转发为https公布到公网,起初一直在onepannel的Nginx上折腾ssl证书和反向代理,但是无论怎么配置都会导致代理后打不开网页,报错为:

此网站无法提供安全连接 ERR SSL PROTOCOL ERROR。这个报错导致我一度认为是ssl证书的问题。浪费了我很多时间。
然而无论直到在onepannel的github issue发现了了类似的问题,才发现不能通过onepannel内置的Nginx服务来进行配置,而是要通过frpc内网穿透客户端的配置来解决问题。
域名申请与DNS解析,SSL申请
我申请了腾讯云的DNSPOD域名,因为要做内网穿透,所以要把域名解析到内网穿透服务商的地址上。
DNSPOD:记录值填写内网穿透服务商提供的服务器地址(如果自己的服务器有公网IP则写自己的公网ip即可,本文主要针对的是没有公网IP的自建服务器)。
点击SSL可以为域名申请SSL证书,这是进行https配置的前提条件,申请后将Nginx的ssl证书压缩包下载到个人服务器上并且解压备用。
onepannel配置(可选)
我的halo博客使用了本地的2085端口转发流量,但是我不想直接把这个端口暴露在公网上,所以我使用了halo的Nginx反向代理服务把2085的http流量转发到了本地的2086端口上,后续对2086端口的服务进行公网映射即可。
onepanel配置方法可以参考官方教程【1Panel功能演示视频】2. 网站管理_哔哩哔哩_bilibili
我生成的配置:
server {
listen 80 ;
listen 2086 ; #把来自2085的流量转发到127.0.0.1的2086端口上
server_name blog.starfall.love 127.0.0.1; #这里的网址其实是凑数的,ip地址写本地很重要。
index index.php index.html index.htm default.php default.htm default.html;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
access_log /www/sites/blog.starfall.love/log/access.log;
error_log /www/sites/blog.starfall.love/log/error.log;
access_by_lua_file /www/common/waf/access.lua;
set $RulePath /www/sites/blog.starfall.love/waf/rules;
set $logdir /www/sites/blog.starfall.love/log;
set $redirect on;
set $attackLog on;
set $CCDeny off;
set $urlWhiteAllow off;
set $urlBlockDeny off;
set $argsDeny off;
set $postDeny off;
set $cookieDeny off;
set $fileExtDeny off;
set $ipBlockDeny off;
set $ipWhiteAllow off;
location ~ /.well-known/acme-challenge {
allow all;
root /usr/share/nginx/html;
}
include /www/sites/blog.starfall.love/proxy/*.conf;
}
frpc转发
本文基于openFRP的香港线路,因为个人服务器难以通过大陆的备案,域名备案也很麻烦。首页 | OpenFrp管理面板
首先在首页 | OpenFrp管理面板开通两个香港线路,都对应这本地的2086端口(即放置halo博客的端口),两个线路分别穿透http和https流量。
下载openfrp的linux客户端,写一个frpc.ini文件,和下载的客户端放在一个目录中,frpc.ini的内容如下:
[common]
#这部分的配置需要根据自己开通的隧道在openfrp的配置面板获取
[http_blog]
type = http
local_ip = 127.0.0.1
local_port = 2086 #被转发到公网的http端口
custom_domains = blog.starfall.love
use_encryption = true #frp加密算法
use_compression = true #frp压缩算法
[https_blog] #将http转发为https
type = https
local_ip = 127.0.0.1
local_port = 2086
custom_domains = blog.starfall.love
plugin = https2http #FRP的http转https服务
plugin_local_addr = 127.0.0.1:2086
plugin_host_header_rewrite = 127.0.0.1
plugin_crt_path = /home/yxl/frp_server/blog/blog.starfall.love_bundle.pem
plugin_key_path = /home/yxl/frp_server/blog/blog.starfall.love.key #上面下载的Nginx证书文件里面解压出来的pem和key文件的路径
plugin_header_X-From_Where = frp
use_encryption = true
随后启动frpc
./frpc_linux_amd64
看到隧道启动成功即可链接https://blog.starfall.love/
frpc强制跳转https
也很简单,在https的设置里加一句即可
force_https = true
全https配置:
[https]
type = https
local_ip = 127.0.0.1
local_port = 2086
custom_domains = blog.starfall.love
plugin = https2http
plugin_local_addr = 127.0.0.1:2086
plugin_host_header_rewrite = 127.0.0.1
plugin_crt_path = /home/yxl/frp_server/blog/blog.starfall.love_bundle.pem
plugin_key_path = /home/yxl/frp_server/blog/blog.starfall.love.key
plugin_header_X-From_Where = frp
use_encryption = true
force_https = true
如果这么配置的话,把http隧道删了也不会影响访问。所以总结来说,如果服务器没有公网ip,最好直接用frpc发布https的网站,同样可以正常使用证书来进行加密。如果没有证书,启用auto_tlspx也可以打开https加密。
将网站加入baidu和google收录
首先在腾讯云dnspod打开搜索优化:点击域名名称-高级选项-搜索优化
百度和谷歌申请教程:
Hexo 博客提交百度、谷歌搜索引擎收录 - 知乎 (zhihu.com)
html标签注入位置:
还想要更多代码?不知道怎么搭建?想让别人帮忙生信分析?欢迎来我的闲鱼咨询!价格绝对全网最低