背景介绍
前端语音转写服务因浏览器安全限制问题需要使用https,后端需要同步配置ssl进行https升级,因存在一些周边历史微服务调用了本系统的部分http接口,希望同时保留原http支持。
spring boot版本:2.0.8
内嵌服务器使用undertow (Undertow是新一代轻量级高性能容器。 Undertow 提供阻塞或基于 XNIO 的非阻塞机制,它的包大小不足 1MB,内嵌模式运行时的堆内存占用只有 4MB 左右, 在基于天花板接口的测试中,综合对比tomcat、jetty、undertow,undertow相对性能更高)
一、生成证书,可以使用自签名或者从SSL证书授权中心获取。
本人使用 JDK中证书管理工具keytool来生成自签名证书。
C:\Users\Administrator>keytool -genkey -alias undertow -keyalg RSA -keystore E:\https\ssl.keystore
2、SpringBoot配置SSL
将ssl.keystore拷贝到项目resource目录下,然后修改配置文件
# Undertow服务器支持HTTPS服务
server:
port: 8443
ssl:
key-store: classpath:ssl.keystore
key-store-password: 123456
key-store-type: JKS
keyAlias: undertow
# 启用http2提速
http2:
enabled: true
# 同时指定http端口,共同支持
custom:
server:
http:
port: 8080
3、undertow开启同时监听http及https
新增UndertowHttpsConfig配置类,开启http及https端口监听
package com.iflytek.cog.aimind.config;
import io.undertow.UndertowOptions;
import org.springframework.beans.factory.annotation.Value;
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;
/**
*
* @description 采用Undertow作为服务器,支持Https服务配置
*/
@Configuration
public class UndertowHttpsConfig {
/**
* http服务端口
*/
@Value("${custom.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) -> {
//同时监听http端口
builder.addHttpListener(httpPort, "0.0.0.0");
// 开启HTTP2
builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true);
});
// 开启HTTP自动跳转至HTTPS
// 此配置注释可同时支持http及https调用
/* undertowFactory.addDeploymentInfoCustomizers(deploymentInfo -> {
deploymentInfo.addSecurityConstraint(new SecurityConstraint()
.addWebResourceCollection(new WebResourceCollection().addUrlPattern("/*"))
.setTransportGuaranteeType(TransportGuaranteeType.CONFIDENTIAL)
.setEmptyRoleSemantic(SecurityInfo.EmptyRoleSemantic.PERMIT))
.setConfidentialPortManager(exchange -> httpsPort);
});*/
return undertowFactory;
}
}
至此springboot2升级https配置结束,不配置http调整https可同时支持两种方式调用。
启动项目访问 https://ip:8443/swagger-ui.html, http://ip:8080/swagger-ui.html均可进行调试。
参考资料
Spring Boot 容器选择 Undertow 而不是 Tomcat
后续之《SpringBoot服务器压测对比(jetty、tomcat、undertow)》
Spring Boot-实现Undertow服务器同时支持HTTP2、HTTPS
来源:oschina
链接:https://my.oschina.net/sunyouling/blog/3184958