SpringBoot中支持Https协议的实现

SpringBoot是一个非常流行的Java开发框架,支持各种协议,如Http、Https等。本篇攻略将详细讲解SpringBoot中支持Https协议的实现方法。

准备工作

在SpringBoot中支持Https协议,需要准备三个文件:

  1. SSL证书文件(如:keystore.jks或server.crt)
  2. SSL证书密码(如:123456)
  3. 修改application.yml或application.properties文件,设置端口号、证书文件路径和证书密码

如果你没有SSL证书文件,可以通过以下命令自动生成:

$ keytool -genkey -alias tomcat -keyalg RSA -keystore keystore.jks -validity 3650 

添加依赖

首先需要添加SpringBoot的Web依赖项。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

其次,需要添加javax.servlet-api的依赖项,以及SpringBoot自带的Tomcat https的依赖项。

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.apache.tomcat.embed</groupId>
  <artifactId>tomcat-embed-core</artifactId>
  <version>${tomcat.version}</version>
</dependency>
<dependency>
  <groupId>org.apache.tomcat.embed</groupId>
  <artifactId>tomcat-embed-logging-juli</artifactId>
  <version>${tomcat.version}</version>
</dependency>
<dependency>
  <groupId>org.apache.tomcat.embed</groupId>
  <artifactId>tomcat-embed-jasper</artifactId>
  <version>${tomcat.version}</version>
</dependency>
<dependency>
  <groupId>org.apache.tomcat.embed</groupId>
  <artifactId>tomcat-embed-websocket</artifactId>
  <version>${tomcat.version}</version>
</dependency>

其中,${tomcat.version}是Tomcat的版本号(如8.5.50)。

SpringBoot配置

配置证书

首先需要将证书文件拷贝到项目的resource目录下,然后在application.ymlapplication.properties文件中添加以下配置:

server:
  port: 8000
  ssl:
    key-store: classpath:keystore.jks
    key-store-password: 123456
    key-password: 123456

其中,key-store是证书文件的路径,使用classpath:前缀表示在项目的resource目录下,key-store-password是证书文件的密码,key-password是密钥的密码。

开启Https协议

要在SpringBoot中启用HTTPS,可以使用WebServerFactoryCustomizer或者EmbeddedServletContainerCustomizer进行配置。

采用WebServerFactoryCustomizer方式

@Configuration
public class HttpsConfig {

    @Value("${server.port}")
    private int port;

    @Value("${server.ssl.key-store}")
    private String keyStorePath;

    @Value("${server.ssl.key-store-password}")
    private String keyStorePassword;

    @Value("${server.ssl.key-password}")
    private String keyPassword;

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @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);
            }
        };
        // 添加SSL配置
        tomcat.addConnectorCustomizers(connector -> {
            connector.setPort(port);
            connector.setSecure(true);
            connector.setScheme("https");

            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
            protocol.setSSLEnabled(true);
            protocol.setKeystoreFile(keyStorePath);
            protocol.setKeystorePass(keyStorePassword);
            protocol.setKeyPass(keyPassword);

        });
        return tomcat;
    }

}

采用EmbeddedServletContainerCustomizer方式

@Configuration
public class HttpsConfig {

    @Value("${server.port}")
    private int port;

    @Value("${server.ssl.key-store}")
    private String keyStorePath;

    @Value("${server.ssl.key-store-password}")
    private String keyStorePassword;

    @Value("${server.ssl.key-password}")
    private String keyPassword;

    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = 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);
            }
        };
        // 添加SSL配置
        tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer() {
            @Override
            public void customize(Connector connector) {
                connector.setPort(port);
                connector.setSecure(true);
                connector.setScheme("https");

                Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                protocol.setSSLEnabled(true);
                protocol.setKeystoreFile(keyStorePath);
                protocol.setKeystorePass(keyStorePassword);
                protocol.setKeyPass(keyPassword);

            }
        });
        return tomcat;
    }

}

启动测试

在项目的Controller中添加一个接口用于测试:

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello World!";
    }
}

启动服务器,通过HTTPS请求访问接口。可以使用两种方式进行测试:

  1. 使用浏览器访问:在浏览器中输入https://localhost:8000/hello,提示证书不安全后进入网站,验证Hello World!输出是否正确。
  2. 使用curl命令:在命令行中输入curl -k https://localhost:8000/hello,使用-k参数表示忽略证书警告,验证Hello World!输出是否正确。

示例

这里提供两个示例:

示例1

在自己的项目中使用Https协议进行数据加密,以保证数据的安全,代码示例如下:

@Configuration
public class HttpsConfig {

    @Value("${server.port}")
    private int port;

    @Value("${server.ssl.key-store}")
    private String keyStorePath;

    @Value("${server.ssl.key-store-password}")
    private String keyStorePassword;

    @Value("${server.ssl.key-password}")
    private String keyPassword;

    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = 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);
            }
        };
        // 添加SSL配置
        tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer() {
            @Override
            public void customize(Connector connector) {
                connector.setPort(port);
                connector.setSecure(true);
                connector.setScheme("https");

                Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                protocol.setSSLEnabled(true);
                protocol.setKeystoreFile(keyStorePath);
                protocol.setKeystorePass(keyStorePassword);
                protocol.setKeyPass(keyPassword);

            }
        });
        return tomcat;
    }
}

示例2

在开发环境中使用自定义证书实现Https协议,以便进行开发调试,代码示例如下:

@Configuration
public class HttpsConfig {

