Springboot系列-配置Https
前言:关于HTTP和HTTPS相信大家多少都对其有些了解,而且随着对安全方面的着重,HTTPS普及的也越来越广泛,本片博客将针对于Springboot如何配置HTTPS进行介绍
1.HTTP与HTTPS
在介绍关于Springboot配置HTTPS之前,先来简单聊一下关于什么是HTTP和HTTPS,有什么作用,他们之间有什么区别
我们通常使用浏览器去访问一个页面,在浏览器地址栏中我们会看到一串URL,比如: http://www.wxy.com ; 其实这个网站的url分为两部分
- http/https:这部分我们通常称为通信协议,简单来说就是浏览器与服务器之间沟通的语言
- www.wxy.com:这部分我们通常称为域名,就是我们访问的一个地址
HTTP
HTTP中文名称:超文本传输协议,它是一种使用明文数据传输的网络协议,所以HTTP协议的明文传输在某些方面存在很大的安全隐患,比如网上买东西,在你输入支付密码的时候由于明文数据传输,所以很容易被截取
HTTPS
HTTPS中文名称:超文本传输安全协议,所谓HTTPS就是是在HTTP协议基础上加入加密处理和认证机制以及完整性保护,即HTTP+加密+认证+完整性保护=HTTPS。但是HTTPS并非应用层的一种新协议,只是HTTP通信接口部分用SSL /TLS协议代替而已。通常HTTP直接和TCP通信,当使用SSL 时则演变成先和SSL 通信,再由SSL 和TCP通信。
简单说HTTPS,其实就是身披SSL 协议这层外壳的HTTP,SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”,采用数据加密传输,是HTTP和HTTPS之间的本质性区别,SSL具体协议基本原理,可自行查阅
2.配置准备
按照正常情况下我们是需要有一个HTTPS证书,因为证书是需要花费或者去云厂商申请,所以为了方便我们直接使用Java自带的JDK管理工具keytool来生成一个免费的的HTTPS证书
进入到 %JAVA_HOME%\bin 目录下,执行如下一条命令:
keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore D:\wxy.p12 -validity 365
对于以上命令是什么意思呢,简单介绍如下:
- genkey :表示创建一个新的密钥
- alias :表示 keystore 的别名
- keyalg :表示使用的加密算法是 RSA ,一种非对称加密算法
- keysize :表示密钥长度
- keystore :表示生成的密钥存放位置
- validity :表示密钥的有效时间,单位为天
如下为博主的获取截图:
执行完成之后根据你自己设置的相应路径找到相应的文件,如我的为D:/
3.引入HTTPS
1.配置完成之后我们需要将刚才生成的wxy.p12文件引入到我们的Springboot项目中,将生成文件放置到resource目录下面
2.配置文件application.properties中添加如下配置
server.ssl.key-store=classpath:wxy.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=XXXXXX
- key-store表示密钥文件名
- key-alias表示密钥别名
- key-store-password就是在cmd命令执行过程中输入的密码。
3.我们简单的在controller层里面写个访问资源
@RestController
public class DemoController {
@GetMapping("/start")
public String start(){
return "hello world";
}
4.配置完成后,启动 Spring Boot 项目,此时直接使用 Http 协议来访问接口,就会看到如下错误
使用 Https 协议来访问接口
出现上述的问题因为我们自己生成的 https 证书不被浏览器认可
4.请求转发
考虑到 Spring Boot 不支持同时启动 HTTP 和 HTTPS ,为了解决这个问题,可以选择配置一个请求转发,当用户发起 HTTP 调用时,自动转发到 HTTPS 上
配置如下:
@Configuration
public class TomcatConfig {
@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(8081);
connector.setSecure(false);
connector.setRedirectPort(8080);
return connector;
}
}
如上述代码配置了 Http 的请求端口为 8081,所以所有来自 8081 的请求,将被自动重定向到 8080 这个 https 的端口上。之后,我们再去访问 http 请求,就会自动重定向到 https上了
结语:如上配置,说明无论是在各大网站还是支付环境下都是相对来说安全的,即使我们访问的环境不安全,也会自动重定向到安全环境,对此针对于在Springboot项目中如何配置HTTPS就介绍到这