春季启动 - 密钥存储密码的代码
春天引导版本设置: 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,它自己的问题与多个配置文件)。
有没有其他人遇到过这个问题的解决方案?也许我的做法是错误的,并且有一种更简单的做事方式。
对,想通了。走错了路。我应该做的是以下几点:
@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
。
我们@Autowire
的Environment
这样我们就可以访问了server.ssl.key-store-label
属性(我以前创建的),用它来装载我们的实际server.ssl.key-store-password
属性,然后设置通过系统性能,以便它可以在其他地方的应用程序访问。