springboot如何配置ssl支持https

 更新时间:2024年10月16日 17:04:55   作者:GKFreewind  
在SpringBoot应用中配置SSL支持HTTPS需要创建KeyStore并在application.yml中进行相应配置,首先,使用java的keytool工具创建KeyStore,这涉及到设置密钥对、指定密钥算法(RSA)、密钥大小(2048位)、密钥库名称、证书有效期等,创建KeyStore后

springboot 配置ssl支持https

以下信息请根据实际情况修改!!!

创建keystore

KeyStore是一个用于存储和管理加密密钥和证书的存储库。

它通常被用于各种应用和系统中,以保护敏感数据和确保安全通信。

KeyStore可以被看作是一种加密的“保险箱”,用于存放密钥、密钥对和证书等安全相关的数据。

通过java的keytool创建keyStore

keytool -genkeypair -alias mykey -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 365 -storepass mypassword -keypass mypassword -dname "CN=localhost, OU=MyOrg, O=MyOrg, L=MyCity, ST=MyState, C=MyCountry"

解释各个参数:

  • -genkeypair:生成密钥对(公钥和私钥)。
  • -alias mykey:指定密钥的别名(在密钥库中引用密钥时使用)。
  • -keyalg RSA:指定密钥算法(这里是 RSA)。
  • -keysize 2048:指定密钥大小(位)。
  • -keystore keystore.jks:指定密钥库文件的名称(如果文件不存在,则创建它)。
  • -validity 365:指定证书的有效期(天)。
  • -storepass mypassword:指定密钥库的存储密码。
  • -keypass mypassword:指定密钥的密码(如果与密钥库密码相同,可以省略)。
  • -dname:指定证书的主题信息(DN,Distinguished Name),包括通用名称(CN)、组织单位(OU)、组织(O)、城市(L)、州/省(ST)和国家(C)。

在springboot的application.yml配置文件中配置相关内容

server:  
  port: 8443 # HTTPS的默认端口是443,但443端口通常需要管理员权限才能绑定  
  ssl:  
    key-store: classpath:keystore.jks # 密钥库的位置,相对于classpath  对应keytool生成时的-keystore
    key-store-type: JKS # 密钥库类型,默认为JKS  
    key-store-password: mypassword # 密钥库密码  对应keytool生成时的-storepass
    key-alias: mykey # 密钥别名  对应keytool生成时的-alias
    key-password: mypassword # 密钥别名  对应keytool生成时的-keypass
    # 如果你使用的是PKCS12密钥库,则需要如下配置,相应信息根据实际情况修改
    # key-store-type: PKCS12  
    # key-store: classpath:keystore.p12  
    # key-store-password: yourpassword  
    # 如果需要,还可以配置信任库  
    # trust-store: classpath:truststore.jks  
    # trust-store-password: trustpassword  
    # trust-store-type: JKS  
    # 启用SSL客户端认证(可选)  
    # client-auth: need

springboot应用支持https实现

jdk自带证书生成

切换到jdk目录下bin目录,执行

  • keytool -genkey -alias (别名)
  • -dname "CN=(姓名),OU=(组织单位名称),O=(组织名称),L=(城市名称),ST=(省),C=(国家)"
  • -storetype (密钥仓库类型)
  • -keyalg (生证书的算法名称) -keysize (密钥长度,证书大小)
  • -keystore (指定生成证书的位置和证书名称)
  • -validity (证书有效期,天单位)

列:

keytool -genkey -alias lyc -dname "CN=l,OU=SC,O=yd,L=lc,ST=sc,C=CN" -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 365

配置https协议

springboot+tomcat,增加代码configuration配置项如下:

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 TomcatHttpsConfig {

    @Bean
    public Connector connector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setSecure(false);
        connector.setPort(80);
        connector.setRedirectPort(443);
        return connector;
    }

    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector) {
        TomcatServletWebServerFactory webServerFactory = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection securityCollection = new SecurityCollection();
                securityCollection.addPattern("/*");
                securityConstraint.addCollection(securityCollection);
                context.addConstraint(securityConstraint);
            }
        };
        webServerFactory.addAdditionalTomcatConnectors(connector);
        return webServerFactory;
    }

}

springboot+undertow,增加代码configuration配置项如下:

