SpringBoot整合HTTPS的项目实践

 更新时间:2024年10月18日 09:04:54   作者:duration~  
HTTPS的主要作用是通过SSL证书保护用户数据的安全与隐私,增加网站信任度,防止数据被窃取和篡改,保护网站免受钓鱼攻击,本文就来介绍一下,感兴趣的可以了解一下

1_Https 的作用

保护用户的隐私信息安全:

在 HTTP 网站数据以明文方式传输,客户的隐私极容易被盗取和泄露,而部署 SSL 证书,数据以 HTTPS 加密传输,可以保护通信不被第三方监听和窃取,从而保护用户隐私及安全。还可增加用户信任感和提升企业形象。

保护网站的安全性和完整性:

HTTPS 是安全套接层超文本传输协议,可以保证网站的信息从用户浏览器到服务器之间的传输是高强度加密传输的,是不会被第三方窃取和篡改的,还能避免网站被劫持而插入广告等,防止被钓鱼网站攻击,从而保护网站的安全性和完整性

防止被钓鱼网站攻击,有效识别网站真实身份:

http 网站会被浏览器标记 “不安全”,而安装 https 证书会取消这种 “不安全” 的警告,能增加访客信任度。同时对于安装了 OV SSL 证书或 EV SSL 证书的网站,还能向用户证明网站的真实身份,防止网站被钓鱼网站仿冒。

2_获取证书

需要在 SSL 证书颁发机构处申请或购买 SSL 证书,并下载对应的 .pem 和 .key 文件。

由于只是进行本地测试,所以这里将使用JDK1.8 开发工具包 bin 目录下的keytool.exe工具生成ssl密钥:

keytool -genkeypair -alias myalias -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650 -storepass your-password

  • -genkeypair : 表示创建密钥。
  • -alias: 保存时的别名。
  • -keyalg:加密算法选择,这里使用RSA。
  • -keysize:秘钥大小,是有固定要求的。
  • -storetype:秘钥存储库的类型。
  • -keystore:密钥的存放位置。
  • -validity:有效时间,单位是天。
  • -storepass:密钥库口令。

可以使用代码验证秘钥生成是否正确,如:

package org.example;

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;

public class KeystoreExample {
    public static void main(String[] args) {
        String keystorePath = "path/to/your/keystore.p12";
        char[] keystorePassword = "your-keystore-password".toCharArray();

        try (FileInputStream fis = new FileInputStream(keystorePath)) {
            KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
            keystore.load(fis, keystorePassword);
            System.out.println("密钥库加载成功");
        } catch (java.io.IOException e) {
            System.err.println("密钥库加载失败: " + e.getMessage());
        } catch (NoSuchAlgorithmException | CertificateException | KeyStoreException e) {
            System.err.println("可能是密码错误导致的解密失败");
            e.printStackTrace();
        }
    }
}

或者使用keytool.exe工具进行验证:

keytool -list -v -keystore  keystore.p12

3_配置项

application.properties

server.port=8081
server.error.path=/log
server.servlet.session.timeout=30s
# 设置应用程序的上下文路径为 /test002。这意味着所有以 /test002 开始的 URL 都将被认为属于这个应用程序。
server.servlet.context-path=/test002
server.tomcat.uri-encoding=UTF-8
server.tomcat.threads.max=500
# 表示秘钥存储库的类型
server.ssl.key-store-type=PKCS12
# 表示 SSL 密钥存储库的名称为 keystore.p12
server.ssl.key-store=classpath:ssl/keystore.p12
# 表示 SSL 密钥别名为 myalias  。
server.ssl.key-alias=myalias
# 这行设置的是 SSL 密钥存储库的密码为 your-password
# 密码不能特别简单,不然项目启动时会出现异常
server.ssl.key-store-password=your-password

其中,server.port 配置 HTTPS 监听端口。server.ssl.key-store 配置证书存放路径,server.ssl.key-store-password 配置证书密码,server.ssl.key-store-type 和 server.ssl.key-alias 分别指定证书的类型和别名。

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring_Back</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
        <relativePath/>
    </parent>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    
</project>

4_配置类

