SpringBoot项目支持HTTPS

原文网址:SpringBoot项目支持HTTPS_IT利刃出鞘的博客-CSDN博客

简介

SSL证书

要使用https,首先需要ssl证书,获取SSL证书有两种方式:

  • 通过证书授权机构购买或者免费领取
  • 自己通过keytool生成

注意

SSL详细配置

server.ssl.ciphers= # Supported SSL ciphers.
server.ssl.client-auth= # Whether client authentication is wanted ("want") or needed ("need"). Requires a trust store.
server.ssl.enabled= # Enable SSL support.
server.ssl.enabled-protocols= # Enabled SSL protocols.
server.ssl.key-alias= # Alias that identifies the key in the key store.
server.ssl.key-password= # Password used to access the key in the key store.
server.ssl.key-store= # Path to the key store that holds the SSL certificate (typically a jks file).
server.ssl.key-store-password= # Password used to access the key store.
server.ssl.key-store-provider= # Provider for the key store.
server.ssl.key-store-type= # Type of the key store.
server.ssl.protocol=TLS # SSL protocol to use.
server.ssl.trust-store= # Trust store that holds SSL certificates.
server.ssl.trust-store-password= # Password used to access the trust store.
server.ssl.trust-store-provider= # Provider for the trust store.
server.ssl.trust-store-type= # Type of the trust store.

key-store-password:生成ssl证书时设置的密钥库的口令。

如果server.port不配置,默认为443。

实例前提

获取SSL证书。作为演示,我们使用keytool生成(JDK安装目录下就有keytool)

keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  xxx
您的组织单位名称是什么?
  [Unknown]:  xxx
您的组织名称是什么?
  [Unknown]:  xxx
您所在的城市或区域名称是什么?
  [Unknown]:  beijing
您所在的省/市/自治区名称是什么?
  [Unknown]:  beijing
该单位的双字母国家/地区代码是什么?
  [Unknown]:  china
CN=xxx, OU=xxx, O=xxx, L=beijing, ST=beijing, C=china是否正确?
  [否]:  y

会在当前目录下生成一个证书:keystore.p12,同时记住你在生成证书时候输入的密钥库口令。

将keystore.p12放入resources目录下。

参数详解 

-genkey :生成key;
-alias :key的别名;
-dname:指定证书拥有者信息
    dname的值详解:
    CN(Common Name名字与姓氏)
    OU(Organization Unit组织单位名称)
    O(Organization组织名称)
    L(Locality城市或区域名称)
    ST(State州或省份名称)
    C(Country国家名称)
-storetype :密钥库的类型。常用的有JKS(默认),JCEKS(推荐),PKCS12,BKS,UBER。每个密钥库只可以是其中一种类型。
-keyalg :DSA或RSA算法(当使用-genkeypair参数),DES或DESede或AES算法(当使用-genseckey参数);
-keysize :密钥的长度为512至1024之间(64的倍数)
-keystore :证书库的名称
-validity : 指定创建的证书有效期多少天

只支持https请求

application.yml

server:
  port: 9443
  ssl:
    key-store: classpath:keystore.p12
    key-store-password: xxxxxx
    keyAlias: tomcat
    keyStoreType: PKCS12

引入必要的依赖

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

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

测试controller

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "hello world";
    }
}

测试

访问https://localhost:9443/hello     //因为是自己生成的ssl证书,所以https请求是不被客户端识别的,会报不安全,可以将其添加到浏览器的“例外”中。项目中实际使用购买的ssl不存在此问题。

 访问:http://localhost:9443/hello    //访问失败

http请求转换成https请求

简介

Spring Boot不支持通过application.properties同时配置HTTP连接器和HTTPS连接器。因为通过程序的方式配置 HTTP 协议更加简单一点,所以,Spring Boot 推荐的做法是把 HTTPS 配置在配置文件,HTTP 通过程序来配置。

application.yml

server:
  port: 9443
  ssl:
    key-store: classpath:keystore.p12
    key-store-password: 222333
    keyAlias: tomcat
    keyStoreType: PKCS12

配置类

package com.example.demo.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 TomcatHttpConfig {
    @Bean
    public Connector connector(){
        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        //Connector监听的http的端口号
        connector.setPort(8080);
        connector.setSecure(false);
        //监听到http的端口号后转向到的https的端口号
        connector.setRedirectPort(443);
        return connector;
    }

    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
        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);
            }
        };
        tomcat.addAdditionalTomcatConnectors(connector);
        return tomcat;
    }
}

