一、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 WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
@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
(最小空闲线程数)等