Google免费证书有坑?证书异常导致FRP出现EOF错误的排查修复

Google免费证书有坑?证书异常导致FRP出现EOF错误的排查修复

起因

我一直使用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_filetls_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

或者还可以重新签发带有“客户端身份验证”功能的证书。困扰我数天的问题就此解决。

本文永久链接:https://blog.xmgspace.me/archives/frp-eof-due-to-google-certificate.html
本文文章标题:Google免费证书有坑?证书异常导致FRP出现EOF错误的排查修复
如无特殊说明,只要您标明转载自Xiaomage's Blog,您就可以自由转载本文。禁止CSDN/采集站采集转载。
授权协议:署名-非商业性使用-相同方式共享 4.0(CC BY-NC-SA 4.0)
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