玖叶教程网

前端编程开发入门

SpringBoot如何配置Https访问

众所周知,越来越多的服务在使用https协议进行交互,而对于Java项目来说,使用Spring Boot搭建服务已然是默认的选项,而springboot内置的tomcat容器,默认是使用http协议的,那如何将它转换为https协议?

理论

在我们转换http协议到https协议前,我们先来简单了解下https协议的前世今生。 https是 Hypertext Transfer Protocol Secure 的首字母缩写,是在http协议的基础之上,加入了 SSL/TLS 协议,准确的说法是 TLS1.2 或者 TLS1.3 协议。这里,我们一起看下 SSL/TLS 协议的发展历史:


实践

在我们对 SSL/TLS 协议有了基本了解后,我们下一步,就通过 JDK 自带的工具 keytool 生成一个带有证书的 keystore。

本文演示的JDK版本为17,Spring Boot 版本为3.1.0,其他版本同理。

在使用 keytool 时,其实并不需要死记硬背命令、参数,通过 --help 可以很容易的理解,每个命令需要哪些参数,比如:

而对于诸如 keyalg, storetype 等参数支持的选项,可以查看 JDK 源码或者 Oracle 官方文档: 参数列表,比如 -keyalg 支持的加密算法类型:

接下来,我们执行如下命令生成一个包含私钥的 keystore

batch复制代码keytool -genkeypair -alias springboot -keyalg EC -keysize 256 -validity 365 -keypass 123456 -keystore EC_keystore.jks -storepass 123456 -storetype jks

参数解释:

java复制代码-alias springboot // 指定生成的 keystore 中 entry 也就是证书的别名
-keyalg EC // 指定加密算法,RSA 是大家最常用的,这里使用其它算法演示
-keysize 256 // 指定加密算法的长度,不同算法,对应着不同的长度限制,比如 DSA,长度不能超过2048
-validity 365 // 指定证书的有效期
-keypass 123456 // 指定证书的密码
-keystore EC_keystore.jks // 指定 keystore 文件名,默认路径就是执行命令行的当前路径
-storepass 123456 // 指定 keystore 的密码
-storetype jks // 指定 keystore 的类型

在我们生成 keystore 的过程中,keytool 会根据参数做提示,比如:

Warning:JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore EC_keystore.jks -destkeystore EC_keystore.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

所以我们可以根据建议,做适当调整。


keystore 有了之后,将其拷贝到 springboot 项目中,并在启动的日志中,观察到,springboot 已经成功加载了 keystore:

打开浏览器,访问 rest url,我们可以看到,浏览器已经对我们的请求地址进行了拦截,并告知不安全的地址,因为这个证书是我们通过keytool自签名生成的,并不是浏览器认可的CA:

点击 Processeds,就可以看到服务端的返回数据了。

总结

其实将springboot配置成https的方式很简单,重点是其背后的 SSL/TLS 协议,涉及到的对称加密、非对称加密、证书、CA,在下一篇中,我们将通过 wireshark,对基于 https 协议的交互进行抓包,来了解针对 https 请求,tcp 都做了什么。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言