SpringBoot 网站升级为 HTTPS
Posted zhongzz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 网站升级为 HTTPS相关的知识,希望对你有一定的参考价值。
下面就从 HTTPS 证书申请、网站 HTTPS 的配置、HTTP 重定向到 HTTPS 三个方面教你将一个 SpringBoot 网站升级为安全的 HTTPS。
证书申请
目前国内提供免费 HTTPS 证书的云服务商并不多,一向不大方的腾讯这次倒是很大方,腾讯云提供了免费的亚洲诚信品牌免费型 DV 版 SSL 证书,注册认证过的用户即可免费申请 20 个免费证书。
创建证书
选择证书
首先你需要注册认证腾讯云,然后进入到 SSL证书
管理菜单,点击申请证书
按钮,然后在弹框中选择免费版DVSSL证书
,点击确定
按钮。
完善域名信息
然后填写你的域名信息,通用名称
即为你要申请证书的域名,申请邮箱
填写个人常用邮箱即可,如下图所示:
完成域名验证
选择DNS验证后,会看到以下信息:
此时进入到域名提供商的后台,添加一条解析即可:
最后回到证书验证界面,点击验证
即可认证成功,认证成功后坐等审核通过即可,一般审核时间为几分钟到几小时不等。
审核完成后,就可以在证书列表界面下载证书了,下载的到的文件是一个 ZIP 压缩包,压缩包里面包含了各种常用的网站托管软件所需的证书格式:
网站配置
拷贝密钥
SpringBoot 默认使用 Tomcat 进行网站托管,因此从压缩包中的 Tomcat 目录将证书(文件后缀为jks
)拷贝到 SpringBoot 工程的 resources
目录下即可:
更新配置
证书拷贝完整后,打开配置文件 application.yml
,然后修改网站的端口为 443
,key-store-password
可以在证书压缩包的 Tomcat 文件夹下的文本文件中找到,此外配置一下 SSL 证书的类型以及路径等信息即可:
server:
address: 0.0.0.0
port: 443
ssl:
enabled: true
key-store: classpath:luooqi.com.jks
key-store-password: xxxxxxxxxxxx
key-store-type: JKS
至此便可以启动运行项目,可以在地址栏输入 https://yourdomain
即可访问,在服务器上发布后可以看到如下效果:
将 HTTP 请求重定向到HTTPS
网站虽然升级到了 HTTPS,但是很多老用户并不知情,当他们访问旧版的 HTTP 地址时会发现网站已经无法访问:
因此最佳的做法是将 HTTP 重定向到 HTTPS,下面就教你如何通过代码实现。
添加 HTTP 端口配置
首先在配置文件中添加自定义的 HTTP 端口配置:
http-port: 80
建立重定向关系
新建一个配置类 HttpsConfiguration
,在类中将配置文件中自定义的 HTTP 端口和 HTTPS 的端口都注入进来,然后创建一个新的 Connector
来处理 HTTP 请求,同时设置 Connector
的端口为注入的 HTTP 端口,重定向端口(setRedirectPort
)为新的 HTTPS 端口。
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.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HttpsConfiguration {
@Value("${http-port}")
private int port;
@Value("${server.port}")
private int sslPort;
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(redirectConnector());
return tomcat;
}
private Connector redirectConnector() {
Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
connector.setScheme("http");
connector.setPort(port);
connector.setSecure(false);
connector.setRedirectPort(sslPort);
return connector;
}
}
特别注意
上面代码中需要特别注意的是,TomcatServletWebServerFactory
必须要在其 postProcessContext
方法中添加 HTTP 的匹配范围 addPattern("/*")
,否则重定向无效。
以上是关于SpringBoot 网站升级为 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章