[beego]BConfig是否可以添加一个配置,来实现当客户端提供证书时则验证证书,不提供则不验证

2023-12-18 866 views
6

BConfig是否可以添加一个配置,来实现如下场景:

当客户端提供证书时则验证证书;否则不验证证书

当前只要配置了 BConfig.Listen.EnableMutualHTTPS,就一定要客户端提供证书: https://github.com/astaxie/beego/blob/7a48fbb69846515d9dc3627096590f2b7b2a1bca/app.go#L200 而如果不配置 BConfig.Listen.EnableMutualHTTPS,那么服务端就获取不到客户端的证书,因此无法在代码中验证证书有效性了

是否存在其他配置或者办法,来满足我的需求?

回答

9
4034 这个问题里面我们讨论了关闭ssl双向验证的问题,你看看是否能够解决你的问题?
0

emmmm,不太行。我当前的需求是这样的哈:

服务端提供https服务, 1- 当客户端提供了证书时,服务端验证证书,beego将证书信息设置到beego.Controller对象的Ctx.Request.TLS.PerrCertificates中,在代码里可以获取到证书信息; 2- 当客户端未提供证书时,beego也能使其通过,走到controller中

然后目前的问题是:

产生这种现象的根本原因就是,一旦开启了 BConfig.Listen.EnableMutualHTTPS = true,此时 beego 代码中,写死了对客户端证书的要求,https://github.com/astaxie/beego/blob/7a48fbb69846515d9dc3627096590f2b7b2a1bca/app.go#L200 如果能多提供一个 BConfig.Listen 的配置项,指定 ClientAuth 字段值,就可以完成上面的需求

1

其实“当客户端提供证书时则验证证书;否则不验证证书” 是一个比较奇怪的场景。如果我们出于安全考虑,那么应该是要求客户端都提供证书;既然允许一部分客户端不验证证书,那么就说明,其实完全可以全部客户端都不验证证书。

我其实没太理解,这个场景会用于解决什么问题。

4

是这样的,我们现在的服务端只会开一个https端口,提供两类API,一类是无需客户端提供证书就能访问的API;另一类API安全要求比较高,必须客户端提供证书才能访问,这个证书不仅是通过beego的校验,还需要进行我们自己业务代码的解析和校验(如检查证书的组织、CN、SAN等值)

所以就有了“当客户端提供证书时则验证证书;否则不验证证书”的情况 : -)

此时期望如果客户端没提供证书,beego也能让其进入controller;如果提供了证书,beego初步验证下证书后,将证书信息设置到 Ctx.Request.TLS.PerrCertificates 中。之后在业务代码里,会解析 Ctx.Request.TLS.PerrCertificates ,验证一下证书内容是否合规

7

为什么没有考虑使用 gateway 隔离需要验证与不需要验证的接口?

底层服务只提供基础功能,gateway 提供安全验证的方式?

3

公司内部用的,是个挺小的单体服务