技术文档

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

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-security

org.springframework.boot

spring-boot-starter-jetty

```

这些依赖项将提供 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 根证书的详细内容,希望对你有所帮助。