Spring Boot WebClient获取SSL/TLS证书

06odsfpq  于 2023-03-02  发布在  Spring
关注(0)|答案(1)|浏览(385)

java.net在其API中有一个简单的getServerCertificates(示例如下)。我在reactor-netty中寻找类似的操作,如果没有,请在spring-boot/webflux/HttpClient的任何其他React式API中寻找。
这个操作(客户端读证书)在reactor-netty中似乎不可能。是吗?如果不是,在另一个spring-boot组件中有替代方法来做这个吗?

package com.example.readCertificate.service;

import java.net.URL;
import java.securiiity.cert.Certificate;
import javax.net.ssl.HttpsURLConnection;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class ShowCert {
    private Logger logger = LogManager.getLogger();

    public void showCert(String url) {
        try {
            URL destinationURL = new URL(url);
            HttpsURLConnection connection = (HttpsURLConnection) destinationURL.openConnection();
            connection.connect();
            Certificate[] certificates = connection.getServerCertificates();
            for (Certificate certificate : certificates) {
                logger.info("certificate is:" + certificate);
            }
        } catch (Exception e) {
            logger.error(e);
        }
    }

}
q3qa4bjr

q3qa4bjr1#

在Spring WebFlux的WebClient中,我们通常使用netty作为后端。我们提供了一个bean ReactorClientHttpConnector,在其中我们创建了netty http-client。
为了处理SSL,netty使用通道管道中的处理程序。
在这里,我将回调事件doOnConnected()并访问SSL处理程序和SSLSession
SSLSession提供了方法getPeerCertificates(), getLocalCertificates(),因此我们可以在这里访问证书。

@Bean
public ReactorClientHttpConnector reactorClientHttpConnector() {
    return new ReactorClientHttpConnector(
            HttpClient.create()
                    .doOnConnected(connection -> {
                        ChannelPipeline pipeline = connection.channel().pipeline();
                            
                        Optional.ofNullable(pipeline)
                                .map(p -> p.get(SslHandler.class))
                                .map(SslHandler::engine)
                                .map(SSLEngine::getSession)
                                .ifPresent(sslSession -> {
                                    try {
                                        Certificate[] peerCertificates = sslSession.getPeerCertificates();
                                        if (Objects.nonNull(peerCertificates)) {
                                            Stream.of(peerCertificates)
                                                    .forEach(System.out::println);
                                        }
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                });
                    })
    );
}

并创建您的WebClient:

@Bean
public WebClient httpsClient() {
    return WebClient.builder()
            .clientConnector(reactorClientHttpConnector())
            .baseUrl("https://secured-resource.com)
            .build();
}

然后,在使用此httpsClientbean进行https调用时,您应该会在控制台中看到结果

相关问题