SpringBoot 改造成 https访问
一、为什么需要使用Https(安全套接字层超文本传输协议)
1.1、因为http是明文传输不安全,我们需要加上SSL/TLS,建立一个安全的通道,保证数据传输的安全;确认网站的真实性,验证服务器的身份。
Https = Http + SSL/TLS
1.2、SSL与TLS的区别
1.2.1、
SSL简介:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性、以实现客户端和服务器之间的安全通讯。协议有两层组成:SSL记录协议(为高层协议提供数据封装、压缩、加密等基本功能的支持)和SSL握手协议(建立在记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等)。
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。
1.2.2、
SSL协议提供的服务主要有:
- 认证用户和服务器,确保数据发送到正确的客户机和服务器;
- 加密数据以防止数据中途被窃取
- 维护数据的完整性,确保数据在传输过程中不被改变
1.2.3、
TLS简介:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性,该协议由两层组成;TLS记录协议(用于封装各种高层协议)和TLS握手协议(提供连接安全具备三个基本属性)。
- 可以使用非对称的,或公共密钥的密码术来认证对等方的身份。该认证是可选的,但至少需要一个结点方。
- 共享解密密钥的协商是安全的。对偷窃者来说协商加密是难以获得的。此外经过认证过的连接不能获得加密,即使是进入连接中间的攻击者也不能。
- 协商是可靠的。没有经过通信方成员的检测,任何攻击者都不能修改通信协商。
1.3、区别
在TLS和SSL3.0之间存在着显著的差别,主要是它们支持的加密算法不同。
1.4、客户端与服务端使用https传输的过程
1.5、密码体制
要建立一个密码体制,需要由五个空间组成,分别是:
-
明文M:加密前或解密后的信息;
-
密文C:明文加密后的信息;
-
密钥K:由加密密钥和解密密钥组成;
-
加密E:从明文到密文的变换;
-
解密D:从密文到明文的变换。
二、加密方式(两种)
1、对称加密
对称加密,或者也叫弹钥加密,是指加密密钥与解密密钥相同(或者容易由一个计算出另一个)的加密方式。
对称加密的优势:加密、解密运算速度快、效率高。
局限性:密钥分发复杂、密钥管理困难、保密通信系统开放性差,数字签名
代表算法:DES算法、AES算法
2、非对称加密
非对称加密是指加密和解密分别使用不同的密钥,并且不能由加密密钥推导出解密密钥的加密方式
非对称加密的优势:密钥分配简单、便于管理、系统开放性好、可以实现数字签名
局限性:加密、解密运算效率低
代表算法:RSA算法、ECC算法、国密SM2等
三、证书
要使用SSL,需要有证书,这个证书文件是包含公钥密钥,也就是非对称加密中要使用的。
获取证书的两种方式:
- 从CA(Certificate Authority)机构获取,即客户端会认可的证书,具有公信力;有免费的也有收费的,收费的比较稳定比较安全。
- 自鉴证书,自己制作证书,一般用于测试,浏览器不承认。
本文中采用自鉴证书完成实测示例。
1、生成自鉴证书
1.1、找到jdk的安装路径
1.2、由于jdk是安装在C盘中所以需要使用管理员身份去生成证书,否则在生成证书的时候会报权限错误
1.3、在终端进去到jdk的bin目录下执行以下命令生成密钥证书
(1)keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
以上命令参数说明:
- alias 密钥别名
- storetype 指定密钥仓库类型
- keyalg 生证书的算法名称,RSA是一种非对称加密算法
- keysize 证书大小
- keystore 生成的证书文件的存储路径
- validity 证书的有效期
(2)生成证书注意点:
密钥库口令:证书密码,在后面的项目中配置证书时用到
- 姓氏:一般没什么用,在浏览器中查看证书时会显示,用于正式场合的证书还是需要填写标准。
- 组织单位:证书使用单位信息,一般没什么用,在浏览器中查看证书时会显示,用于正式场合的证书还是需要填写标准。
- 组织单位名称:证书使用单位名称,一般没什么用,在浏览器中查看证书时会显示,用于正式场合的证书还是需要填写标准。
- 所在的城市或区域名称:浏览器中查看证书信息时会显示。
- 所在的省/市/自治区名称:浏览器中查看证书信息时会显示。
- 单位的双字母国家/地区代码:国家或地区编码,浏览器中查看证书信息时会显示。
(3)生成的密钥证书路径 keystore.p12
(4)将此文件拷贝至项目中
四、编写测试程序
(1)该Demo示例的pom.xml依赖配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.xdh</groupId> <artifactId>https-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>https-demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
(2)application.properties配置文件的配置
server.port=1998 #证书的路径.密钥文件的路径、也可以配置绝对路径 server.ssl.key-store=classpath:keystore.p12 #证书密码,密钥生成时在终端输入的密钥库口令 server.ssl.key-store-password=123456 #秘钥库类型,与密钥生成命令一致 server.ssl.keyStoreType=PKCS12 #证书别名,与密钥生成命令一致 server.ssl.keyAlias=tomcat #http端口号 server.additionalPorts=1999,1997
(3)TestController入口
@Controller @RequestMapping(value = "/testController",method = RequestMethod.GET) public class TestController { @GetMapping("/test") @ResponseBody public String test(@RequestParam Map<String, Object> params) { params.put("name","张三"); System.out.println(params); String name = String.valueOf(params.get("name")); return "你好" + name; } }
(4)HttpsDemoApplication 启动类
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class HttpsDemoApplication { public static void main(String[] args) { SpringApplication.run(HttpsDemoApplication.class, args); } }
(5)启动程序后在Google浏览器测试
***如果测试的时候谷歌浏览器报错:你的连接不是私密连接。解决方案如下:
- 在chrome强制跳转https,删除对某个域名的强制专跳即可。
- 在chrome的地址栏输入:chrome://net-internals/#hsts
- 在delete domain下输入相应的网址,不带http的,只需要www开头,接着按下delete即可。
例如:我本来是想输入 https://localhost:1998/testController/test 这个地址,在delete domain下输入localhost:1998/testController/test 即可