    @Value("${server.port}")
    private int port;

    @Value("${server.ssl.key-store}")
    private String keyStorePath;

    @Value("${server.ssl.key-store-password}")
    private String keyStorePassword;

    @Value("${server.ssl.key-password}")
    private String keyPassword;

    /**
     * 配置https
     */
    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = 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);
            }
        };
        // 添加SSL配置
        tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer() {
            @Override
            public void customize(Connector connector) {
                connector.setPort(port);
                connector.setSecure(true);
                connector.setScheme("https");

                Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                protocol.setSSLEnabled(true);
                String keystoreFile = keystoreBinFile().getAbsolutePath();
                protocol.setKeystoreFile(keystoreFile);
                protocol.setKeystorePass("password");
                protocol.setKeyPass("password");
            }
        });
        return tomcat;
    }

    /**
     * 自定义证书路径
     */
    @Bean
    public File keystoreBinFile() {
        String home = System.getProperty("user.home");
        File file = new File(home, ".keystore");
        if (file.exists()) {
            return file;
        }
        try {
            createKeyStore(file.getPath());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return file;
    }

    /**
     * 通过keytool命令生成证书
     * keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -keystore ~/.keystore -validity 365 -storepass password -keypass password
     */
    public static void createKeyStore(String filename) throws Exception {
        String cmd = String.format("keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -keystore %s -validity 365 -storepass password -keypass password", filename);
        Runtime.getRuntime().exec(cmd).waitFor();
    }
}

注意:在示例2中,需要先使用keytool命令生成证书,然后将证书拷贝到$HOME/.keystore文件中,并在HttpConfig中指定证书路径即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot中支持Https协议的实现 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 深入解析Java的Struts框架中的控制器DispatchAction

    深入解析Java的Struts框架中的控制器DispatchAction DispatchAction的概述 Struts是一个MVC架构的Web框架,其中控制器层由Action实现。DispatchAction是Struts中一个特殊的Action,它根据请求参数的值映射到相应的方法进行处理,相当于一组Action的集合,可以大大简化代码实现。 Dispa…

    Java 2023年5月20日
    00
  • Java编译期注解的作用是什么?

    Java编译期注解是一种特殊的注释,它们可以在Java代码编译时被读取并处理。在Java语言中,编译期注解的作用非常广泛,可以用于静态检查、自动生成代码、代码优化等方面。 以下是Java编译期注解的作用以及使用攻略: 静态检查 编译器可以读取并处理编译期注解,从而帮助我们进行代码静态检查。例如,我们可以使用注解来标记一些警告或错误信息,并在代码编译时进行检查…

    Java 2023年5月11日
    00
  • 基于JS实现导航条flash导航条

    针对“基于JS实现导航条flash导航条”的完整攻略,我给出如下详细讲解: 介绍 flash导航条,是通过flash技术来实现网站导航栏,使导航效果更为优美且富有动感。在近年来,随着web前端技术的发展,人们开始尝试使用javascript的方式实现类似的效果。下面参加我将通过两个案例,详细解释如何通过JS实现这样一个效果。 实现思路 实现flash导航条,…

    Java 2023年6月15日
    00
  • 2022版IDEA创建一个maven项目的超详细图文教程

    下面我将为您详细讲解如何在2022版IDEA中创建一个maven项目的超详细图文教程。 步骤一:打开IDEA并创建一个新项目 打开2022版的IDEA,选择”Create New Project”(新建项目)。 在弹出窗口中,选择”Maven”项目类型,并点击”Next”。 在下一个窗口中选择”Maven Quickstart Archetype”原型(注意…

    Java 2023年5月20日
    00
  • 使用Spirng Boot Admin监控Spring Cloud应用项目

    下面是使用Spring Boot Admin监控Spring Cloud应用项目的完整攻略: 1. 安装和配置Spring Boot Admin 首先,需要在Spring Boot应用项目中添加相关依赖,以便于引入Spring Boot Admin。在pom.xml中加入以下内容: <dependency> <groupId>de.c…

    Java 2023年5月20日
    00
  • java异常继承何类,运行时异常与一般异常的区别(详解)

    Java异常继承何类 Java中所有异常都继承自java.lang.Throwable类,Throwable类分为两种:Error和Exception。Error表示虚拟机无法处理的错误,而Exception则表示正常的异常事件。 Exception又分为编译时异常和运行时异常,下面将详细说明运行时异常和一般异常的区别。 运行时异常与一般异常的区别 运行时异…

    Java 2023年5月27日
    00
  • Unicode编码大揭秘

    首先让我们来了解一下“Unicode编码大揭秘”。 Unicode编码大揭秘 Unicode是一种字符编码标准,它定义了数字与字符之间的对应关系。Unicode编码包含了世界上几乎所有的字符,包括各国文字、标点符号、特殊符号等等,使得不同的计算机系统和软件可以正确地保存、传输和显示文本。 Unicode编码方案 Unicode编码有多种方案,例如UTF-8(…

    Java 2023年5月20日
    00
  • MyBatis 执行动态 SQL语句详解

    MyBatis 执行动态 SQL语句详解 什么是动态 SQL语句 动态SQL语句是根据不同的输入条件,动态创建不同的SQL语句,以便能够灵活地满足不同的查询需求。 MyBatis如何执行动态 SQL语句 MyBatis执行动态SQL语句的方式是通过将动态SQL语句解析成对应的静态SQL语句,然后再执行静态SQL语句。 这个过程MyBatis通过SqlNode…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部