SpringBoot配置Https访问

本文涉及的产品
.cn 域名,1个 12个月
简介: SpringBoot配置Https访问

image.pngHttps在网站中的使用不断的在普及,它不仅能够增加网站的安全性,甚至连搜索引擎都会对支持Https的网站进行区别对待。

但购买Https证书还是比较昂贵的,作为个人开发者,可以自己生成一个证书,也可以在购买域名的服务商那里免费申请到一年期的证书。像我的个人网站https://www.choupangxia.com/ 就是通过域名提供商提供的免费域名。

当然,还有一些专门的免费证书提供商提供三个月免费的证书,到期重新签名,大家感兴趣可以查找一下。

本文将以通过JDK提供的工具来生成证书,并配置到Spring Boot项目中。

证书的生成

在JDK中提供了keytool的一个证书管理工具。位于%JAVA_HOME%\bin目录下,通过该工具可生成一个免费的证书。

环境变量配置完成之后,具体生成命令如下:


keytool -genkey -alias springboot-https -keyalg RSA -keysize 2048  -keystore ./https.p12 -validity 365

上述命令对应参数作用如下:

  • genkey:指定为创密钥操作。
  • alias:指定keystore的别名。
  • keyalg:指定加密算法,这里采用RSA。
  • keysize:指定密钥长度。
  • keystore 指定生成文件位置。
  • validity 指定密钥有效期,单位为天。

当执行完命令之后,需要依次设置证书的相关信息,具体操作步骤如下:


























MacBook-Pro:resources zzs$ keytool -genkey -alias springboot-https -keyalg RSA -keysize 2048  -keystore ./https.p12 -validity 365输入密钥库口令:再次输入新口令:您的名字与姓氏是什么?  [Unknown]:  Zhu您的组织单位名称是什么?  [Unknown]:  Bei您的组织名称是什么?  [Unknown]:  Bei您所在的城市或区域名称是什么?  [Unknown]:  BeiJing您所在的省/市/自治区名称是什么?  [Unknown]:  BeiJing该单位的双字母国家/地区代码是什么?  [Unknown]:  CNCN=Zhu, OU=Bei, O=Bei, L=BeiJing, ST=BeiJing, C=CN是否正确?  [否]:  是
输入 <springboot-https> 的密钥口令        (如果和密钥库口令相同, 按回车):再次输入新口令:
Warning:JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore ./https.p12 -destkeystore ./https.p12 -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

需要注意的是在中间确认是否信息正确时,要输入中文“是”,否则会重新再让输入一遍。

经过上述命令,会在对应的文件夹中生成一个名字为https.p12的文件。

Spring Boot集成

首先,将生成的文件copy到Spring Boot项目的resources目录下。本人在创建证书时稍微讨巧一下,直接将resources目录作为输出目录,因此不用再复制了。

第二步,在application.properties对证书文件进行配置。

## 设置SSL访问端口
server.port= 8443
## 设置证书名称(用于加载对应证书)
server.ssl.key-store=https.p12
## 设置证书别名
server.ssl.key-alias=springboot-https
## 设置证书密码,创建证书时设置的密码
server.ssl.key-store-password=123456

上述配置中注释内容说明了其相应的功能,如果需要查看更多的配置项,可直接查看对应的Java类org.springframework.boot.web.server.Ssl。

第三步,创建一个简单的Controller并进行访问。Controller类如下:










@RestControllerpublic class HttpsController {
  @RequestMapping("/")  public String hello(){
    return "Hello Spring-Boot-Https!";  }}

启动项目,输入日志如下:










INFO 117 --- [           main] com.secbro2.SpringbootHttpsApplication   : No active profile set, falling back to default profiles: defaultINFO 117 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8443 (https)INFO 117 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]INFO 117 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.29]INFO 117 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContextINFO 117 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 971 msINFO 117 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'INFO 117 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8443 (https) with context path ''INFO 117 --- [           main] com.secbro2.SpringbootHttpsApplication   : Started SpringbootHttpsApplication in 1.877 seconds (JVM running for 2.777)

通过日志可以看出,服务启动并监听在8443端口,而且在端口后面还显示请求类型为https。

第四步,访问对应的请求,这里在浏览器输入:https://localhost:8443,访问时首先会呈现如下页面信息:

image.png其中在浏览器网址附近的“不安全”提醒,也是因为证书没有经过认可机构签名的原因。

http跳转Https

在上述情况下,用户在浏览器输入http://localhost:8080是没办法正常访问的。这个对照有域名的情况,比如输入https://www.choupangxia.com/可以正常访问,而输入http://www.choupangxia.com/就无法正常访问。

这种情况对用户来说是不合理的,我们应该让用户输入https://www.choupangxia.com/时也可以访问网站,只不过这中间会自动将网站跳转至Https的访问链接。

在Spring Boot中的具体配置如下:










































