SpringBoot - 启用https
1、 生成SSL证书(使用 Java jdk 自带的工具 keytool)
找到jdk的安装路径(注意:这里是我本地的路径...)
假设你已经配置了 JDK的环境变量,可以 忽略这下面的这一步。
2、输入命令生成证书
keytool -genkeypair -alias server_https -keypass oukele -keyalg RSA -keysize 1024 -validity 365 -keystore D:/server_https.keystore -storepass oukele
-alias 别名 -keypass 指定生成密钥的密码 -keyalg 指定密钥使用的加密算法(如 RSA) -keysize 密钥大小 -validity 过期时间,单位:天 -keystore 指定存储密钥的 密钥库的生成路径、名称。 -storepass 指定访问密钥库的密码。
有警告提示的话,根据它的提示再操作一遍即可。
3、springboot 项目 配置 https
server: # https 配置 ssl: # 是否启用 ssl 支持 (默认是 true) #enabled: true # 密钥库的路径 key-store: classpath:server_https.keystore # 密钥库类型 key-store-type: JKS # 密钥库中密钥的别名 key-alias: server_https # 用于访问密钥库中密钥的密码 key-password: oukele # 用于访问密钥库的密码 key-store-password: oukele # 项目访问的端口 port: 8088 # 用于 非ssl请求 强制转成 ssl 请求 # 当使用 访问地址:http://127.0.0.1:8089/hello 访问时 后台会 将请求 转换成 https://127.0.0.1:8088/hello non-ssl-port: 8089
server_https.keystore 存放的位置
4、编写一个简单的测试控制类 ,启动访问进行访问
控制类:
进行访问结果:
5、http强制跳转https
新增一个 httpToHttpsConfig 类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.oukele.https.config; import org.apache.catalina.Context; import org.apache.catalina.connector.Connector; import org.apache.tomcat.util.descriptor.web.SecurityCollection; import org.apache.tomcat.util.descriptor.web.SecurityConstraint; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author oukele * http 请求 强制跳转成 https */ @Configuration public class HttpToHttpsConfig { /** * 项目指定的端口号 */ @Value("${server.port}") private int serverPort; /** * 用于 非ssl请求 强制转成 ssl 请求 的端口号 */ @Value("${server.non-ssl-port}") private int port; @Bean public TomcatServletWebServerFactory servletContainerFactory() { TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() { @Override protected void postProcessContext(Context context) { //设置安全性约束 SecurityConstraint securityConstraint = new SecurityConstraint(); securityConstraint.setUserConstraint("CONFIDENTIAL"); //设置约束条件 SecurityCollection collection = new SecurityCollection(); //拦截所有请求 collection.addPattern("/*"); securityConstraint.addCollection(collection); context.addConstraint(securityConstraint); } }; Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); //设置将分配给通过此连接器接收到的请求的方案 connector.setScheme("http"); //true: http使用http, https使用https; //false: http重定向到https; connector.setSecure(false); //设置监听请求的端口号,这个端口不能其他已经在使用的端口重复,否则会报错 connector.setPort(port); //重定向端口号(非SSL到SSL) connector.setRedirectPort(serverPort); tomcat.addAdditionalTomcatConnectors(connector); return tomcat; } }
重新启动项目,进行访问
例如 浏览器输入 http://127.0.0.1:8089/hello , 项目会自动将 该请求 转换成 https://127.0.0.1:8088/hello 请求。
源码地址:https://gitee.com/oukele/springboot-demo/tree/master/https