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 类

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;
    }
}
View Code

 

 

重新启动项目,进行访问

例如 浏览器输入 http://127.0.0.1:8089/hello , 项目会自动将 该请求 转换成 https://127.0.0.1:8088/hello 请求。


 

源码地址:https://gitee.com/oukele/springboot-demo/tree/master/https

 

posted @ 2020-12-24 15:45  追梦滴小蜗牛  阅读(1400)  评论(1编辑  收藏  举报