SpringBoot配置https并实现http访问自动跳转https(自定义证书)

本文详细介绍了如何在SpringBoot项目中集成HTTPS并配置Elasticsearch,包括生成证书、配置SSL、解决POST请求报错等问题。通过具体步骤和代码示例,帮助读者实现安全的HTTPS通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、准备

elasticsearch-7.3.2(下载解压即可用)

SpringBoot2.1.2

二、生成证书

使用elasticsearch-certutil生成springboot.p12证书

elasticsearch-certutil官方文档

1.创建ca认真中心

cmd进入bin目录:D:\backup\elk\elastic_stack_7.3.2\elasticsearch-7.3.2\bin

elasticsearch-certutil ca

会提示输入文件路径和密码

 

ouput file :C:\Users\admin\Desktop\ca\ca.p12

文件在第2步中使用

2.使用ca创建证书

elasticsearch-certutil cert --ca  C:\Users\admin\Desktop\ca\ca.p12 --name springboot

记住刚才输入的密码,并输入导出路径

得到文件

三、SpringBoot配置

将springboot.p12拷贝到resources目录

application.properties

#端口号
#https端口
server.port=8080
#http端口
server.httpPort=8081
#日志配置
logging.config=classpath:logback-spring.xml
#服务器名称
serverName=test_server
#配置ssl
server.ssl.enabled=true
server.ssl.key-store=classpath:springboot.p12
server.ssl.key-store-password=123456
server.ssl.key-store-type=PKCS12
# 证书别名
server.ssl.key-alias=springboot

http重定向到https,配置类

package com.asyf.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.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SSLConfig {

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

    @Bean(name = "connector")
    public Connector connector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(httpPort);
        connector.setSecure(false);
        connector.setRedirectPort(httpsPort);
        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;
    }
    
}

 四、启动测试

1.重定向测试:访问http://127.0.0.1:8081/test?num=1hi跳转到https://127.0.0.1:8080/test?num=1

2.https测试:直接访问https://127.0.0.1:8080/test?num=1

五、POST请求报错解决

1.http重定向到https,POST请求变为GET请求

2.解决办法:更改SSLConfig

 @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.addMethod(DEFAULT_PROTOCOL);//http重定向到https,POST请求变为GET请求,增加这个之后get请求不会跳转到https
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(connector);
        return tomcat;
    }

注意:增加这个之后get请求不会跳转到https

3.有没有完美的办法?

欢迎留言

<think>好的,我现在需要帮助用户解决在Spring Boot配置HTTPS证书的问题。首先,我要回顾一下用户提供的引用内容,看看里面有哪些有用的信息。 用户提到了五个引用,都是关于Spring Boot配置HTTPS的。引用1讲的是双向认证,引用2和5是关于SSL配置的YAML示例,引用3是Tomcat的配置,引用4提到使用keytool生成证书。用户的问题是如何在Spring Boot配置和安装HTTPS证书,所以重点应该放在生成证书配置Spring BootSSL属性上。 首先,步骤应该是生成证书。根据引用4,可以使用keytool生成自签名证书。需要详细说明这个步骤,比如命令参数。然后,配置Spring Boot的application.yml或properties文件,设置key-store、密码、类型等信息,如引用2和5中的示例。可能还需要提到端口配置,通常HTTPS是443,但测试时可以用其他端口如8443。 需要注意证书的存放路径,通常是放在resources目录下,比如classpath:keystore.jks。同时,要解释各个参数的含义,比如key-store-password和key-password的区别,可能用户会混淆这两个。另外,是否需要同时支持HTTPHTTPS?引用5中提到了自定义HTTP端口,可能需要配置HTTP重定向到HTTPS,但用户的问题可能暂时不需要,但可以作为优化点提到。 还要考虑证书类型,比如JKS或PKCS12。现在Java推荐使用PKCS12,但有些教程可能还是用JKS,需要指出区别。引用1和3提到了Tomcat的配置,但用户的问题是关于Spring Boot,可能不需要深入Tomcat的配置,除非用户有特殊需求。 可能的问题:生成证书时的常见错误,比如密码不一致,路径错误,证书别名不正确。测试时用浏览器访问https://localhost:端口,可能会有安全警告,因为自签名证书不受信任,需要用户手动信任。 然后,根据用户的要求,生成相关问题。比如如何生成证书,如何配置多域名证书,如何强制HTTPS,或者如何处理证书过期等。 需要确保步骤清晰,代码块正确,特别是YAML配置的缩进。比如引用2中的server.ssl配置,要正确展示结构。同时,示例代码中的证书名称和密码要一致,避免用户复制时出错。 最后,检查是否覆盖了所有关键点:生成证书配置SSL、测试验证、常见问题。可能还需要提到双向认证,但用户的问题主要是单向HTTPS,所以可能作为相关问题提到。 现在组织回答的结构: 1. 生成证书:使用keytool命令,示例命令。 2. 配置Spring Boot:application.yml中的SSL部分,参数解释。 3. 验证配置:启动应用,访问测试。 4. 可选配置HTTP重定向到HTTPS。 5. 相关问题:生成证书的更多细节、优化配置、常见错误处理等。 确保使用中文,数学公式用$...$,独立公式用$$...$$(如果有的话),但这里可能不太需要,但要注意其他格式要求,如代码块用三个反引号,引用标识正确添加。</think>### Spring Boot配置HTTPS证书教程 #### 一、生成HTTPS证书 1. **使用`keytool`生成自签名证书** 通过Java自带的`keytool`工具生成JKS格式证书: ```bash keytool -genkeypair -alias myhttps -keyalg RSA -keysize 2048 -validity 365 -keystore myhttps.jks -storetype JKS ``` - `-alias`: 证书别名(如`myhttps`) - `-keystore`: 证书存储路径(如`myhttps.jks`) - `-validity`: 证书有效期(天) - 生成过程中需设置**密钥库密码**和**密钥密码**(建议一致)[^4]。 2. **将证书放入项目** 将生成的`myhttps.jks`文件复制到Spring Boot项目的`src/main/resources`目录下。 --- #### 二、配置Spring BootSSL 在`application.yml`中添加SSL配置: ```yaml server: port: 8443 # HTTPS端口 ssl: enabled: true key-store: classpath:myhttps.jks # 证书路径 key-store-password: 123456 # 密钥库密码 key-password: 123456 # 密钥密码 key-store-type: JKS # 证书类型 key-alias: myhttps # 证书别名 ``` - **关键参数说明**: - `key-store`: 证书文件路径(`classpath:`表示从资源目录加载)。 - `key-store-password`和`key-password`: 生成证书时设置的密码。 - `key-alias`: 必须与生成证书时指定的别名一致[^2][^5]。 --- #### 三、验证HTTPS访问 1. 启动Spring Boot应用。 2. 浏览器访问`https://localhost:8443/your-endpoint`,出现安全警告时选择继续(因自签名证书不受信任)。 3. 若看到应用接口响应,说明HTTPS配置成功[^3]。 --- #### 四、可选配置HTTP自动跳转HTTPS 若需同时支持HTTP重定向到HTTPS,添加以下配置: ```yaml server: port: 8080 # HTTP端口 # 配置Tomcat连接器 spring: main: web-application-type: servlet ``` 添加`TomcatServletWebServerFactory`配置类: ```java @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); } }; tomcat.addAdditionalTomcatConnectors(httpConnector()); return tomcat; } private Connector httpConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(8080); connector.setSecure(false); connector.setRedirectPort(8443); # 重定向到HTTPS端口 return connector; } ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值