天天看点

聊一聊.NET Core结合Nacos实现配置加解密

当我们把应用的配置都放到配置中心后,很多人会想到这样一个问题,配置里面有敏感的信息要怎么处理呢?

信息既然敏感的话,那么加个密就好了嘛,相信大部分人的第一感觉都是这个,确实这个是最简单也是最合适的方法。

其实很多人都在关注这个问题,好比说,数据库的连接字符串,调用第三方的密钥等等这些信息,都是不太想让很多人知道的。

那么如果我们把配置放在 Nacos 了,我们可以怎么操作呢?

想了想不外乎这么几种:

全部服务端搞定,客户端只管取;

全部客户端搞定,服务端只管存;

客户端为主,服务端为辅,服务端存一些加解密需要的辅助信息即可。

有一个老哥已经在 issue 里面提出了相关的落地方案,也包含了部分实现。

https://github.com/alibaba/nacos/issues/5367

简要概述的话就是,开个口子,用户可以在客户端拓展任意加解密方式,同时服务端可以辅助这一操作。

不过看了 2.0.2 的代码,服务端这一块的“辅助”还未完成,不过对客户端来说,这一块其实问题已经不大了。

6月14号发布的 <code>nacos-sdk-csharp</code> 1.1.0 版本已经支持了这一功能

下面就用 .NET 5 和 Nacos 2.0.2 为例,来简单说明一下。

sdk 里面在进行配置相关读写操作的时候,会有一个 <code>DoFilter</code> 的操作。这个操作就是我们的切入点。

既然要执行 Filter , 那么执行的 Filter 从那里来呢? 答案是 <code>IConfigFilter</code> 。

sdk 里面提供了 <code>IConfigFilter</code> 这个接口,但是不提供实现,具体实现交由用户自定义,毕竟 100 个人就有 100 种不一样的实现。

下面看看它的定义。

<code>Init</code> 方法就是对这个 ConfigFilter 进行一些初始化操作,好比说从 Options 里面拿一些额外的信息。

<code>GetOrder</code> 和 <code>GetFilterName</code> 属于辅助信息,指定这个 ConfigFilter 的执行顺序(越小越先执行)和名称。

<code>DoFilter</code> 就是核心了,它可以变更 request 和 response ,这两个对象内部都会维护一个包含配置信息的 Dictionary。

换言之,只要我们定义一个 ConfigFilter,实现了这个接口,那么配置想怎么操作都可以了,加解密就是小问题了。

其中 NacosSdkOptions 里面加了两个配置项,是专门给这个功能用的 <code>ConfigFilterAssemblies</code> 和 <code>ConfigFilterExtInfo</code>

<code>ConfigFilterAssemblies</code> 是自定义 ConfigFilter 所在的程序集的名字,这里是一个字符串列表类型的参数,sdk 会根据这个名字去找到对应的实现,然后初始化好。

<code>ConfigFilterExtInfo</code> 是实现 ConfigFilter 是需要用到的扩展信息,这里是一个字符串类型的参数,扩展信息复杂的可以考虑传入一个 JSON 字符串。

下面来看个具体的例子吧。

这个 Filter 实现的效果是把部分敏感配置项进行加密,敏感的配置项需要在配置文件中指定。

先是 <code>Init</code> 方法:

然后是 <code>DoFilter</code> 方法:

这个方法里面要注意几点:

request 只有请求的时候才会有值,其他时候都是 null 值。

response 只有响应的时候才会有值,其他时候都是 null 值。

操作完之后,一定要调用 PutParameter 方法进行覆盖才会生效。

这里涉及 <code>encryptedDataKey</code> 的相关操作都只是预留操作,现阶段可以不用理会。

还有一个 <code>ReplaceJsonNode</code> 方法就是替换敏感配置的具体操作了。

到这里,自定义的 ConfigFilter 已经完成了,下面就是真正的应用了。

老样子,建一个 WebApi 项目,添加自定义 ConfigFilter 所在的包/项目/程序集。

这里用的是集成 ASP.NET Core 的例子。

修改 <code>appsettings.json</code>

注:老黄这里把 Optional 设置成 true,是为了第一次运行的时候,如果服务端没有进行配置而不至于退出程序。

修改 <code>Program.cs</code>

最后是 <code>Startup.cs</code>

最后来看看几张效果图:

首先是程序的运行日志。

聊一聊.NET Core结合Nacos实现配置加解密

其次是和 Nacos 控制台的对比。

聊一聊.NET Core结合Nacos实现配置加解密

到这里的话,基于 Nacos 的加解密就完成了。

敏感配置项的加解密还是很有必要的,配置中心负责存储,客户端负责加解密,这样的方式可以让用户更加灵活的选择自己想要的加解密方法。

本文的示例代码已经上传到 Github,仅供参考。

https://github.com/catcherwong-archive/2021/tree/main/NacosConfigWithEncryption

最后的最后,希望感兴趣的大佬可以一起参与到这个项目来。

nacos-sdk-csharp 的地址 :https://github.com/nacos-group/nacos-sdk-csharp

聊一聊.NET Core结合Nacos实现配置加解密

如果您认为这篇文章还不错或者有所收获,可以点击右下角的【推荐】按钮,因为你的支持是我继续写作,分享的最大动力!

作者:Catcher Wong ( 黄文清 )

来源:http://catcher1994.cnblogs.com/

声明:

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果您发现博客中出现了错误,或者有更好的建议、想法,请及时与我联系!!如果想找我私下交流,可以私信或者加我微信。

继续阅读