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

  • 相关阅读:
    什么是软件质量?
    软件生存周期及其模型是什么?
    给你一个网站,你如何测试?
    jquery中$.get()提交和$.post()提交有区别吗?
    JQuery有几种选择器?
    ajax和layui总结
    md5加密
    Collection接口相关介绍
    JS 中document.URL 和 windows.location.href 的区别
    window.location.href的用法(动态输出跳转)
  • 原文地址:https://www.cnblogs.com/nastu/p/15273139.html
Copyright © 2020-2023  润新知