springboot中配置https并配置http转https
1.制作证书
第一步:进入jdk的bin目录下
第二步:keytool -genkey -alias undertowhttps -keyalg RSA -keysize 2048 -keystore E:/httpsKey.p12 -validity 365
一路下一步,最后写是
参数说明:
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并访问成功