Springboot:基于某个标志初始化EmbeddedServletContainerFactory

时间:2017-08-22 09:38:34

标签: java spring ssl spring-boot jvm-arguments

我想在spring启动应用程序中实现SSL,其中,我还想加密(为了测试目的,我将其编码为base 64)密钥到密钥库,我将其作为JVM参数传递给spring启动应用程序。

密码库的密码稍后将以下面的方式用于解密(现在用于base 64解码)并动态形成EmbeddedServletContainerFactory。

@Bean
public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
    tomcatFactory.setSsl(createSsl());
    tomcatFactory.setPort(sslConfig.getHttpsPort());
    return tomcatFactory;
}
private Ssl createSsl() {
    Ssl ssl = new Ssl();
    try {
        ssl.setKeyStore("/path/to/keystore.pkcs12");
        ssl.setKeyStorePassword(new String(Base64.getDecoder().decode(sslConfig.getKeyPassword())));
        ssl.setKeyAlias(sslConfig.getKeyAlias());
    } catch (Exception e) {
        logger.error(e.getMessage());
    }
    return ssl;
}

JVM参数:

-Dtls.keyAlias=tomcat
-Dtls.key-store-password=cGFzc3dvcmQ=

POJO存储从JVM参数获取的别名和密码:

@Component
public class SSLConfig {

@Value("#{systemProperties['tls.keyAlias']}")
public String keyAlias;

@Value("#{systemProperties['tls.key-store-password']}")
private String keyPassword;

....getters n setters
}

以上配置工作正常。

现在,我希望基于一些标志来实现这一点,这些标志将通过JVM参数传递说明" isSSLEnabled",设置控件应该通过上面的逻辑,否则它应该以默认方式工作。

有人可以指导吗?

1 个答案:

答案 0 :(得分:4)

您可以使用Spring Boot的ConditionalOnProperty注释使servletContainer() bean以isSSLEnabled属性/ JVM参数的值为条件。

例如:

@Bean
@ConditionalOnProperty(name = "isSSLEnabled", havingValue = "true")
public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
    tomcatFactory.setSsl(createSsl());
    tomcatFactory.setPort(sslConfig.getHttpsPort());
    return tomcatFactory;
}

private Ssl createSsl() {
    Ssl ssl = new Ssl();
    try {
        ssl.setKeyStore("/path/to/keystore.pkcs12");
        ssl.setKeyStorePassword(new String(Base64.getDecoder().decode(sslConfig.getKeyPassword())));
        ssl.setKeyAlias(sslConfig.getKeyAlias());
    } catch (Exception e) {
        logger.error(e.getMessage());
    }
    return ssl;
}