在ASP.Net Core和Java中配置密钥

大家好,我是本期的微软MVP实验室研究员——张安忠。今天我将通过实验和完整的操作过程,向大家介绍如何使用在ASP.NET Core和Java项目中集成Azure Key Vault功能。

微软MVP实验室研究员

在ASP.Net Core和Java中配置密钥

思路浅析

在软件开发中,项目安全是重中之重,特别是在多部门或者开源项目中,如何保存我们的密钥,但又不影响本地的开发,是我们开发者需要考虑的问题。这里简单的列举了下平时开发中我们做的方案:

  • 本地直接采用localhost的形式开发。无论是DB还是ES/Redis/MQ,或者是其他的,都一股脑用本地的参数,然后部署到K8s的时候,使用Configmap的形式挂载。也是一种方案,但是会使dev和prod之间隔离的比较厉害

  • 使用远程配置中心来统一处理本地和生产直接的数据。比如常见的就是Apollo,Azure的Key Vault技术等等。推荐的方式

  • 每次上线都手动修改。这显然是不合理

PS:本文采用的都是世纪互联的azure.cn的。

前期准备账号

首先,需要注册一个Azure账号。

其次,需要注册一个应用程序,注册的时候,填写Client密码,密码要好好保存哟,以后会多次使用。

搜索app registration,注册一个账号:

在ASP.Net Core和Java中配置密钥

输入应用名称,其他的都默认即可:

在ASP.Net Core和Java中配置密钥

接下来,在Certificates & secrets中,添加Client secrets:

在ASP.Net Core和Java中配置密钥

有了应用,就可以在应用内设置密钥了。

这个时候我们已经有两个参数了,分别是ClientId和ClientSecret。

配置key vault

步骤 1 - 添加Key vault服务

继续在顶部搜索Key vault关键字:

在ASP.Net Core和Java中配置密钥


创建一个全新的key vault服务,选择自己的订阅和资源组,设置下名称:

在ASP.Net Core和Java中配置密钥

 创建完成后,就可以在key vault的overview页,看到另外两个参数了:

在ASP.Net Core和Java中配置密钥

另外两个参数,一个是vault的uri,一个是tenantid也准备好了。

到这里四个参数都已经准备好了。

步骤 2 - 参数设置

点击settings下面的secrets选项,创建或导入配置:

在ASP.Net Core和Java中配置密钥

在弹出的新页面中,选择Manual方式,输入name和value,配置数据库的用户名:

在ASP.Net Core和Java中配置密钥

然后就创建完成了,可以仿照的把sqlserver的密码也配置一下:

在ASP.Net Core和Java中配置密钥

步骤 3 - 访问策略设置

创建完成后,点击转到该资源进行配置访问策略,”Settings=》Access policies“,点击 ”Add Access Policy“ 创建新的访问策略。

首先选择配置模板 Configure from template(optional):"Secret Management"。

在ASP.Net Core和Java中配置密钥

 点击 “Nono select” 进行先选择服务主体,输入 “自己的服务账号名” ,如laozhang.keyvault.demo,进行选择,点击 “Select”,保存一下即可。

到这里Azure相关的配置已经完成,开始写代码吧。

新建一个Core项目

在ASP.Net Core和Java中配置密钥

步骤 1 - 创建一个ASP.Net Core5.0 API项目

过程很简单,就不多说了,创建好后,添加nuget包:


<PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.21" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.9" />

然后,将上边四个变量放到环境变量里,本地开发可以在launchSettings.json里:

 "IIS Express": {   "commandName": "IISExpress",   "launchBrowser": true,   "launchUrl": "swagger",   "environmentVariables": {     "ASPNETCORE_ENVIRONMENT": "Development",     "AZURE_TENANT_ID": "你的tenantid",     "AZURE_CLIENT_ID": "你的客户端id",     "AZURE_CLIENT_SECRET": "你的客户端密钥",     "AZURE_KEY_VAULT_URI": "https://blog-core-keyvault.vault.azure.cn/"   } }

