本文将介绍在 Spring Boot 中,怎样配置 HTTPS 协议。主要步骤如下:
(1)生成自签名证书,这里仅仅是为了测试使用,正式环境会购买有效的证书;
(2)创建一个简单的 Spring Boot Web 项目,开发一个简单的接口,方便后续测试;
(3)在 application.yml 文件中配置 https 协议;
直接使用 java 自带的 keytool 工具,可以在命令行输入如下命令:
keytool -?
查看 keytool 的帮助信息;如果提示 “'keytool' 不是内部或外部命令,也不是可运行的程序或批处理文件。”,则需要将 java 的 bin 目录添加到系统 path 环境变量中;如果 keytool 工具存在,则执行下面命令:
C:\> keytool -genkey -alias springboot -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore test.p12 -validity 3650 输入密钥库口令: /* 注意:这个口令需要记住,后续在SpringBoot中配置需要用到 */ 再次输入新口令: 您的名字与姓氏是什么? [Unknown]: hxstrive 您的组织单位名称是什么? [Unknown]: hxstrive 您的组织名称是什么? [Unknown]: hxstrive 您所在的城市或区域名称是什么? [Unknown]: chengdu 您所在的省/市/自治区名称是什么? [Unknown]: sichuan 该单位的双字母国家/地区代码是什么? [Unknown]: cn CN=hx, OU=hx, O=hx, L=chengdu, ST=sichuan, C=cn是否正确? [否]: y
根据提示,完成上面信息的填写。你会发现在当前目录多了一个 test.p12 文件,将该文件拷贝到项目的 resources 目录就可以了。
keytool 工具部分参数说明:
-alias 指定证书别名,如:springboot
-storetype 指定密钥仓库类型,如:PKCS12
-keyalg 指定生成证书的算法,如:RSA
-keysize 指定证书大小,如:2048
-keystore 指定证书文件存储路径,如:test.p12
-validity 指定证书的有效期,如:3650
怎样创建 Spring Boot 项目这里不再赘述,下面是项目的启动类(也只有这么一个类)。代码如下:
package com.huangx.springboot.springboot2_https; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Date; @RestController @SpringBootApplication public class Springboot2HttpsApplication { public static void main(String[] args) { SpringApplication.run(Springboot2HttpsApplication.class, args); } // 定义一个接口,返回固定字符串和当前日期 // 便于浏览器测试 @GetMapping("/") public String index() { return "Index Home " + new Date().toString(); } }
打开 application.yml 文件,添加如下配置信息:
server: port: 8080 # SSL config ssl: # 这里配置我们证书的文件名,该证书位于 resources 目录下面 key-store: test.p12 # 生成证书的密钥库口令,见 “生成自签名证书” # 如果把 key-store-password 错误的写成了 key-password,则抛如下错误: # java.io.IOException: failed to decrypt safe contents entry: # javax.crypto.BadPaddingException: Given final block not properly padded key-store-password: aaaaaa # 指定密钥仓库类型 key-store-type: PKCS12 # 指定密钥别名 key-alias: springboot
如果你是 application.properties 属性配置文件,则添加如下配置信息:
server.port=8080 # SSL config # 这里配置我们证书的文件名,该证书位于 resources 目录下面 server.ssl.key-store=test.p12 # 生成证书的密钥库口令,见 “生成自签名证书” server.ssl.key-store-password=aaaaaa # 指定密钥仓库类型 server.ssl.key-store-type=PKCS12 # 指定密钥别名 server.ssl.key-alias=springboot
完成上面配置后,运行 Spring Boot 程序。如果看见如下输出信息,则说明启动成功了:
2021-07-01 13:01:55.150 INFO 13036 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 2021-07-01 13:01:55.696 INFO 13036 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (https) with context path '' 2021-07-01 13:01:55.710 INFO 13036 --- [ restartedMain] c.h.s.s.Springboot2HttpsApplication : Started Springboot2HttpsApplication in 3.047 seconds (JVM running for 6.124) 2021-07-01 13:02:05.800 INFO 13036 --- [nio-8080-exec-6] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2021-07-01 13:02:05.801 INFO 13036 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2021-07-01 13:02:05.803 INFO 13036 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms
打开浏览器访问 “https://localhost:8080” 地址,效果如下图: