一、单一模式
如果你希望只有安全的https 通道而没有http 通道的话,那么这非常容易实现:server.port = 8443
server.ssl.key-store = classpath:tomcat.keystore
server.ssl.key-store-password = password
server.ssl.key-password = password2
不要将密码放到仓库中,要使用“${}”符号来导入环境变量。
二、双通道模式
如果你想要在应用中同时使用http 和https 通道的话,那么需要在应用中增加如下的配置:@Configuration
public class SslConfig {
@Bean
public EmbeddedServletContainerFactory servletContainer() throws IOException {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.addAdditionalTomcatConnectors(createSslConnector());
return tomcat;
}
private Connector createSslConnector() throws IOException {
Connector connector = new Connector(Http11NioProtocol.class.getName());
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
connector.setPort(8443);
connector.setSecure(true);
connector.setScheme("https");
protocol.setSSLEnabled(true);
protocol.setKeyAlias("masterspringmvc");
protocol.setKeystorePass("password");
protocol.setKeyPass("password2");
protocol.setKeystoreFile(new ClassPathResource("tomcat.keystore").getFile().getAbsolutePath());
protocol.setSslProtocol("TLS");
return connector;
}
}
这样的话,除了8080 端口以外,还会加载前文生成的keystore 并在8443 创建另外一个通道。
我们可以通过如下的配置,使用Spring Security 自动将连接从http 重定向到https:@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
/* rest of the configuration */
http.requiresChannel().anyRequest().requiresSecure().and();
}
}