前言:在springboot项目中我们的接口通常是以http提供给外部的,如何将其变为https请求呢
1.HTTP 和 HTTPS 请求的区别
-
HTTP:明文传输,数据在传输过程中容易被窃听、篡改或伪造。例如,用户名、密码等敏感信息可能会被中间人攻击者获取。
-
HTTPS:基于 SSL/TLS 协议加密传输,数据在客户端和服务器之间传输时被加密,能够有效防止数据被窃听和篡改。即使数据被截获,攻击者也无法解密内容。
总结来说,HTTPS 是 HTTP 的安全版本,通过加密和证书机制提供了更高的安全性,适合处理敏感信息(如登录、支付等)的场景。
要将 HTTP 请求转换为 HTTPS 请求,你需要在 Spring Boot 项目中配置 SSL。以下是详细的步骤:
1. 生成 SSL 证书
你可以使用 Java 的 keytool
工具来生成一个自签名的 SSL 证书。打开终端或命令提示符,执行以下命令:
keytool -genkeypair -alias myapp -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore myapp.p12 -validity 3650
在执行过程中,你需要设置一些信息,例如密钥库密码、姓名、组织单位等。请记住你设置的密钥库密码,后续配置会用到。
2. 将生成的证书文件放置到项目中
将生成的 myapp.p12
文件复制到 Spring Boot 项目的 src/main/resources
目录下。
3. 配置 application.properties
或 application.yml
文件
使用 application.properties
在 src/main/resources
目录下的 application.properties
文件中添加以下配置:
server.port=8080
server.ssl.key-store=classpath:myapp.p12
server.ssl.key-store-password=your_keystore_password
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=myapp
请将 your_keystore_password
替换为你在生成证书时设置的密钥库密码。
使用 application.yml
如果你使用的是 application.yml
文件,可以添加以下配置:
server:
port: 8080
ssl:
key-store: classpath:myapp.p12
key-store-password: your_keystore_password
key-store-type: PKCS12
key-alias: myapp
4. 修改代码以支持 HTTPS
在 HttpstestApplication.java 中,你可以添加一个配置类来强制将 HTTP 请求重定向到 HTTPS 请求。以下是修改后的代码:
package com.hengbao.httpstest;
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.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class HttpstestApplication {
public static void main(String[] args) {
SpringApplication.run(HttpstestApplication.class, args);
}
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(redirectConnector());
return tomcat;
}
private Connector redirectConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8443); // 如果你希望重定向到 8443 端口
return connector;
}
}
5. 测试 HTTPS 请求
启动 Spring Boot 应用程序后,你可以使用浏览器或工具(如 Postman)来测试 HTTPS 请求。在浏览器中输入 https://localhost:8080/......
,由于使用的是自签名证书,浏览器可能会提示不安全。你可以选择继续访问。