1. 导入证书
腾讯云证书
腾讯云下载的证书,解压后的文件结构为:

SpringBoot 只需要 tomcat 下的文件即可
tomcat下的文件:

keystorePass.txt :保存证书密码
www...jks:JKS 证书
注意:
这里的 JKS 证书下载下来时的名称为:域名.jks。要在 SpringBoot 中使用的话,必须将文件名修改为不含 "." 的名称,否则将证书文件放入 resources 文件夹下后,因为证书名称含有多个 "." ,SpringBoot 将无法找到证书文件
将 JKS 证书拷贝至 SpringBoot 项目的 resources 文件夹下,与 application.properties 同级
2. 修改配置文件
配置文件加上以下配置项:
注意:如果原来有启动端口的设置,可以先改为 443
# ssl配置
# https加密端口号 443
# 服务器运行端口
server.port=443
# SSL证书路径 一定要加上classpath,证书名只能有一个后缀,否则找不到不到文件,如:name.cn.jks 则找不到
server.ssl.key-store=classpath:证书名.jks
# SSL证书密码
server.ssl.key-store-password=证书密码
# 证书类型
server.ssl.key-store-type=JKS
# 证书别名,建议设置为证书域名,否则可能报错(Invalid keystore format),如:www.baidu.cn
server.ssl.key-alias=证书别名
3. 修改 Maven 打包配置
jks 文件在 resources 中存放时,Maven 打包过程中可能通过编译、压缩等破坏该文件,所以添加以下配置,打包时不处理 jks 文件
<build>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<!-- 避免 https 证书文件被修改 -->
<nonFilteredFileExtension>jks</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
</build>
启动测试
通过上面的配置服务器已经可以启动了,运行 SpringBoot 应用即可启动。
启动后访问浏览器 127.0.0.1:8080 会提示 Bad Request,为什么呢?
----问:为什么要访问 8080 端口,不是配置端口为 443 了吗?
----答:使用 SSL 证书后,配置的端口已经是 HTTPS 的访问端口了。
这里没有加协议头,默认使用 HTTP 访问。
再想想,当我们的项目不配置运行端口时,默认的是不是 8080 呢?
所以这里也一样,默认的 HTTP 端口就是 8080。
因为默认浏览器使用 http 协议发起请求,但是服务器配置 SSL 证书后就只接受 HTTPS 的请求了。
再次测试,浏览器访问:https://127.0.0.1 ,访问成功,HTTPS 默认使用 443 端口,所以不用加端口号。
这就有问题了,我们输域名地址时,谁会故意加上 HTTPS?
所以就有了第三步,重定向
3.将 HTTP 请求重定向到 HTTPS 请求
重写启动类
@SpringBootApplication
public class HelpStudyApplication {
// http 请求端口,线上配置为 80
@Value("${server.port.http}")
private int serverPortHttp;
// 服务器运行端口,等同于 HTTPS 请求端口,线上 443
@Value("${server.port}")
private int serverPortHttps;
public static void main(String[] args) {
SpringApplication.run(HelpStudyApplication.class, args);
}
/**
* http重定向到https
*/
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat;
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(Http11NioProtocol.class.getName());
connector.setScheme("http");
//Connector监听的http的端口号
connector.setPort(serverPortHttp);
connector.setSecure(false);
//监听到http的端口号后转向到的https的端口号
connector.setRedirectPort(serverPortHttps);
return connector;
}
}
重要变量都加了注释,使用上面的启动类还要在配置文件中添加以下配置项:
# 配置服务器运行端口
server.port=443
# http 监听端口,用于重定向到 https 端口
server.port.http=80
经过上面的配置后,就可以启动 SpringBoot 应用了
启动后,浏览器访问 127.0.0.1 会发现会自动重定向到 https://127.0.0.1
本文介绍了如何在SpringBoot应用中导入腾讯云SSL证书并开启HTTPS访问。首先,需要将证书文件放入resources目录,并修改配置文件设置端口。接着,调整Maven打包配置,确保证书文件不受影响。然后,通过重写启动类实现HTTP请求自动重定向到HTTPS。完成这些步骤后,应用就能成功支持HTTPS访问了。
1631

被折叠的 条评论
为什么被折叠?



