Spring-Boot2.X 中 HTTPS 配置

Spring-Boot2.X 中 HTTPS 配置

网上资料的错误

在Spring Boot2.0以上配置嵌入式Servlet容器时EmbeddedServletContainerCustomizer类不存在,经查询发现被WebServerFactoryCustomizer替代.
使用WebServerFactoryCustomizer接口替换EmbeddedServletContainerCustomizer组件完成对嵌入式Servlet容器的配置

准备工作

  1. 阿里云ECS
  2. 域名
  3. SSL证书 (用于支持https)
  4. springboot项目 (本文采用jar方式打包)

购买阿里云ECS配置安全组规则

  1. 如果不配置安全组规则,我们将没法访问我们阿里云服务器 ,安全组中的 80/80443/443 必须配置,因为只有这里配置了才能支持httphttps访问我们的网站
  2. 授权对象最好填 0.0.0.0/0

配置https 申请SSL证书

申请SSL证书是实现https必不可少的

购买申请SSL证书地址

在品牌里面你会发现 都没有免费证书 GeoTrust GlobalSign CFCA Symantec
选择 Symantec 品牌 , 再选择证书类型:分别有 专业版OV SSL 通配符DV SSL 增强型OV SSL 就是没有免费的证书
证书类型选择 增强型OV SSL 你会发现又多出了几个证书 其中就有 免费型DV SSL 然后买就对了

通常审核10分钟左右就行,如果资料不全或者不真实可能就久些
审核通过后,就去下载相应的SSL证书,由于springboot内置的是tomcat,所以这里下载tomcat对应的SSL证书

解压后会得到 .pfx .txt 后缀的文件夹 , 将.pfx复制到项目资源文件根目录并配置 配置文件.yml后缀配置文件为例

1
2
3
4
5
6
7
http:
port: 80
server:
port: 443
ssl:
key-store: classpath:*.pfx
key-store-password: password

key-store 填写复制到项目资源文件根目录的 .pfx 文件路径 . 因为在资源文件根目录所以填写 classpath: + 文件名.pfx
key-store-password 填写解压.txt后缀的文本内容

HTTP自动转向HTTPS

在springboot启动类 Application 加上以下配置代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;

import static org.springframework.boot.web.embedded.tomcat.TomcatReactiveWebServerFactory.DEFAULT_PROTOCOL;

@SpringBootApplication
public class Application {
// 监听的http请求的端口,需要在application配置中添加http.port=端口号 如80
@Value("${http.port}")
Integer httpPort;

//正常启用的https端口 如443
@Value("${server.port}")
Integer httpsPort;

public static void main(String[] args) {
SpringApplication.run(BbsApplication.class, args);
}

// 拦截所有请求
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = 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);
}
};
tomcat.addAdditionalTomcatConnectors(httpConnector());
return tomcat;
}

//配置http转https
@Bean
public Connector httpConnector() {
Connector connector = new Connector(DEFAULT_PROTOCOL);
connector.setScheme("http");
//Connector监听的http的端口号
connector.setPort(httpPort);
connector.setSecure(false);
//监听到http的端口号后转向到的https的端口号
connector.setRedirectPort(httpsPort);
return connector;
}

/**
* //这里设置默认端口为443,即https的,如果这里不设置,会https和http争夺80端口
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
@Override
public void customize(ConfigurableWebServerFactory factory) {
factory.setPort(443);
}
};
}
}