springboot配置https根证书
时间 : 2024-11-25 07:00:01浏览量 : 1
在现代的网络环境中,确保网站的安全性至关重要。HTTPS 是一种通过在 HTTP 协议上添加 SSL/TLS 加密层来实现安全通信的协议。为了在 Spring Boot 应用中配置 HTTPS 并使用根证书,以下是详细的步骤和相关代码示例。
一、生成根证书
1. 使用 OpenSSL 工具生成根证书和私钥。在命令行中执行以下命令:
```
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt
```
这将生成一个 2048 位的私钥 `rootCA.key` 和一个自签名的根证书 `rootCA.crt`。
2. 将根证书安装到受信任的证书存储中。在 Windows 系统中,将 `rootCA.crt` 文件导入到“受信任的根证书颁发机构”存储中;在 Linux 系统中,将 `rootCA.crt` 文件复制到 `/etc/ssl/certs/` 目录下。
二、配置 Spring Boot 应用
1. 在 Spring Boot 项目的 `pom.xml` 文件中添加以下依赖项:
```xml
```
这些依赖项将提供 Web 服务、安全功能和 Jetty 服务器。
2. 在 Spring Boot 应用的配置文件(`application.properties` 或 `application.yml`)中添加以下配置:
```yaml
server:
port: 443
ssl:
key-store: classpath:keystore.jks
key-store-password: password
key-store-type: JKS
key-alias: tomcat
```
这里设置了服务器的端口为 443(HTTPS 端口),并指定了密钥库(`keystore.jks`)、密钥库密码(`password`)和密钥别名(`tomcat`)。
3. 创建密钥库并导入证书。在 Spring Boot 项目的资源目录下创建一个 `keystore.jks` 文件,并使用以下命令将根证书导入到密钥库中:
```
keytool -import -alias root -file rootCA.crt -keystore keystore.jks -storepass password -noprompt
```
这将把根证书 `rootCA.crt` 导入到密钥库 `keystore.jks` 中,并设置别名 `root` 和密码 `password`。
4. 配置安全过滤器。在 Spring Boot 应用的配置类中添加以下代码:
```java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").authenticated()
.and()
.httpBasic()
.and()
.addFilterBefore(new CustomAuthenticationFilter(), BasicAuthenticationFilter.class);
}
@Bean
public CustomAuthenticationFilter customAuthenticationFilter() throws Exception {
CustomAuthenticationFilter filter = new CustomAuthenticationFilter();
filter.setAuthenticationManager(authenticationManager());
return filter;
}
}
```
这段代码配置了基本的 HTTP 身份验证,并添加了一个自定义的身份验证过滤器 `CustomAuthenticationFilter`。
三、实现自定义身份验证过滤器
1. 创建一个自定义的身份验证过滤器 `CustomAuthenticationFilter`,继承自 `OncePerRequestFilter`:
```java
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
private final AuthenticationManager authenticationManager;
public CustomAuthenticationFilter(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
// 从请求中获取用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
// 创建用户名密码认证令牌
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
// 进行身份验证
return authenticationManager.authenticate(authenticationToken);
}
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
// 身份验证成功,设置安全上下文
SecurityContextHolder.getContext().setAuthentication(authResult);
chain.doFilter(request, response);
}
}
```
这个过滤器从请求中获取用户名和密码,创建一个 `UsernamePasswordAuthenticationToken`,然后使用 `AuthenticationManager` 进行身份验证。如果身份验证成功,将设置安全上下文。
四、启动应用
完成上述配置后,启动 Spring Boot 应用。应用将在 443 端口上监听 HTTPS 请求,并使用根证书进行加密通信。
通过以上步骤,我们成功地在 Spring Boot 应用中配置了 HTTPS 并使用了根证书。这样可以确保网站的通信安全,防止数据被窃取和篡改。在实际应用中,你可以根据需要进一步扩展和定制安全配置,以满足你的具体需求。
请注意,在生产环境中,建议使用由受信任的证书颁发机构颁发的证书,而不是自签名证书。自签名证书在某些浏览器中可能会引发安全警告,而由证书颁发机构颁发的证书则具有更高的可信度。
以上就是关于 Spring Boot 配置 HTTPS 根证书的详细内容,希望对你有所帮助。