测试

访问:http://localhost:8080/hello    //自动跳转到https://localhost:9443/hello

访问: https://localhost:9443/hello

同时支持http和https请求

application.yml

server:
  port: 9443
  ssl:
    key-store: classpath:keystore.p12
    key-store-password: 222333
    keyAlias: tomcat
    keyStoreType: PKCS12

配置类

法1:直接创建http

package com.example.demo.config;

import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TomcatHttpConfig {
    @Bean
    public ServletWebServerFactory serverFactory() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(createStandardConnector());
        return tomcat;
    }
    private Connector createStandardConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(8080);
        return connector;
    }
}

法2:http隐式转为https  //相对“http请求转换成https请求”,只是将false改为true

package com.example.demo.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 TomcatHttpConfig {
    @Bean
    public Connector connector(){
        // 默认采用:"org.apache.coyote.http11.Http11NioProtocol"
        Connector connector=new Connector();
        connector.setScheme("http");
        //Connector监听的http的端口号
        connector.setPort(8080);
        connector.setSecure(true);
        //监听到http的端口号后转向到的https的端口号
        connector.setRedirectPort(443);
        return connector;
    }

    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
        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);
            }
        };
        tomcat.addAdditionalTomcatConnectors(connector);
        return tomcat;
    }
}

法3.WebServerFactoryCustomizer

其他网址 

Springboot项目同时支持http和https访问 | 极客空的小博客

测试

项目启动

2020-12-14 14:41:13.697  INFO 15480 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 443 (https) 8080 (http) with context path ''

访问:http://localhost:8080/hello

访问:https://localhost:9443/hello

多个SSL证书

其他网址

Spring Boot HTTPS配置与后台调用-iTRunner-奔跑的猿-51CTO博客

编程方式支持HTTPS

其他网址

SpringBoot2.2 官方指导手册中文版3--嵌入式Web服务器
enable-multiple-connectors-in-tomcat   //SpringBoot 官网

简介

 本处通过编程来支持https,所以,原来的http不用动,可以直接支持。

放置keystore.p12

放到:src/main/java/com/exmple/demo/config路径下

application.yml

server:
  port: 9000

custom:
  https:
    server:
      port: 9443
      ssl:
        enabled: true
        key-store: keystore.p12
        key-store-password: 222333
        keyAlias: tomcat
        keyStoreType: PKCS12

配置类

package com.example.demo.config;

import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;

import java.io.File;
import java.io.IOException;

@Configuration
public class TomcatHttpsConfig {
    @Value("${custom.https.server.port: 0}")
    private Integer httpsPort;

    @Value("${custom.https.server.ssl.enabled: 0}")
    private Boolean httpsEnabled;

    @Value("${custom.https.server.ssl.key-store:'keystore.p12'}")
    private String keyStore;

    @Value("${custom.https.server.ssl.keyAlias:'tomcat'}")
    private String kayAlias;

    @Value("${custom.https.server.ssl.key-store-password:'222333'}")
    private String kayStorePassword;

    @Bean
    public ServletWebServerFactory httpsFactory() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        if (httpsEnabled) {
            tomcat.addAdditionalTomcatConnectors(createSslConnector());
        }
        return tomcat;
    }
    private Connector createSslConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
        try {
            File keyStoreFile = new ClassPathResource(keyStore).getFile();
            connector.setScheme("https");
            connector.setSecure(true);
            connector.setPort(httpsPort);
            protocol.setSSLEnabled(true);
            protocol.setKeystoreFile(keyStoreFile.getAbsolutePath());
            protocol.setKeystorePass(kayStorePassword);
            protocol.setKeyAlias(kayAlias);
            return connector;
        }
        catch (IOException ex) {
            throw new IllegalStateException("can't access keystore: [" + "keystore"
                    + "] or truststore: [" + "keystore" + "]", ex);
        }
    }
}

测试

访问:http://localhost:9000/hello

访问:https://localhost:9443/hello

其他网址