步骤 2 - 配置Program,连接配置中心

在Program.cs里配置:


Host.CreateDefaultBuilder(args)
     .ConfigureAppConfiguration((hostingContext, config) =>
     {
         var env = hostingContext.HostingEnvironment;
         var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
         var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
         var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");
         config
          .AddJsonFile("appsettings.json", true)
          .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
          .AddEnvironmentVariables();

         string vaultUri = "https://blog-core-keyvault.vault.azure.cn/";
         config.AddAzureKeyVault(vaultUri, clientId, clientSecret);
     })
     .ConfigureWebHostDefaults(webBuilder =>
     {
         webBuilder.UseStartup<Startup>();
     });

如果这个时候,启动应用没有报错的话,那恭喜你,已经连接成功了,接下来就是获取指定的参数了。

步骤 3 - 任何地方获取Key Vault的值

这里使用方法就是和普通的appsettings.json里的一模一样了,注入configuration即可:

_configuration.GetValue<string>("MSSQL-USER-PASSWORD");

好啦,在ASP.NET Core应用中,连接Azure Key Vault已经说完了,看看Java如何操作吧。

新建一个Java项目

步骤 1 - 创建一个Sring Boot项目

过程也是很简单,可以用Idea创建,也可以使用官方的模板来创建,就不多说了,创建好后,添加pom包:​​​​​​​

<dependency>  <groupId>com.azure.spring</groupId>  <artifactId>azure-spring-boot-starter-keyvault-secrets</artifactId></dependency

然后,将上边四个变量放到配置文件里,​​​​​​​

azure.keyvault.enabled=trueazure.keyvault.uri=https://blog-core-keyvault.vault.azure.cn/azure.keyvault.client-id=你的应用idazure.keyvault.client-key=你的应用密钥azure.keyvault.tenant-id=你的tenantidazure.keyvault.authority-host=https://login.chinacloudapi.cn

注意最后一个配置很重要,需要指定host地址,因为默认的是Azure.com的,如果你是Azure.com的可以不用指定。

步骤 2 - 任何地方获取Key Vault的值

这里使用方法就是和普通的yml里的一模一样了,配置变量,打上@value注解即可:


@SpringBootApplication
public class KeyvaultApplication implements CommandLineRunner {

  @Value("${MSSQL-USER-NAME}")
  private String mySecretProperty;

  public static void main(String[] args) {
    SpringApplication.run(KeyvaultApplication.class, args);
  }

  @Override
  public void run(String... args) {
    System.out.println("property your-property-name value is: " + mySecretProperty);
  }
}

​​​​​​好啦,在Java应用中,连接Azure Key Vault也说完了,大家可以尝试动手联系一下哟。

总结

本文以ASP.NET Core和Java为例讲解了如何在Azure中连接Key Vault配置,整体流程简单方便,文档特别清晰,再一次为微软Docs文档而欢呼。

  • Source Link:

  • https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/spring/azure-spring-boot-starter-keyvault-secrets

  • https://devblogs.microsoft.com/dotnet/category/net-core/?WT.mc_id=DOP-MVP-5003704

  • Github:

  • https://github.com/anjoy8/Blog.Core/


微软最有价值专家(MVP)

在ASP.Net Core和Java中配置密钥

微软最有价值专家是微软公司授予第三方技术专业人士的一个全球奖项。28年来,世界各地的技术社区领导者,因其在线上和线下的技术社区中分享专业知识和经验而获得此奖项。

MVP是经过严格挑选的专家团队,他们代表着技术最精湛且最具智慧的人,是对社区投入极大的热情并乐于助人的专家。MVP致力于通过演讲、论坛问答、创建网站、撰写博客、分享视频、开源项目、组织会议等方式来帮助他人,并最大程度地帮助微软技术社区用户使用Microsoft技术。
更多详情请登录官方网站:
https://mvp.microsoft.com/zh-cn

上一篇:Linux 命令之 Bang(!) 命令


下一篇:PHP语言标记风格类型