zoukankan      html  css  js  c++  java
  • 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);

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

        

        

  • 相关阅读:
    TweenMax 前台脚本库
    如何使用CSS Sprites技术进行图片合并
    QQ群开放接口
    使用 Hexo 生成一套静态博客网页
    把表插入数据库
    WCF
    SOA
    登录验证
    登录菜单权限验证
    GetJsonByDataTable
  • 原文地址:https://www.cnblogs.com/nontracey/p/13684302.html
Copyright © 2011-2022 走看看