【问题标题】:Using Azure KeyVault for database password in Spring Boot application在 Spring Boot 应用程序中使用 Azure KeyVault 获取数据库密码
【发布时间】:2020-02-05 12:14:12
【问题描述】:

我正在开发一个应该部署到 Azure 的 Spring Boot 应用程序。 使用以下依赖项,我设法将 KeyVault 中的机密用于敏感的应用程序属性:

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

通过设置 poperty azure.keyvault.uri=https://my-vault.vault.azure.net 并配置托管服务标识,我只需像这样从 KeyVault 注入秘密名称:

@Value("${ServerPassphrase}")
String serverPassphrase;

现在我有一个数据库连接,密码具有常用密钥spring.datasource.password。不幸的是,Azure KeyVault 中的机密名称中不允许使用点。 :-(

是否有一种简单的方法可以将点替换为 KeyVault 中允许使用的字符的破折号,还是我必须编写自定义属性解析器作为包装器?

【问题讨论】:

    标签: azure spring-boot configuration azure-keyvault


    【解决方案1】:

    毕竟,似乎没有简单的方法来告诉 Spring Boot 使用破折号而不是圆点。 我最终在我的 MainConfig 中编写了一个自定义 DataSource 以及一个自定义 ServletWebServerFactory 来设置 tomcat 的所有 ssl 属性。 对于有人在这里结束的情况,寻找解决此问题或类似问题的方法,我将发布一些可能有帮助的代码 sn-ps。

    数据源代码(我使用点符号从应用程序属性中读取所有常见属性,仅从 KeyVault 读取用户名和密码):

    @Value("${db-user}")
    String dbUser;
    
    @Value("${db-password}")
    String dbPwd;
    
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource getDataSource() {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.username(dbUser);
        dataSourceBuilder.password(dbPwd);
        return dataSourceBuilder.build();
    }
    

    ServletWebServerFactory 的代码(所有使用的值都如上使用@Value-annotation 注入):

    @Bean
    public ServletWebServerFactory servletContainer() {
    
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        TomcatConnectorCustomizer tomcatConnectorCustomizer = connector -> {
            connector.setPort(port);
            connector.setScheme("https");
            connector.setSecure(true);
    
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
            protocol.setSSLEnabled(true);
            protocol.setKeystoreType(keyStoreType);
            protocol.setKeystoreProvider(keyStoreProvider);
            protocol.setKeystoreFile(keyStorePath);
            protocol.setKeystorePass(keyStorePassword);
            protocol.setKeyAlias(keyAlias);
            protocol.setTruststoreFile(trustStorePath);
            protocol.setTruststorePass(trustStorePassword);
            protocol.setSSLVerifyClient(clientAuth);
        };
    
        tomcat.addConnectorCustomizers(tomcatConnectorCustomizer);
        return tomcat;
    }
    

    在其他一些地方我不得不使用类似的东西,但由于这是专门针对我们的解决方案,我不会在这里发布。我想您可能会从发布的代码中了解如何解决此类问题。

    【讨论】:

      【解决方案2】:

      this tutorial,他们不需要属性文件的技巧,使用'-'作为'.'对于密钥库,API 似乎会自动将“-”替换为“。”。 测试并使用 azure-keyvault-secrets-spring-boot-starter 2.3.2 版


      在“Azure Key Vault Secrets Spring boot starter”的官方文档中 有一段关于this problem 您必须在属性文件中使用不兼容的属性。 但这对我不起作用

      spring.datasource.password=${spring-datasource-password}
      

      【讨论】:

        【解决方案3】:

        秘密名称只能包含字母数字字符和破折号。

        秘密名称只是一个名称,我们需要的是它的值。我使用的是破折号而不是圆点。

        @Value("${spring-datasource-password}")
        private String dataSourcePassword;
        

        更新:

        我想知道是否有一种简单的方法来告诉 spring 使用破折号 而不是点,因此不需要编写额外的代码。

        据我所知,没有这种方法。

        【讨论】:

        • 这个我已经试过了,但是好像spring boot的默认数据源配置无法读取这个属性。当然我可以使用自定义数据源,但我想避免这种情况。此外,这不是我要存储秘密的唯一属性,并且 springs 约定是使用点(例如:server.ssl.key-password),我想知道是否有一种简单的方法来告诉 spring 使用破折号而不是点,因此不需要编写额外的代码。
        • @Frank 据我所知,春天是没有这种办法的。
        • 哦,抱歉,完全忘记了这一点。我终于完成了我认为我可能会做的事情:编写一个自定义数据源和一个自定义 TomcatInitializer 来使用带有破折号的属性。
        • @Frank 既然你的问题已经解决了,你能接受它作为答案还是添加你更好的答案?那么这个issue就可以关闭了。谢谢。
        猜你喜欢
        • 2023-01-12
        • 2022-08-18
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 2021-11-17
        • 2018-02-27
        • 1970-01-01
        相关资源
        最近更新 更多