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属性,然后设置通过系统属性,以便可以在应用程序的其他位置访问它.