java – Spring Boot – 密码存储密码在Code中设置

Spring Boot版本:1.5.4.RELEASE

我目前在使用Spring Boot应用程序的代码中设置server.ssl.key-store-password时遇到问题.我们将密码存储在保险库中,之前我通过-D属性传递它.然而,这对我们来说不是一个理想的解决方案.

解决方案似乎很简单,下面就是我所做的:

@Bean
public ServletContextInitializer initializer() {
    final String keyStorePassword;
    // ... Get Password
    return servletContext -> servletContext.setInitParameter("server.ssl.key-store-password", keyStorePassword);
}

根据Spring Boot Documentation,这应该没问题,因为ServletConfig是在application.properties之前加载的.

不幸的是,Tomcat拒绝以这种方式设置server.ssl.key-store-password.从我所看到的,AbstractNestablePropertyAccessor构造一个org.springframework.boot.context.embedded.Ssl对象,该对象被提供给Tomcat,并用于构造密钥库.这是在SpringApplication.run()期间完成的,这显然是在构建ServletConfig bean之前.

因此,似乎我需要“刷新”上下文(根据我的理解是破坏/重新创建它),或者找到另一种方法.我可以使用以下内容设置属性:

public static void main(String[] args) {
    String keyStorePassword = getKeystorePassword();
    HashMap<String, Object> props = new HashMap<>();
    props.put("server.ssl.key-store-password", keyStorePassword);
    new SpringApplicationBuilder()
            .sources(TesterApplication.class)
            .properties(props)
            .run(args);
}

但这有其自身的问题.我想在我的application.yml中存储保险箱密码的’标签’,但如果我这样做,那么在Spring启动之前我无法访问该标签(无需手动解析application.yml,这构成它有自己的多个配置文件的问题).

有没有其他人遇到过这个问题的解决方案?也许我的做法是错误的,并且有一种更简单的做事方式.

解决方法:

对,弄清楚了.是在错误的轨道上.我应该做的是以下内容:

@Component
public class KeystoreInit {

    private final Environment environment;

    @Autowired
    public KeystoreInit(Environment environment) {
        this.environment = environment;
    }

    @Bean
    public ServerProperties serverProperties() {
        final ServerProperties serverProperties = new ServerProperties();
        final Ssl ssl = new Ssl();
        final String keystorePassword = getKeystorePassword();
        ssl.setKeyPassword(keystorePassword);
        System.setProperty("server.ssl.key-store-password", keystorePassword);
        serverProperties.setSsl(ssl);
        return serverProperties;
    }

    private String getKeystorePassword() {
        // ...
    }

}

这里的想法是我们正在创建初始ServerProperties bean.然后加载此bean而不是新的ServerProperties,因此我们已经在那里设置了具有密钥库密码的Ssl.由于我们没有在application.yml中设置server.ssl.key-store-password,因此不会覆盖它.

我们@Autowire环境,以便我们可以访问server.ssl.key-store-label属性(我之前创建过),使用它来加载我们实际的server.ssl.key-store-password属性,然后设置通过系统属性,以便可以在应用程序的其他位置访问它.

上一篇:Android:使用Eclipse和受密码保护的密钥库在设备上调试应用程序?


下一篇:android – 分享debug.keystore