玖叶教程网

前端编程开发入门

springboot(二十五)springboot+undertow开启https

springboot中配置https并配置http转https

1.制作证书

第一步:进入jdk的bin目录下

第二步:keytool -genkey -alias undertowhttps -keyalg RSA -keysize 2048 -keystore E:/httpsKey.p12 -validity 365

一路下一步,最后写yes

参数说明:

genkey:表示要创建一个新的密钥。

alias:表示 keystore 的别名。

keyalg:表示使用的加密算法是 RSA ,一种非对称加密算法。

keysize:表示密钥的长度。

keystore:表示生成的密钥存放位置。

validity:表示密钥的有效时间,单位为天。

其中 D:\httpsKey.p12 是生成证书文件的地址

第三步:将证书从E盘拷贝到工程resources下

2.配置文件内添加配置

server.servlet.context-path=/demo
#开启http2协议支持
server.http2.enabled=true
#https/http端口,如果未启动https,就是http端口,
server.port=7901

################################HTTPS配置#############################################
#http转https端口,启用时改为true
server.ssl.enabled=true
server.http.port=7902
#证书生成方法参照项目目录下https证书生成.txt
server.ssl.key-store=classpath:httpsKey.p12
server.ssl.key-alias=undertowhttps
server.ssl.key-store-password=123456

其中server.port是https的端口,如果server.ssl.enabled=false,则自动切换为http端口,

server.http.port 为http端口,如果server.ssl.enabled=false,则此配置无效。

server.ssl.key-xxx的三条配置对应1步生成的证书文件。

3.添加http转https配置

package com.iscas.base.biz.config;



import io.undertow.UndertowOptions;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import io.undertow.Undertow;
import io.undertow.servlet.api.SecurityConstraint;
import io.undertow.servlet.api.SecurityInfo;
import io.undertow.servlet.api.TransportGuaranteeType;
import io.undertow.servlet.api.WebResourceCollection;


/**
 * 采用Undertow作为服务器,支持Https服务配置
 * @author zhuquanwen
 * @vesion 1.0
 * @date 2020/8/15 18:59
 * @since jdk1.8
 */
@Configuration
@ConditionalOnProperty(name = "server.ssl.enabled", havingValue = "true", matchIfMissing = false)
public class HttpsConfig {

    /**
     * http服务端口
     */
    @Value("${server.http.port}")
    private Integer httpPort;

    /**
     * https服务端口
     */
    @Value("${server.port}")
    private Integer httpsPort;

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

}

4.测试
访问http://localhost:7902/demo/[某个接口的URI]
发现http转为https并访问成功

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言