一、https原理
https是身披SSL外壳的http。https是一种通过计算机网络进行安全通信的传输协议,经由http进行通信,利用SSL/TLS建立全信道,加密数据包。https使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。SSL协议可以分为两层:SSL记录协议(SSL Record Protocol),它建立在可靠的传输协议如TCP之上,为高层协议提供数据封装、压缩、加密等基本功能支持;SSL握手协议(SSL Handshake Protocol),它建立在SSL记录协议之上,用于在实际数据传输开始之前,通信双方进行身份认证、协商加密算法、交换加密密钥等。在Web开发中,我们是通过HTTPS来实现SSL的。HTTPS是以安全为目标的HTTP通道,简单来说就是HTTP的安全版,即在HTTP下加入SSL层,所以说HTTPS的安全基础是SSL。(TLS是传输层加密协议,前身是SSL协议)
简而言之,使用https相比使用http:信道加密、数据安全。
二、Spring Boot开发Web后台服务器添加https支持流程
默认情况下,web访问服务器的采用的是http访问和传输。
添加https支持流程:
1、证书生成:
使用SSL需要我们先生成一个证书,这个证书我们可以自己生成,也可以从SSL证书授权中心获得。以直接使用java自带的命令keytool来生成为例,生成命令如下:
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
参数含义:
1.-storetype 指定密钥仓库类型
2.-keyalg 生证书的算法名称,RSA是一种非对称加密算法
3.-keysize 证书大小
4.-keystore 生成的证书文件的存储路径
5.-validity 证书的有效期
2、项目配置:
(1)将生成的文件keystore.p12复制到项目类路径下(classpath),也即项目的根目录。
(2)在项目的配置文件application.properties后application.yml文件下添加配置,如下:
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=111111
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias:tomcat
第一行指定签名文件,第二行指定签名密码,第三行指定密钥仓库类型,第四个是别名。配置完成之后,就可以通过HTTPS来访问我们的Web后台了。
三、添加将http自动转向https的支持功能
(1)添加配置类,进行转向配置,如下:
这里将访问端口8080的http访问自动转向为端口为8088的https访问,connecter即tomcat的访问节点。
代码如下:
@Configuration
public class Http2HttpsConfig {
/**
* 配置服务器容器
* @return 服务器容器
*/
@Bean
public EmbeddedServletContainerFactory servletContainer(){
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection securityCollection = new SecurityCollection();
securityCollection.addPattern("/*");
securityConstraint.addCollection(securityCollection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(httpConnector());
return tomcat;
}
/**
* 设置http到https的url映射
* @return 连接器
*/
@Bean
public Connector httpConnector(){
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8088);
return connector;
}
}
四、实现效果:
(1)https访问:https://localhost:8088效果如下:
(2)http访问:http://localhost:8080访问,自动转向https://localhost:8088,效果如下: