Spring/SpringBoot系列之SpringBoot支持Https【十六】

关于Https,这里不介绍了,推荐阅读:Https和Http的异同。

1. 证书获取

在SpringBoot项目中开启对Https的支持很简单,难的是Https证书的获取,为了简单测试,这里就利用jdk自带的keytool工具生成一个免费证书。

如果使用了 nginx 或者 tomcat 的话,https 也可以非常方便的配置,从各个云服务厂商处申请到 https 证书之后,官方都会有一个详细的配置教程,一般照着做,就不会错了。

进入JAVA_HOME下的bin目录下,打开命令行窗口,输入以下内容:

 keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore D:\linyf.p12 -validity 365

命令含义如下:

  • genkey: 表示要创建一个新的密钥。
  • alias: 表示 keystore 的别名。
  • keyalg: 表示使用的加密算法是 RSA ,一种非对称加密算法。
  • keysize: 表示密钥的长度。
  • keystore: 表示生成的密钥的存放位置。
  • validity: 表示密钥的有效时间,单位为天。

具体生成过程如下,其中需要记住秘钥口令,后面会用到,其它除了是否正确那一步输入【是】外全部回车即可:
Spring/SpringBoot系列之SpringBoot支持Https【十六】_第1张图片
命令执行完成后 ,我们在 D 盘目录下会看到一个名为linyf.p12 的文件。如下图:
在这里插入图片描述
有了这个文件之后,准备工作就完成了。

2. 配置

把 linyf.p12 拷到 项目资源目录 resources 下,然后在application.yml中进行配置:

server:
  ssl:
    key-store: classpath:linyf.p12
    key-alias: tomcathttps
    key-store-password: 123456

其中:

  • key-store:表示密钥文件路径。
  • key-alias:表示密钥别名。
  • key-store-password:就是在cmd命令执行过程中输入的密码

配置完成后,启动项目,此时如果直接使用 Http 协议来访问接口,就会看到如下错误:
Spring/SpringBoot系列之SpringBoot支持Https【十六】_第2张图片
改用 https 来访问:
Spring/SpringBoot系列之SpringBoot支持Https【十六】_第3张图片
这是因为我们自己生成的 https 证书不被浏览器认可,不过没关系,直接点击继续访问就可以了(实际项目中只需要更换一个被浏览器认可的 https 证书即可)。点击继续访问:
Spring/SpringBoot系列之SpringBoot支持Https【十六】_第4张图片

3. 配置请求转发

因为 Spring Boot 不支持同时启动 HTTP 和 HTTPS ,为了解决这个问题,可以配置请求转发,当用户发起 HTTP 调用时,自动转发到 HTTPS 上。

具体配置:

package com.linyf.demo.config;

import com.sun.org.apache.bcel.internal.generic.NEW;
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.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ToncatConfig {
    @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;
    }

	//配置 Http 的请求端口为 8081,所有来自 8081 的请求,将被自动重定向到 8088 这个 https 的端口上。这样再访问 http 请求,就会自动重定向到 https。
    private Connector createTomcatConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8081);
        connector.setSecure(false);
        connector.setRedirectPort(8088);
        return connector;
    }
}

然后再访问http://localhost:8081/1.html,回车:
Spring/SpringBoot系列之SpringBoot支持Https【十六】_第5张图片
会直接重定向到https://localhost:8088/1.html:
Spring/SpringBoot系列之SpringBoot支持Https【十六】_第6张图片

你可能感兴趣的:(java,spring,boot)