Spring-Boot2.X 中 HTTPS 配置
网上资料的错误
在Spring Boot2.0以上配置嵌入式Servlet容器时EmbeddedServletContainerCustomizer类不存在,经查询发现被WebServerFactoryCustomizer替代.
使用WebServerFactoryCustomizer接口替换EmbeddedServletContainerCustomizer组件完成对嵌入式Servlet容器的配置
准备工作
- 阿里云ECS
- 域名
- SSL证书 (用于支持https)
- springboot项目 (本文采用jar方式打包)
购买阿里云ECS配置安全组规则
- 如果不配置安全组规则,我们将没法访问我们阿里云服务器 ,安全组中的
80/80
和 443/443
必须配置,因为只有这里配置了才能支持http
和https
访问我们的网站
- 授权对象最好填
0.0.0.0/0
申请SSL证书是实现https必不可少的
在品牌里面你会发现 都没有免费证书 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 { @Value("${http.port}") Integer httpPort;
@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; }
@Bean public Connector httpConnector() { Connector connector = new Connector(DEFAULT_PROTOCOL); connector.setScheme("http"); connector.setPort(httpPort); connector.setSecure(false); connector.setRedirectPort(httpsPort); return connector; }
@Bean public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() { return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() { @Override public void customize(ConfigurableWebServerFactory factory) { factory.setPort(443); } }; } }
|