背景
网上存在相关nacos访问不加密的配置但是没有访问加密后的配置,故增加一篇文章讲述相关信息
环境
- net core 3.1
- nacos-sdk-csharp-unofficial.Extensions.Configuration 0.5.0稳定版
思路分析
由于源码中并没有相关KVM解码代码 故需要修改源码。
源码下载传送门
下载解压打开后能看见如图所示的代码结构
在动手修改源码之前首先我们要清楚我们需要做什么,翻阅官方文档可以得知获取解密内容通过http访问阿里提供的api即可。
所以我们的思路就有了:在获取配置之后调用阿里云的解密api然后返回。
源码修改
思路有了接下来开始修改源码。
首先明确我们的目标是为了获取配置,所以明确我们要引用的项目为Nacos.Microsoft.Extensions.Configuration
查看这个项目的引用可以得知,我们需要修改的源码为Nacos
为了尽量不影响原有项目内容,我们在Nacos项目中新建一个文件夹(也可以自己加个类库,本例子中不再进行再度优化) 如下图所示:
在KMS文件夹下新增一个类KMSService(也可以叫其他的 whatever 这不是重点,哈哈)
新增一个方法 名为Decrypt
/// <summary> /// 解密 /// </summary> /// <param name="text">待解密字符串</param> /// <returns> 返回解密字符串 </returns> public string Decrypt(string text) { if (string.IsNullOrEmpty(text)) { return ""; } Dictionary<string, string> parameters = new Dictionary<string, string>(); parameters.Add("Action", "Decrypt"); parameters.Add("Format", "JSON"); parameters.Add("Version", "2020-09-17"); parameters.Add("AccessKeyId", "填入你的AccessKey"); parameters.Add("SignatureMethod", "HMAC-SHA1"); parameters.Add("Timestamp", DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")); parameters.Add("SignatureVersion", "1.0"); parameters.Add("CiphertextBlob", text); parameters.Add("RegionId", "cn-shanghai");//此处填自己的区域id parameters.Add("SignatureNonce", Guid.NewGuid().ToString()); var stringToSign = ReSortSign(parameters);//参数排序 var signature = CreateSign(stringToSign, "此处填写SecretKey" + "&");//生成签名 parameters.Add("Signature", signature); var quseryString = QuseryStringEncode(parameters); var url = "https://kms.cn-shanghai.aliyuncs.com/?" + quseryString; HttpClient client = new HttpClient(); client.Timeout = TimeSpan.FromSeconds(3); var value = client.GetStringAsync(url).Result; var jObject = JsonConvert.DeserializeObject<KVMData>(value); return jObject.Plaintext; }
现在我们有了主要的解码代码下面我们补足上面缺失的方法
ReSortSign,QuseryStringEncode 和CreateSign 方法由于涉及公司公共库代码 基于保密原因不能公开 这里只分享思路
ReSortSign方法作用是对参数进行排序从而方便生成签名
CreateSign方法即为阿里生成签名公共参数方法 规则详见官方文档
QuseryStringEncode 方法为对参数进行拼接 并utf8编码
新增返回对象类
public class KVMData { public string KeyId { get; set; } public string KeyVersionId { get; set; } public string Plaintext { get; set; } public string RequestId { get; set; } }
现在我们已经实现了主要的解码操作,下面开始对Nacos进行集成
找到AbstNacosConfigClient.cs
对方法DoGetConfigAsync 进行修改
注:
- 本例中对NacosOptions进行了扩充 增加了从配置文件中获取是否启用KMS解密的配置项IsKMS
- 并且KMS服务以注入的形式 注入使用 core的注入方式教程有很多 不进行多余赘述
到此 源码所需修改部分已经修改完毕。
项目使用
项目中集成和网上教程一样
首先进行如图所示的修改
其次在appsettings.json中增加配置项
"NacosConfig": { "Optional": true, "DataId": "testConfig", "Group": "DEFAULT_GROUP", "Tenant": "输入自己的", "AccessKey": "输入自己的", "SecretKey": "输入自己的", "EndPoint": "acm.aliyun.com" }
最后在Startup中将配置注入到实体类中
services.Configure<AppSettings>(Configuration);
现在可以在项目中愉快的使用了~ 本篇完。