一、SpringBoot配置文件
通过配置文件来进行HTTPS配置是最常见的方式。SpringBoot提供了方便的配置方式,在application.properties或者application.yml中配置即可。
application.properties文件配置示例
server.port=8443 server.ssl.key-store-type=PKCS12 server.ssl.key-store=classpath:keys/keystore.p12 server.ssl.key-store-password=password server.ssl.key-alias=tomcat
application.yml文件配置示例
server: port: 8443 ssl: key-store-type: PKCS12 key-store: classpath:keys/keystore.p12 key-store-password: password key-alias: tomcat
在上面的示例中,我们指定了服务的端口为8443,选择了key-store-type为PKCS12格式,key-store指向classpath下的keystore.p12文件,key-store-password指定了密码,key-alias指定了证书的别名。
二、SpringBoot配置SSL
SpringBoot默认开启了SSL,如果需要关闭,可以在application.properties中设置server.ssl.enabled=false。
如果需要自定义SSL配置,可以通过编码实现。在SpringBoot2.0之前,可以通过配置ServerProperties来实现SSL的配置。
示例:
@Configuration public class SslConfig extends WebServerFactoryCustomizerConfigurableWebServerFactory> { @Override public void customize(WebServerFactory factory) { Ssl ssl = new Ssl(); // Server.jks中包含了https证书和私钥;keystore.password是证书密码 //,请确保修改为自己证书的密码 ssl.setKeyStore("classpath:server.jks"); ssl.setKeyStorePassword("keystore.password"); factory.setSsl(ssl); factory.setPort(8443); } }
在SpringBoot2.0中,使用SslStoreProvider来进行SSL的配置。
SslStoreProvider
@Component public class SslServerProvider implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>{ @Autowired private SslPropertiesConfig sslPropertiesConfig; @Override public void customize(ConfigurableServletWebServerFactory factory) { sslPropertiesConfig.getSsl().setSslProvider(SslProvider.OPENSSL); sslPropertiesConfig.getSsl().setKeyStore(new ClassPathResource("server.jks")); sslPropertiesConfig.getSsl().setKeyStorePassword("keystore.password"); factory.setSsl(sslPropertiesConfig.getSsl()); } }
三、SpringBoot配置类
通过配置类进行SSL的配置是比较灵活的方式。可以通过注入的方式对SSL具体参数进行配置。其中SSL的配置参数可以在SslConfiguration中进行配置。
示例:
@Configuration public class SslConfiguration { @Bean public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> webServerFactoryCustomizer() { return (factory) -> { Ssl ssl = getSsl(); ssl.setCiphers(Arrays.asList("TLS_RSA_WITH_AES_128_CBC_SHA256", "TLS_RSA_WITH_AES_128_CBC_SHA")); factory.setSsl(ssl); }; } public Ssl getSsl() { Ssl ssl = new Ssl(); ssl.setKeyStore("classpath:server.jks"); ssl.setKeyStorePassword("server-password"); ssl.setKeyAlias("server-key-alias"); return ssl; } }
四、SpringBoot配置中心
如果需要在更改参数的情况下动态刷新SSL的配置,可以使用Spring Cloud Config等工具,将SSL配置参数进行热更新。
五、SpringBoot配置顺序
对于SpringBoot来说,不同的配置方式有不同的优先级。按照优先级的顺序,配置顺序依次是:
- Embedded Servlet Container Customizer Bean
- 命令行参数
- JNDI属性
- ServletWebServerFactory配置的ContextParameters
- ServletContextInitializer Beans
- SpringApplicationBuilder的properties方法
- application.properties文件中的属性
- application.yml文件中的属性
六、SpringBoot配置原理
SpringBoot的SSL配置原理是通过在ServerProperties中封装了Ssl、SslStoreProvider等操作。同时,ServerProperties中也提供了一些默认的SSL配置。
七、SpringBoot常用配置
- HTTPS配置:server.ssl.key-store(key-store文件路径)、server.ssl.key-store-password(key-store密码)、server.ssl.key-alias(别名)等
- HTTP端口配置:server.port(端口号)
- Context Path配置:server.servlet.context-path(应用上下文的路径)
- 连接超时配置:server.connection-timeout(连接超时时间)
- 线程池配置:server.tomcat.max-threads(最大线程数)、server.tomcat.min-spare-threads(最小空闲线程数)等