记录Spring Boot使用HTTPS协议

一、使用jdk自带的 keytools 创建证书

1、打开CMD窗口,输入命令

keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "D:\tomcat.keystore"

2、按照提示操作

输入密钥库口令:    //输入密码不显示
再次输入新口令:    //输入密码不显示
您的名字与姓氏是什么?
  [Unknown]:  xy
您的组织单位名称是什么?
  [Unknown]:  xy
您的组织名称是什么?
  [Unknown]:  xy
您所在的城市或区域名称是什么?
  [Unknown]:  sz
您所在的省/市/自治区名称是什么?
  [Unknown]:  gd
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=xy, OU=xy, O=xy, L=sz, ST=gd, C=cn是否正确?
  [否]:  y

输入 <tomcat> 的密钥口令
        (如果和密钥库口令相同, 按回车):    //再次输入刚才的密码
再次输入新口令:      //再次输入刚才的密码

二、在application.yml配置文件,添加SSL

1)本文测试了以下几个格式证书格式

证书文件格式:.keystore、.p12、.jks、.pfx

证书类型:JKS(.keystore)、PKCS12(.p12、.jks、.pfx)宁愿不配置,也不要配置错,不然会报错

    ssl:
        # 证书文件
        key-store: D:\tomcat.keystore
        # 证书密码
        key-store-password: 123456
        # 证书类型(可以不配置)
        key-store-type: JKS
        # 证书别名(可以不配置)
        key-alias: tomcat

 2)配置完成后,就可以启动 Spring Boot 项目了,此时如果我们直接使用 Http 协议来访问接口,就会看到如下错误(解决方案:查看请求地址,将http改为https):

3)生成的 https 证书不被浏览器认可,直接点击【高级】继续访问就可以了(实际项目中只需要更换一个被浏览器认可的 https 证书即可)

 三、配置http请求自动跳转为https

方案一:启动类添加如下代码

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        factory.addAdditionalTomcatConnectors(tomcatConnector());
        return factory;
    }

    private Connector tomcatConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        //http端口号,可以自行指定(不能和其它已经使用的端口重复,否则会报错)
        //设置http的监听端口为80端口,这样访问的时候也可以不用带上端口号
        connector.setPort(8080);
        connector.setSecure(false);
        //监听到的http的端口号后转向到https的端口号,可以自行指定
        connector.setRedirectPort(7002);
        return connector;
    }

 方案二:添加配置文件

package com.yeffc.framework.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.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @version V1.0
 * @Description:
 * @Author: Mr.Jie
 * @Date: 2022/1/6 17:02
 */
@Configuration
public class TomcatConfig {
    /**获取配置端口*/
    @Value("${server.port}")
    private Integer httpPort;

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        factory.addAdditionalTomcatConnectors(tomcatConnector());
        return factory;
    }

    private Connector tomcatConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        //http端口号,可以自行指定(不能和其它已经使用的端口重复,否则会报错)
        //设置http的监听端口为80端口,这样访问的时候也可以不用带上端口号
        connector.setPort(8080);
        connector.setSecure(false);
        //监听到的http的端口号后转向到https的端口号,可以自行指定
        connector.setRedirectPort(httpPort);
        return connector;
    }
}

 访问:http://localhost:8080/fs_servers会自动跳转到:https://localhost:7002/fs_servers/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值