SSL的配置也是我们在实际应用中经常遇到的场景。
SSL(Secure Sockets Layer,安全套接层)是为网络通信提供安全及数据完整性的一种安全协议,SSL在网络传输层对网络连接进行加密。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通信提供安全支持。
SSL协议可分为两层:SSL记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol),它建立在SSL记录协议之上,用于在实际数据传输开始前,通信双方进行身份认证、协商加密算法、交换加密密钥等。
而在基于B/S的Web应用中,是通过HTTPS来实现SSL的。HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即在HTTP下加入SSL层,HTTPS的安全基础是SSL。
因为Spring Boot用的是内嵌的Tomcat,因而我们做SSL配置的时候需要做如下的操作。
生成证书
使用SSL首先需要一个证书,这个证书既可以是自签名的,也可以是从SSL证书授权中心获得的。本例为了演示方便,演示自授权证书的生成。每一个JDK或者JRE里都有一个工具叫keytool,它是一个证书管理工具,可以用来生成自签名的证书
在控制台输入如下命令,然后按照提示操作,如图7-13所示。keytool –genkey -alias tomcat
生成的证书在这里
将keysotre文件复制到项目根目录
配置SSL
添加一个index.html到src/main/resources/static下,作为测试。
将.keystore文件复制到项目的根目录,然后在application.properties中做如下SSL的配置:
server.port=8090
server.ssl.key-store=.keystore
server.ssl.key-password=111111
server.ssl.key-store-type=JKS
server.ssl.key-alias=tomcat
http转向https
很多时候我们在地址栏输入的是http,但是会自动转向到https,例如我们访问百度的时候,要实现这个功能,我们需配置TomcatEmbeddedServletContainerFactory,并且添加Tomcat的connector来实现。这时我们需要在配置文件里增加如下配置:
package com.shrimpking.Test1;
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.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2024/1/8 15:30
*/
@Configuration
public class TempConfig
{
@Bean
public EmbeddedServletContainerFactory embeddedServletContainerFactory(){
TomcatEmbeddedServletContainerFactory factory
= new TomcatEmbeddedServletContainerFactory(){
@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);
}
};
factory.addAdditionalTomcatConnectors(httpConnector());
return factory;
}
@Bean
public Connector httpConnector(){
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8089);
connector.setSecure(false);
connector.setRedirectPort(8888);
return connector;
}
}