import io.undertow.Undertow;
import io.undertow.UndertowOptions;
import io.undertow.servlet.api.SecurityConstraint;
import io.undertow.servlet.api.SecurityInfo;
import io.undertow.servlet.api.TransportGuaranteeType;
import io.undertow.servlet.api.WebResourceCollection;
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;

public class UndertowHttpsConfig {
    private int httpPort = 80;
    private int httpsPort = 443;

    @Bean
    public ServletWebServerFactory undertowFactory() {
        UndertowServletWebServerFactory undertowFactory = new UndertowServletWebServerFactory();
        undertowFactory.addBuilderCustomizers((Undertow.Builder builder) -> {
            builder.addHttpListener(httpPort, "0.0.0.0");
            // 开启HTTP2
            builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true);
        });
        undertowFactory.addDeploymentInfoCustomizers(deploymentInfo -> {
            // 开启HTTP自动跳转至HTTPS
            deploymentInfo.addSecurityConstraint(new SecurityConstraint()
                    .addWebResourceCollection(new WebResourceCollection().addUrlPattern("/*"))
                    .setTransportGuaranteeType(TransportGuaranteeType.CONFIDENTIAL)
                    .setEmptyRoleSemantic(SecurityInfo.EmptyRoleSemantic.PERMIT))
                    .setConfidentialPortManager(exchange -> httpsPort);
        });
        return undertowFactory;
    }
}

完成以上配置之后,启动项目

访问:https://localhost:443/test/test实现springboot的https协议访问

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring项目中Ordered接口的应用之全局过滤器(GlobalFilter)的顺序控制

    Spring项目中Ordered接口的应用之全局过滤器(GlobalFilter)的顺序控制

    在Spring框架,尤其是Spring Cloud Gateway或Spring WebFlux项目中,Ordered接口扮演着重要的角色,特别是在实现全局过滤器(GlobalFilter)时,用于控制过滤器执行的优先级,下面将介绍如何在Spring项目中使用Ordered接口来管理Global Filter的执行顺序,需要的朋友可以参考下
    2024-06-06
  • 两万字详解Java Sring String的常见操作以及StringBuffer StringBuilder的区别

    两万字详解Java Sring String的常见操作以及StringBuffer StringBuilder的区别

    本篇文章带你认识Sring、String的常见操作和StringBuffer 与StringBuilder的区别(字符串详解),对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Spring boot按日切分spring boot的nohup.out日志文件的方法

    Spring boot按日切分spring boot的nohup.out日志文件的方法

    过大的日志文件维护起来存在诸多问题,所以最好是能够按日或按大小切分日志文件,下面小编给大家带来了Spring boot按日切分spring boot的nohup.out日志文件的方法,一起看看吧
    2018-08-08
  • Java装饰者模式的示例详解

    Java装饰者模式的示例详解

    装饰者模式:在不改变原有对象的基础之上,动态的将功能附加到对象上,提供了继承更有弹性的替代方案,也体现了开闭原则。本文将通过示例详细讲解一下装饰者模式,需要的可以参考一下
    2022-02-02
  • Java toArray() 方法 的使用

    Java toArray() 方法 的使用

    toArray()是 Java 集合框架中定义在接口里的一个方法,用于将集合转换为数组,本文就来介绍一下Java toArray()方法的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • SpringBoot使用CommandLineRunner和ApplicationRunner执行初始化业务方式

    SpringBoot使用CommandLineRunner和ApplicationRunner执行初始化业务方式

    这篇文章主要介绍了SpringBoot使用CommandLineRunner和ApplicationRunner执行初始化业务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 一文搞懂Java中的线程安全与线程同步

    一文搞懂Java中的线程安全与线程同步

    线程安全指在被多个线程访问时,程序可以持续进行正确的处理。线程同步是指程序中用于控制不同线程间操作发生相对顺序的机制。本文将通过示例详细为大家讲讲二者的使用,需要的可以参考一下
    2022-06-06
  • java操作mongodb之多表联查的实现($lookup)

    java操作mongodb之多表联查的实现($lookup)

    这篇文章主要介绍了java操作mongodb之多表联查的实现($lookup),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Springboot无法注入service问题

    Springboot无法注入service问题

    这篇文章主要介绍了Springboot无法注入service的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Hibernate中获取Session的两种方式代码示例

    Hibernate中获取Session的两种方式代码示例

    这篇文章主要介绍了Hibernate中获取Session的两种方式代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论