SpringBoot整合HTTPS的项目实践
作者:duration~
1_Https 的作用
保护用户的隐私信息安全:
在 HTTP 网站数据以明文方式传输,客户的隐私极容易被盗取和泄露,而部署 SSL 证书,数据以 HTTPS 加密传输,可以保护通信不被第三方监听和窃取,从而保护用户隐私及安全。还可增加用户信任感和提升企业形象。
保护网站的安全性和完整性:
HTTPS 是安全套接层超文本传输协议,可以保证网站的信息从用户浏览器到服务器之间的传输是高强度加密传输的,是不会被第三方窃取和篡改的,还能避免网站被劫持而插入广告等,防止被钓鱼网站攻击,从而保护网站的安全性和完整性
防止被钓鱼网站攻击,有效识别网站真实身份:
http 网站会被浏览器标记 “不安全”,而安装 https 证书会取消这种 “不安全” 的警告,能增加访客信任度。同时对于安装了 OV SSL 证书或 EV SSL 证书的网站,还能向用户证明网站的真实身份,防止网站被钓鱼网站仿冒。
2_获取证书
需要在 SSL 证书颁发机构处申请或购买 SSL 证书,并下载对应的 .pem
和 .key
文件。
由于只是进行本地测试,所以这里将使用JDK1.8 开发工具包 bin 目录下的keytool.exe
工具生成ssl
密钥:
keytool -genkeypair -alias myalias -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650 -storepass your-password
- -genkeypair : 表示创建密钥。
- -alias: 保存时的别名。
- -keyalg:加密算法选择,这里使用RSA。
- -keysize:秘钥大小,是有固定要求的。
- -storetype:秘钥存储库的类型。
- -keystore:密钥的存放位置。
- -validity:有效时间,单位是天。
- -storepass:密钥库口令。
可以使用代码验证秘钥生成是否正确,如:
package org.example; import java.io.FileInputStream; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; public class KeystoreExample { public static void main(String[] args) { String keystorePath = "path/to/your/keystore.p12"; char[] keystorePassword = "your-keystore-password".toCharArray(); try (FileInputStream fis = new FileInputStream(keystorePath)) { KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); keystore.load(fis, keystorePassword); System.out.println("密钥库加载成功"); } catch (java.io.IOException e) { System.err.println("密钥库加载失败: " + e.getMessage()); } catch (NoSuchAlgorithmException | CertificateException | KeyStoreException e) { System.err.println("可能是密码错误导致的解密失败"); e.printStackTrace(); } } }
或者使用keytool.exe
工具进行验证:
keytool -list -v -keystore keystore.p12
3_配置项
application.properties
:
server.port=8081 server.error.path=/log server.servlet.session.timeout=30s # 设置应用程序的上下文路径为 /test002。这意味着所有以 /test002 开始的 URL 都将被认为属于这个应用程序。 server.servlet.context-path=/test002 server.tomcat.uri-encoding=UTF-8 server.tomcat.threads.max=500 # 表示秘钥存储库的类型 server.ssl.key-store-type=PKCS12 # 表示 SSL 密钥存储库的名称为 keystore.p12 server.ssl.key-store=classpath:ssl/keystore.p12 # 表示 SSL 密钥别名为 myalias 。 server.ssl.key-alias=myalias # 这行设置的是 SSL 密钥存储库的密码为 your-password # 密码不能特别简单,不然项目启动时会出现异常 server.ssl.key-store-password=your-password
其中,server.port 配置 HTTPS 监听端口。server.ssl.key-store 配置证书存放路径,server.ssl.key-store-password 配置证书密码,server.ssl.key-store-type 和 server.ssl.key-alias 分别指定证书的类型和别名。
pom.xml
:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>spring_Back</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.9.RELEASE</version> <relativePath/> </parent> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
4_配置类
package org.example.config; 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.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatConfig { /** * 设置 Tomcat 的Server配置 * @return */ @Bean TomcatServletWebServerFactory tomcatServletWebServerFactory(){ TomcatServletWebServerFactory myFactory = new TomcatServletWebServerFactory(){ //创建一个安全约束对象 @Override protected void postProcessContext(Context context) { SecurityConstraint constraint = new SecurityConstraint(); constraint.setUserConstraint("CONFIDENTIAL");//设置为机密级别 SecurityCollection connection = new SecurityCollection();//设置一个安全连接对象 //作用到所有路由上 connection.addPattern("/*"); //加入 connection 对象到安全路由中去 constraint.addCollection(connection); context.addConstraint(constraint); } }; //配置HTTPS连接器 myFactory.addAdditionalTomcatConnectors(createConnector()); return myFactory; } /** * 创建一个连接兼容Https请求 * @return */ private Connector createConnector(){ //tomcat 9 中 //tomcat/conf/server.xml中不要使用org.apache.coyote.http11.Http11AprProtocol //要用HTTP/1.1 Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);//"HTTP/1.1" connector.setScheme("http"); connector.setPort(8080); connector.setSecure(false);//关闭ssl检查 //设置跳转到8081 的端口 connector.setRedirectPort(8081); return connector; } }
这段代码创建了一个 Tomcat Servlet 容器,并配置了一个 HTTPS 连接器。其中 redirectConnector() 方法实现了将 HTTP 请求重定向到 HTTPS 的功能。
- 启动项目:完成上述配置后,重新启动项目,就能够在 HTTPS 协议下访问 Web 应用了。
需要注意的是,在实际生产环境中,还需要配置服务器的防火墙、负载均衡等相关组件,保证 HTTPS 的安全性和稳定性。
5_控制类
package org.example.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class FirstController { @GetMapping("/hey") public String hey(){ return "hey main"; } }
6_启动类
package org.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; @EnableAutoConfiguration @ComponentScan public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class,args); } }
此时使用 http 协议访问 8080 端口将跳转到 https 协议下的 8081端口。
到此这篇关于SpringBoot整合HTTPS的项目实践的文章就介绍到这了,更多相关SpringBoot整合HTTPS内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!