NetCore3.1使用nacos访问阿里云ACM配置中心中KVM加密后的配置

背景

    网上存在相关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; }
    }
KVMData

     现在我们已经实现了主要的解码操作,下面开始对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);

   现在可以在项目中愉快的使用了~  本篇完。

    

    

原文地址:https://www.cnblogs.com/nontracey/p/13684302.html