将 HTTP 转换成 HTTPS 需要证书。证书可以通过自己生成或者从 CA 厂商购买获得。
JDK 有 keytool 工具,可以生成证书:
$ keytool -genkeypair -alias osiiap_web_api -keyalg RSA -keysize 2048 -storetype PKCS12 -validity 3650 -keypass password -storepass password -keystore web-api.p12
-alias
证书的别名-keyalg -keysize
证书使用的算法和证书长度-storetype
存储的类型-validity
证书的有效期限-keypass -storepass
证书的密码和存储的密码
接着就可以在 application.yml
文件中写上对应信息即可。
server:
# port 为非必须
port: 443
ssl:
key-alias: osiiap_web_api
key-store: web-api.p12
key-store-password: password
现在就可以使用 https 来访问该程序。但是我们想将 http 永久重定向到 https,用到的技术就是将 80 端口转到 443。
可以创建 Spring Boot 的配置类来实现:
@SpringBootConfiguration // 注意这里必须是 @SpringBootConfiguration 注解。才会认定为这是一个 Spring Boot 的注解。
public class HttpsConfig {
@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(80);
connector.setSecure(false);
connector.setRedirectPort(443);
return connector;
}
}