Spring Boot Flux应用X509认证被跳过问题求助
问题排查与解决方案
核心原因
日志提示No peer certificates found in SslInfo的本质是服务器未配置双向SSL认证,没有要求客户端提供证书,导致SSL连接建立时客户端未传递证书,X509认证流程直接跳过,因此你的authenticationService不会被调用。
步骤1:配置双向SSL(关键)
Spring Boot WebFlux默认仅启用单向SSL(服务器向客户端发送证书),需添加以下配置开启双向认证:
# 要求客户端必须提供证书,可选值:required(强制)/want(可选)/none(禁用) server.ssl.client-auth=required # 配置信任库,用于验证客户端证书合法性(需包含客户端证书的CA或直接导入客户端证书) server.ssl.trust-store=classpath:your-truststore.jks server.ssl.trust-store-password=your-truststore-password # 原有的服务器证书配置保持不变 server.ssl.key-store=classpath:your-keystore.jks server.ssl.key-store-password=your-keystore-password server.ssl.key-password=your-key-password
注意:你复制的正常应用证书,需确保信任库配置与原应用一致,否则服务器会拒绝客户端证书。
步骤2:简化并验证Security配置
你的SecurityWebFilterChain存在冗余授权规则,可简化为:
@Bean public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { String endpoint1 = "/first-endpoint-i-want-to-authorize"; String endpoint2 = "/second-endpoint-i-want-to-authorize"; http.authorizeExchange(exchanges -> exchanges .pathMatchers(endpoint1, endpoint2).authenticated() .anyExchange().permitAll()) .x509(x509 -> x509 .principalExtractor(authenticationService) .authenticationManager(authenticationService)) .httpBasic(Customizer.withDefaults()) .securityContextRepository(NoOpServerSecurityContextRepository.getInstance()); return http.build(); }
冗余的
NegatedServerWebExchangeMatcher可通过anyExchange().permitAll()替代,逻辑完全一致且更清晰。
步骤3:验证客户端证书传递
使用curl测试是否能正确传递客户端证书:
curl --cert client-cert.pem --key client-key.pem --cacert server-ca.pem https://localhost:8441/first-endpoint-i-want-to-authorize
若请求触发authenticationService的方法调用,说明SSL配置生效;若仍报错,检查:
- 客户端证书是否由信任库中的CA签发
- 证书格式是否与配置的store类型匹配(如JKS/P12)
- 请求端口是否指向应用配置的8441端口
额外检查
确认authenticationService正确实现以下接口:
ReactiveAuthenticationManager:处理X509认证逻辑X509PrincipalExtractor:从客户端证书提取用户标识
虽然当前问题根源不在此,但配置正确才能保证认证最终成功。
内容的提问来源于stack exchange,提问作者user2630579
相关产品推荐
相关产品推荐