package org.example.config;
 
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.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TomcatConfig {
    /**
     * 设置 Tomcat 的Server配置
     * @return
     */
    @Bean
    TomcatServletWebServerFactory tomcatServletWebServerFactory(){
        TomcatServletWebServerFactory myFactory = new TomcatServletWebServerFactory(){
            //创建一个安全约束对象
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");//设置为机密级别
                SecurityCollection connection = new SecurityCollection();//设置一个安全连接对象
                //作用到所有路由上
                connection.addPattern("/*");
                //加入 connection 对象到安全路由中去
                constraint.addCollection(connection);
                context.addConstraint(constraint);
            }
        };
        //配置HTTPS连接器
        myFactory.addAdditionalTomcatConnectors(createConnector());
        return myFactory;
    }
 
    /**
     * 创建一个连接兼容Https请求
     * @return
     */
    private Connector createConnector(){
        //tomcat 9 中
        //tomcat/conf/server.xml中不要使用org.apache.coyote.http11.Http11AprProtocol
        //要用HTTP/1.1
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);//"HTTP/1.1"
 
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);//关闭ssl检查
        //设置跳转到8081 的端口
        connector.setRedirectPort(8081);
        return connector;
    }
}

这段代码创建了一个 Tomcat Servlet 容器,并配置了一个 HTTPS 连接器。其中 redirectConnector() 方法实现了将 HTTP 请求重定向到 HTTPS 的功能。

  • 启动项目:完成上述配置后,重新启动项目,就能够在 HTTPS 协议下访问 Web 应用了。

需要注意的是,在实际生产环境中,还需要配置服务器的防火墙、负载均衡等相关组件,保证 HTTPS 的安全性和稳定性。

5_控制类

package org.example.controller;
 
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class FirstController {
    @GetMapping("/hey")
    public String hey(){
        return "hey main";
    }
}

6_启动类

package org.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

@EnableAutoConfiguration
@ComponentScan
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class,args);
    }
}

此时使用 http 协议访问 8080 端口将跳转到 https 协议下的 8081端口。

到此这篇关于SpringBoot整合HTTPS的项目实践的文章就介绍到这了,更多相关SpringBoot整合HTTPS内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot整合jasypt的详细过程

    springboot整合jasypt的详细过程

    这篇文章主要介绍了springboot整合jasypt的详细过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-02-02
  • springboot静态资源映射规则的使用小结

    springboot静态资源映射规则的使用小结

    本文主要介绍了springboot静态资源映射规则,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • java中Vector的详细说明

    java中Vector的详细说明

    Vector是Java早期的线程安全动态数组,支持自动扩容和有序可重复元素,因同步机制性能较低,已被ArrayList等替代,现代开发中,推荐使用ArrayList或并发容器而非Vector
    2025-10-10
  • Java并发编程回环屏障CyclicBarrier

    Java并发编程回环屏障CyclicBarrier

    这篇文章主要介绍了Java并发编程回环屏障CyclicBarrier,文章继续上文所介绍的Java并发编程同步器CountDownLatch展开主题相关内容,需要的小伙伴可以参考一下
    2022-04-04
  • SpringBoot配置Spring Security的实现示例

    SpringBoot配置Spring Security的实现示例

    本文主要介绍了SpringBoot配置Spring Security的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • Java文件读写IO/NIO及性能比较详细代码及总结

    Java文件读写IO/NIO及性能比较详细代码及总结

    这篇文章主要介绍了Java文件读写IO/NIO及性能比较详细代码及总结,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • controller接口跳转到另一个controller接口的实现

    controller接口跳转到另一个controller接口的实现

    这篇文章主要介绍了controller接口跳转到另一个controller接口的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • MyBatis-Plus速成指南之简化你的数据库操作流程(最新推荐)

    MyBatis-Plus速成指南之简化你的数据库操作流程(最新推荐)

    MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生,这篇文章主要介绍了MyBatis-Plus速成指南:简化你的数据库操作流程,需要的朋友可以参考下
    2025-02-02
  • Java特性之注解和异常 Throwable

    Java特性之注解和异常 Throwable

    这篇文章主要介绍了Java特性之注解和异常,注解是JDK1.5版本开始引入的一个特性,Throwable是Java语言中所有错误与异常的超类,文章围绕主题展开更多的相关介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • Java 中导入excel时使用 trim() 无法去除空格的问题解决方案

    Java 中导入excel时使用 trim() 无法去除空格的问题解决方案

    这篇文章主要介绍了Java中导入excel时使用trim()无法去除空格的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06

最新评论