将 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: 443ssl:key-alias: osiiap_web_apikey-store: web-api.p12key-store-password: password
现在就可以使用 https 来访问该程序。但是我们想将 http 永久重定向到 https,用到的技术就是将 80 端口转到 443。
可以创建 Spring Boot 的配置类来实现:
@SpringBootConfiguration // 注意这里必须是 @SpringBootConfiguration 注解。才会认定为这是一个 Spring Boot 的注解。public class HttpsConfig {@BeanTomcatServletWebServerFactory tomcatServletWebServerFactory() {TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {@Overrideprotected 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 = newConnector("org.apache.coyote.http11.Http11NioProtocol");connector.setScheme("http");connector.setPort(80);connector.setSecure(false);connector.setRedirectPort(443);return connector;}}
