2017-07-07 61 views
0

春天引导版本设置: 1.5.4.RELEASE春季启动 - 密钥存储密码的代码

我目前有我的春天启动应用程序的代码中设置我的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构造了一个供给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中存储保险库密码的'label',但如果我这样做了,那么在Spring启动之前我无法访问该标签(无需手动解析application.yml,它自己的问题与多个配置文件)。

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

回答

0

对,想通了。走错了路。我应该做的是以下几点:

@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而不是新的ServerProperties,所以我们的密码库密码Ssl已经在那里设置了。这不会被覆盖,因为我们没有在我们的application.yml中设置server.ssl.key-store-password

我们@AutowireEnvironment这样我们就可以访问了server.ssl.key-store-label属性(我以前创建的),用它来装载我们的实际server.ssl.key-store-password属性,然后设置通过系统性能,以便它可以在其他地方的应用程序访问。