Spring Security 请求时获取Spring Restcontroller中客户端的ssl证书

q5iwbnjs  于 2023-03-12  发布在  Spring
关注(0)|答案(1)|浏览(207)

我们正在使用netty和Spring RestController为我们的应用程序建立一个相互的TLS连接。在TLS握手之后,当RestController接收到一个https请求(作为同一个TLS会话的一部分)时,我们如何获得客户端的SSL证书?
这是验证证书的subjectAltName字段中的某些信息所必需的。
使用的React器版本:一月二十三日
其他相关库版本(例如,netty、...):

  • Spring启动启动器webflux:2.7.4
  • Spring启动器:2.7.4()
  • Spring启动器-json:2.7.4
  • Spring启动器电抗器网:2.7.4

在restcontroller的路由方法中,我们需要通道相关信息

enyaitl3

enyaitl31#

您可以尝试从将ServerWebExchange传递给控制器方法开始。
然后获取ServerHttpRequest并调用getSslInfo()。从getSslInfo()文档:

/**
 * Return the SSL session information if the request has been transmitted
 * over a secure protocol including SSL certificates, if available.
 * @return the session information, or {@code null} if none available
 * @since 5.0.2
 */

SslInfo可以获得X509Certificate[]

@GetMapping
public Mono<Void> get(ServerWebExchange serverWebExchange) {
    ServerHttpRequest request = serverWebExchange.getRequest();

    Optional<X509Certificate[]> peerCertificates =
            Optional.ofNullable(request.getSslInfo())
                    .map(SslInfo::getPeerCertificates);

    if (peerCertificates.isPresent()) {
        ...
    }

    return Mono.empty();
}

如果您希望将此逻辑放在请求到达控制器之前**,则可以实现自己的WebFilter并在其中写入所需的逻辑
WebFilter方法:

Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain);

另外,据我所知,Spring Security有一些验证X509证书的特性。

相关问题