SpringBoot 2安装SSL配置HTTPS,实现HTTP自动跳转HTTPS或同时支持访问 - 码问

  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要特性 - 使用最新技术栈,社区资源丰富,基于Java 21(Core Module Support 17-21)、Spring Boot 3.2。 (Support Virtual Threads/fibre/loom) - 基于注解的动态查询(Specification),可根据需要扩充查询注解。 - 支持接口级别的功能权限,动态权限控制 - 支持数据字典,可方便地对一些状态进行管理 - 高效率开发,代码生成器可一键生成前后端代码 - 对一些常用前端组件封装:表格数据请求、数据字典等 - 前后端统一异常拦截处理,统一输出异常,避免繁琐的判断 - 使用ShardingSphere实现多数据源和读写分离。该方式针对MySQL数据库。对系统侵入性小。(只需引入依赖,并在yaml中配置数据源信息即可) [unicorn-starter](https://github.com/lWoHvYe/unicorn-starter)。 - 整合Redisson拓展Redis的功能,读写分离 - 整合消息队列RabbitMQ,实现消息通知、延迟消息,服务解耦。 - 各模块独立,基本可插拔:若只需查询注解等基础功能,只需引入Core模块即可,Beans, Security, Logging, 3rd Tools, Code Gen 模块可插拔, 除了传统To B业务,还可用于To C业务(see [OAuth2.0 part](unicorn-oauth2) ) #### 系统功能 - 用户管理:提供用户的相关配置,新增用户后,默认密码为123456 - 角色管理:对权限与菜单进行分配,菜单权限、数据权限(Draft)、接口权限(_In Progress_) - 菜单管理:已实现菜单动态路由,后端可配置化,支持多级菜单 - 部门管理:可配置系统组织架构,树形表格展示(Draft) - 岗位管理:配置各个部门的职位(Draft) - 字典管理:可维护常用一些固定的数据,如:状态,性别等 - 系统日志:记录用户操作日志与异常日志,方便开发人员定位排错 - 定时任务:整合Quartz做定时任务,加入任务日志,任务运行情况一目了然 - 代码生成:高灵活度生成前后端代码,减少大量重复的工作任务(逆向有很多方案,这种基于template的有一定的灵活性) - 邮件工具:配合富文本,发送html格式的邮件 #### 项目结构 项目采用按功能分模块的开发方式,结构如下 - `unicorn-core` 系统的Core模块,BaseClass及各种Util,(基于Multi-Release JAR Files,Support Java 17 - 21) - `unicorn-beans` 基础Beans的Definition及Configuration,To C业务可只引入该dependency - `unicorn-sys-api` Sys Module基础实体及API,方便服务拆分 - `unicorn-security` 系统权限模块,包含权限配置管理等。 - `unicorn-logging` 系统的日志模块,其他模块如果需要记录日志需要引入该模块,亦可自行实现 - `unicorn-tp-tools-kotlin` 第三方工具模块,包含:邮件、S3,可视情况引入 - `unicorn-code-gen-kotlin` 系统的代码生成模块。这部分待优化,亦非必须模块 - `unicorn-starter` [启动类(Maven),项目入口,包含模块及组件配置(DB读写分离 + Cache读写分离)](https://github.com/lWoHvYe/unicorn-starter) - `valentine-starter` 启动配置示例(Gradle),尝试Kotlin/Kotlinx - `unicorn-oauth2` OAuth2 Sample,AuthorizationServer, OAuth2Client + Gateway, ResourceServer #### 详细结构 ``` - unicorn-core 公共模块 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
SpringBoot项目可运行的方式有两种。一种是直接运行Application类,该类位于项目包的最外层。在该类中,使用@SpringBootApplication注解标记该类为SpringBoot应用程序的入口点,并在main方法中调用SpringApplication.run方法来启动项目。这种方式适用于SpringBoot默认集成了Tomcat的情况。\[1\] 另一种方式是通过使用SpringBoot项目的打包插件来构建可执行的jar包或war包。在项目的pom.xml文件中,引入SpringBoot项目的打包插件,例如spring-boot-maven-plugin。通过运行mvn package命令,可以将项目打包成可执行的jar包或war包。然后可以使用java -jar命令来运行该jar包,或将war包部署到支持Java Web容器的服务器上。\[2\]\[3\] #### 引用[.reference_title] - *1* [1.SpringBoot项目基本运行](https://blog.csdn.net/qq_31840023/article/details/106051320)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Spring Boot项目如何独立运行(springboot项目打包)](https://blog.csdn.net/weixin_45764765/article/details/106830869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT利刃出鞘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值