起因
我一直使用FRP进行内网穿透服务,把内网的资源安全的穿透到外网去,本站的Smokeping就是搭建在没有公网的内网树莓派上,通过FRP穿透到外网提供访问的,除了本地校园网爆炸导致的不稳定,其他都还好。
FRP要开启TLS的需要SSL证书,可以使用一张有效的由证书签发机构签发的证书,也可以使用OPENSSL自签发证书,客户端和服务端使用相同的自签名CA和自签名证书即可。本站开启了HTTPS访问,自然就有由证书签发机构签发的有效证书,便直接把证书从服务器上的acme.sh里面拿过来用,一直工作正常。
Google Cloud 在今年三月份左右推出了一个通过 Automatic Certificate Management Environment(ACME)实现的自动化证书管理服务,目前正在公测,需要申请,登录Google账号填写一个表单很快就可以通过申请;支持通配符(野卡)证书,目前是免费的,也无需绑定信用卡;有国内的OSCP服务器,国内访客体验良好。看到这个消息我想都没想就提交了申请,这么牛的证书当然要拥有它啦!下次证书更新就用它了。
错误出现
最近本站上一张由ZeroSSL签发的通配符证书即将过期,ZeroSSL的OCSP服务器到国内比较拉跨,很自然的本站就切换到了Google提供的免费通配符证书上;FRP等应用的证书也一并更新。参照了下面的几篇文章,证书成功申请下来啦:
使用acme.sh和acme-dns申请Google免费泛域名SSL证书 | kn007的个人博客
使用 acme.sh 申请 Google 公共证书 - ATP BLOG
重启FRP 然后...FRP就Boom咯,症状如图所示:
客户端(树莓派)报错:[service.go:128] login to server failed: EOF
服务端则没有任何异常输出,frps started successfully
双端关于TLS的配置文件则从来没有修改过,仿照官方配置文件写的:
tls_enable = true
tls_trusted_ca_file = /xxx/server.ca.pem
tls_cert_file = /xxx/server.cert.pem
tls_key_file = /xxx/server.key.pem
从FRP的官方issue中搜索EOF,大都是公司网络审查导致的网络不稳定,抑或是配置文件编写出现错误。之前都可以稳定运行,也没有修改配置文件,只是更新了证书,那么问题一定出现在证书上。
问题排查
一开始认为可能是证书链不全导致的问题,因为一些同样使用GTS Root R1根证书的网站是四级证书,我申请的证书只有三级,如下图所示。四级证书中的根证书是GlobalSign签发的,要多一级。
然而经过更细致的比对,根证书为GlobalSign,二级证书为GTS Root R1和根证书为GTS Root R1的两张证书中,GTS Root R1
这张证书并不同,从时间就可以看出来。另外通过MySSL等工具进行检查后,我发现我的证书链是完整的;使用的也是acme.sh生成的fullchain.crt
,理论上证书链是也完整的。证书链没有问题。
后来在服务端开启Frp日志的调试模式,终于在日志中露出了更多端倪,如下图所示:
Accept new mux stream error: tls: failed to verify client certificate: x509: certificate specifies an incompatible key usage
有了报错信息,问题排查就简单多了。一条结果映入我的眼帘:
难道是Google签发的证书少了功能吗?跟原来我的证书比对一下呢?
果然,一切都豁然开朗。
SSL证书的密钥有很多用法;一般我们访问HTTPS网站时只需要用到它“服务器身份验证”的用法,验证服务器的身份,其他的用法则很少用到。Google在颁发证书时偷了个懒,没有加入其他的用法。而我的FRP配置文件中,不仅需要证书支持“服务器身份验证”,还要支持“客户端身份验证”,即双向验证,证书不支持“客户端身份验证”,于是就会出现EOF的错误。
问题解决
找到问题的原因之后,问题的解决变得非常简单,关闭FRP的客户端身份验证,只需要让客户端验证服务器的身份即可建立TLS链接,尽管安全性会有所降低。注释掉服务端中tls_trusted_ca_file
一项,删去掉客户端tls_cert_file
和tls_key_file
即可关闭客户端验证,配置文件如下:
#服务端
tls_enable = true
tls_cert_file = /xxx/server.cert.pem
tls_key_file = /xxx/server.key.pem
#客户端
tls_enable = true
tls_trusted_ca_file = /xxx/server.ca.pem
或者还可以重新签发带有“客户端身份验证”功能的证书。困扰我数天的问题就此解决。
可以的话把树莓派跟路由器放一起;不能的话就去壳或换成塑壳;这也不能的话就用部旧手机在中途桥接,效果会好不少。
虽然信号只有两格,但是跑满带宽还是没有问题的,只有小幅抖动升高。旧手机桥接在中间又nat了一层,我觉得没有必要的。
树莓派有RJ45,为何还用WiFi呢?
因为路由器距离安放树莓派的地方很远,没法有线连接。WIFI的话,信号也不是很好,在铁壳之内只有两格。
9455阿根廷迈向世界在华中从来没收到过 不知道是不是发射功率低的问题!!!
补充一点上一条评论落下的。9455只有周二是华语广播,周三到周六是其他语种广播,周天和周一不发射。频率表里面落下了具体时间,已经补充上了(一开始有的,中间可能哪次修改给改没了...