@Configurationpublic class HttpsConfig {
  @Bean  public ConfigurableServletWebServerFactory webServerFactory() {
    // 手动实例化TomcatServletWebServerFactory对象并重写其postProcessContext方法    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {      @Override      protected void postProcessContext(Context context) {        // 创建安全约束组件        SecurityConstraint constraint = new SecurityConstraint();        // 设置用户约束条件,参数必须以下三种模式:NONE、INTEGRAL、CONFIDENTIAL。        // NONE表示被指定的Web资源不需要任何传输保证;        // Integral表示客户机与服务器之间传送的数据在传送过程中不会被篡改;        // Confidential表示数据在传送过程中被加密。        // 大多数情况下,INTEGRAL或CONFIDENTIAL是使用SSL实现。        constraint.setUserConstraint("CONFIDENTIAL");
        SecurityCollection collection = new SecurityCollection();        collection.addPattern("/");        constraint.addCollection(collection);        context.addConstraint(constraint);      }    };
    factory.addAdditionalTomcatConnectors(httpsConnector());    return factory;  }
  private Connector httpsConnector() {    Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);    connector.setScheme("http");    // Connector监听的http的端口号    connector.setPort(8080);    connector.setSecure(false);    // 监听到http的端口号后转向到的https的端口号    connector.setRedirectPort(8443);    return connector;  }}

上述代码中主要通过重新自定义了内置的Tomcat容器,通过创建TomcatServletWebServerFactory对象,并重写其postProcessContext方法来设置安全访问约束。

同时重新定义了一个Connector,并通过@Bean注入到容器当中。

此时,启动项目,日志中关于监听端口和访问类型已经变为:

Tomcat initialized with port(s): 8443 (https) 8080 (http)
……
Tomcat started on port(s): 8443 (https) 8080 (http) with context path ''

同时支持8080端口的http和8433端口的https,同时,如果访问http://localhost:8080,最终浏览器上的地址会跳转到https://localhost:8433。

补充

上述实例中,在postProcessContext方法中通过添加constraint来约束所有的请求都进行跳转。当然,也可以针对定制化的请求设置不同的跳转方式,然后通过context.addConstraint方法多次添加。

比如,在此示例前面新增如下代码,则静态资源访问时不会进行相应的跳转:







SecurityConstraint securityConstraint = new SecurityConstraint();securityConstraint.setUserConstraint("NONE");SecurityCollection collection = new SecurityCollection();collection.addPattern("/static/*");securityConstraint.addCollection(collection);context.addConstraint(securityConstraint);

如果复制使用上述代码时注意变量名重新命名,避免冲突。

至此,关于SpringBoot项目中配置Https访问讲解完毕。

目录
相关文章
|
4天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
20 0
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
1月前
|
Java 数据库连接 Maven
springBoot:项目建立&配置修改&yaml的使用&resource 文件夹(二)
本文档介绍了如何创建一个基于Maven的项目,并配置阿里云仓库、数据库连接、端口号、自定义启动横幅及多环境配置等。同时,详细说明了如何使用YAML格式进行配置,以及如何处理静态资源和模板文件。文档还涵盖了Spring Boot项目的`application.properties`和`application.yaml`文件的配置方法,包括设置数据库驱动、URL、用户名、密码等关键信息,以及如何通过配置文件管理不同环境下的应用设置。
|
29天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
35 0
|
8天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
20 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
7天前
|
Java 数据库连接
SpringBoot配置多数据源实战
第四届光学与机器视觉国际学术会议(ICOMV 2025) 2025 4th International Conference on Optics and Machine Vision
33 8
|
5天前
|
Java 数据库连接 数据库
springboot启动配置文件-bootstrap.yml常用基本配置
以上是一些常用的基本配置项,在实际应用中可能会根据需求有所变化。通过合理配置 `bootstrap.yml`文件,可以确保应用程序在启动阶段加载正确的配置,并顺利启动运行。
12 2
|
10天前
|
JSON JavaScript 前端开发
springboot中使用knife4j访问接口文档的一系列问题
本文介绍了在Spring Boot项目中使用Knife4j访问接口文档时遇到的一系列问题及其解决方案。作者首先介绍了自己是一名自学前端的大一学生,熟悉JavaScript和Vue,正在向全栈方向发展。接着详细说明了如何解决Swagger请求404错误,包括升级Knife4j依赖、替换Swagger 2注解为Swagger 3注解以及修改配置类中的代码。最后,针对报JS错误的问题,提供了删除消息转换器代码的解决方法。希望这些内容能对读者有所帮助。
|
11天前
|
Web App开发 算法 应用服务中间件
nginx开启局域网https访问
【10月更文挑战第22天】为了调试WebRTC功能,需要在局域网内搭建HTTPS协议。具体步骤包括:在已部署Nginx和安装OpenSSL的环境中生成私钥、证书签名请求和自签名证书;将生成的文件放置到Nginx的证书目录并修改Nginx配置文件,最后重启Nginx服务。注意,自签名证书不受第三方机构认可,如需正式使用,需向CA申请签名。
|
15天前
|
安全 网络安全 数据安全/隐私保护
政务内网实现https访问教程
政务内网实现HTTPS访问需经过多个步骤:了解HTTPS原理,选择并申请适合的SSL证书,配置SSL证书至服务器,设置端口映射与访问控制,测试验证HTTPS访问功能,注意证书安全性和兼容性,定期备份与恢复。这些措施确保了数据传输的安全性,提升了政务服务的效率与安全性。