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. 维护数据的完整性,确保数据在传输过程中不被改变

1.2.3、

TLS简介:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性,该协议由两层组成;TLS记录协议(用于封装各种高层协议)和TLS握手协议(提供连接安全具备三个基本属性)。

  1. 可以使用非对称的,或公共密钥的密码术来认证对等方的身份。该认证是可选的,但至少需要一个结点方。
  2. 共享解密密钥的协商是安全的。对偷窃者来说协商加密是难以获得的。此外经过认证过的连接不能获得加密,即使是进入连接中间的攻击者也不能。
  3. 协商是可靠的。没有经过通信方成员的检测,任何攻击者都不能修改通信协商。

1.3、区别

在TLS和SSL3.0之间存在着显著的差别,主要是它们支持的加密算法不同。

1.4、客户端与服务端使用https传输的过程

1.5、密码体制

要建立一个密码体制,需要由五个空间组成,分别是:

  • 明文M:加密前或解密后的信息;

  • 密文C:明文加密后的信息;

  • 密钥K:由加密密钥和解密密钥组成;

  • 加密E:从明文到密文的变换;

  • 解密D:从密文到明文的变换。

二、加密方式(两种)

1、对称加密

对称加密,或者也叫弹钥加密,是指加密密钥与解密密钥相同(或者容易由一个计算出另一个)的加密方式。

对称加密的优势:加密、解密运算速度快、效率高。

局限性:密钥分发复杂、密钥管理困难、保密通信系统开放性差,数字签名

代表算法:DES算法、AES算法

2、非对称加密

非对称加密是指加密和解密分别使用不同的密钥,并且不能由加密密钥推导出解密密钥的加密方式

非对称加密的优势:密钥分配简单、便于管理、系统开放性好、可以实现数字签名

局限性:加密、解密运算效率低

代表算法:RSA算法、ECC算法、国密SM2等

三、证书

要使用SSL,需要有证书,这个证书文件是包含公钥密钥,也就是非对称加密中要使用的。

获取证书的两种方式:

  1. CA(Certificate Authority机构获取,即客户端会认可的证书,具有公信力;有免费的也有收费的,收费的比较稳定比较安全。
  2. 自鉴证书,自己制作证书,一般用于测试,浏览器不承认。

本文中采用自鉴证书完成实测示例。

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 即可

原文地址:https://www.cnblogs.com/nastu/p/15273139.html