SpringBoot项目实战 - SpringBoot改成Https请求

1.申请SSL

【注意】jdk安装在C盘下面没有权限去申请,我这里jdk是安装在D盘的

  1. 进入到jdk安装目录的bin目录下
    在这里插入图片描述

  2. 打开cmd命令窗口
    在这里插入图片描述
    在这里插入图片描述

  3. 执行以下命令:

    keytool -genkey -alias https -keyalg RSA -keystore https.keystore -validity 365
    
    

    https是我起的keystore的名字。别名alias也叫https。validity 是有效期(单位为天)

    D:\java\jdk1.8.0_211\bin>keytool -genkey -alias https -keyalg RSA -keystore https.keystore -validity 365
    输入密钥库口令:    -- 这里我用的是123456
    再次输入新口令:
    您的名字与姓氏是什么?
      [Unknown]:  wts
    您的组织单位名称是什么?
      [Unknown]:  wts
    您的组织名称是什么?
      [Unknown]:  wts
    您所在的城市或区域名称是什么?
      [Unknown]:  wts
    您所在的省//自治区名称是什么?
      [Unknown]:  wts
    该单位的双字母国家/地区代码是什么?
      [Unknown]:  wts
    CN=zhang, OU=zhang, O=zhang, L=zhang, ST=zhang, C=zhang是否正确?
      []:  是
    
    输入 <https> 的密钥口令
            (如果和密钥库口令相同, 按回车):
    再次输入新口令:    -- 这里同样是输入123456
    
    Warning:
    JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore https.keystore -destkeystore https.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12

    大家应该看到最后的警告信息了:JKS 密钥库使用专用格式。建议使用 “keytool -importkeystore -srckeystore https.keystore -destkeystore https.keystore -deststoretype pkcs12” 迁移到行业标准格式 PKCS12。

    他给出的命令可以直接复制使用,粘贴到命令窗口。回车就行。

    D:\java\jdk1.8.0_211\bin>keytool -importkeystore -srckeystore https.keystore -destkeystore https.keystore -deststoretype pkcs12
    输入源密钥库口令: --还是123456
    已成功导入别名 https 的条目。
    已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消
    Warning:
    已将 “https.keystore” 迁移到 Non JKS/JCEKS。将 JKS 密钥库作为 “https.keystore.old” 进行了备份。

    完毕!然后就可以看到bin目录下有个文件。.old是头一个指令生成的,用的时候用不带old的那个。
    在这里插入图片描述

2.项目配置

2.1、keystore文件放在resource的根路径下

在这里插入图片描述

2.2、配置yml文件

ssl:
  key-store: classpath:https.keystore #路径
  key-store-password: 123456 #密码
  keyStoreType: jks #类型
  keyAlias: https #别名
  port: 7099 #https的端口号

2.3、增加配置类

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.apache.tomcat.util.http.fileupload.IOUtils;
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;
import org.springframework.core.io.ClassPathResource;

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

@Configuration
public class SSLConfig {

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

    @Value("${ssl.keyStoreType}")
    private String keyStoreType;

    @Value("${ssl.keyAlias}")
    private String keyAlias;

    @Value("${ssl.port}")
    private Integer port;

    @Bean
    public Connector createSslConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

        ClassPathResource resource = new ClassPathResource("https.keystore");
        // 临时目录
        String tempPath =System.getProperty("java.io.tmpdir") + System.currentTimeMillis()+".keystore";
        File f = new File(tempPath);
//        logger.info(".keystore目录临时存储路径" + tempPath);

        try {
            // 将key的值转存到临时文件
            IOUtils.copy(resource.getInputStream(),new FileOutputStream(f));
            connector.setScheme(keyAlias);
            connector.setSecure(true);
            connector.setPort(port);
            protocol.setSSLEnabled(true);
            // 指向临时文件
            protocol.setKeystoreFile(f.getAbsolutePath());
            protocol.setKeystorePass(password);
            protocol.setKeyAlias(keyAlias);
            protocol.setKeyPass(password);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return connector;
    }

// Diffie-Hellman密钥交换不足DH组强度漏洞处理
 @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> servletContainerCustomizer() {
        return factory -> factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
            AbstractHttp11Protocol<?> httpHandler = ((AbstractHttp11Protocol<?>) connector.getProtocolHandler());
            httpHandler.setUseServerCipherSuitesOrder(true);
            httpHandler.setSSLProtocol("TLSv1.2");
            httpHandler.setSSLHonorCipherOrder(true);
            httpHandler.setCiphers("TLS_EMPTY_RENEGOTIATION_INFO_SCSV,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384");
        });
    }

    @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;
    }
}

测试

在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值