java使用Spring api和托管服务标识获取密钥库机密
由于一些新的安全要求,我现在开发的api需要将几个URL、azure帐户名等存储在azure密钥库中,而不是应用程序中。yml配置文件
问题是,我在本地环境中验证/访问密钥保管库客户端时遇到问题。我对azure函数/密钥库本身的访问非常有限,因此目前几乎不可能测试我正在编写的新代码:
public String getSecretFromKeyVault(String key) {
/**
* Breaks in the constructor call, as the system.env variables for MSI_ENDPOINT and MSI_SECRET are null.
**/
AppServiceMSICredentials credentials = new AppServiceMSICredentials(AzureEnvironment.AZURE);
KeyVaultClient client = new KeyVaultClient(credentials);
SecretBundle secret = client.getSecret("url-for-key-vault", key);
return secret.value();
}
我知道这些变量将在云服务器中设置,但我的问题是我如何才能最好地验证vault调用是否已正确执行(单元、集成、e2e本地测试),以及我如何在本地开发/运行时使用关键的vault调用
MSI的替代方法是在对active directory进行身份验证后手动输入客户端id和密钥。这可能是本地开发的解决方案,但仍需要在源代码中声明机密信息
在运行服务器之前,我还尝试使用az login
登录azure,但也没有成功
有没有人对我如何解决这个问题有什么建议,或者我的最佳选择是什么
申请须知:
- Java版本:8
- 弹簧靴
- Azure/vsts开发和部署环境
# 1 楼答案
由于您使用的是spring boot,因此最好使用Microsoft的属性源实现,该实现将keyvault属性映射到spring属性,并且对于本地开发和测试,您可以在属性文件中设置等效属性
使用弹簧轮廓。假设您有
azure
和local
配置文件。在application-azure.yml
文件中,配置应用程序以使用keyvault:现在,您可以将spring上下文中的秘密属性注入到变量中,这些属性将从keyvault中读取:
为了在本地进行测试,可以在
application-local.yml
文件中将secret属性设置为适当的值:需要添加到
build.gradle
的Azure依赖项是:部署时以
azure
作为活动配置文件运行spring boot jar,在azure之外测试和开发时以local
作为活动配置文件运行spring boot jar。这是通过azure java容器测试和使用的