准备证书
- 可以去某云服务厂商申请一个免费的。
- 可以利用Java自带的JDK管理工具keytool生成一个免费的https证书。
# 进入到%JAVA_HOME%\bin目录,执行命令生成证书
keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore tomcathttps.keystore -validity 365
- genkey 表示要创建一个新的密钥。
- alias 表示 keystore 的别名。
- keyalg 表示使用的加密算法是 RSA ,一种非对称加密算法。
- keysize 表示密钥的长度。
- keystore 表示生成的密钥存放位置。
-
validity 表示密钥的有效时间,单位为天。
引入https
将生成的证书拷贝到项目的resources目录下,在application.properties中进行配置
server.ssl.key-store=classpath:tomcathttps.keystore
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=jichengda
- key-store 表示密钥文件名
- key-alias 表示密钥别名
- key-store-password 密钥库口令
启动项目,此时如果用http协议访问会提醒
Bad Request
This combination of host and port requires TLS.
请求转发
由于Spring Boot不支持同时启动http和https,通过配置请求转发解决这个问题,当用户发送http协议请求时转发到https上。
@Configuration
public class TomcatConfig {
@Bean
TomcatServletWebServerFactory tomcatServletWebServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
factory.addAdditionalTomcatConnectors(createTomcatConnector());
return factory;
}
private Connector createTomcatConnector() {
Connector connector = new
Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8081);
connector.setSecure(false);
connector.setRedirectPort(8080);
return connector;
}
}