首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Spring WebClient中添加客户端证书?

如何在Spring WebClient中添加客户端证书?
EN

Stack Overflow用户
提问于 2019-10-02 06:38:17
回答 2查看 7.4K关注 0票数 7

我正在构建一个Spring,它在内部调用托管在不同服务器上的REST WebClient。为此,我需要向每个握手请求发送公钥(.cert)和私钥(.key)。我不确定如何使用Spring WebClient做到这一点。

我试着设置WebClient,但无法添加这种轻松的代码

WebClient生成器

代码语言:javascript
运行
复制
this.webCLient = WebClient.builder()
                .baseUrl("https://some-rest-api.com")
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON.toString())
                .build();

实际呼叫

代码语言:javascript
运行
复制
this.webClient.get()
                .uri("/getData")
                .exchange()
                .flatMap(clientResponse -> {
                    System.out.println(clientResponse);
                    return clientResponse.bodyToMono(MyClass.class);
                });

因为没有证书添加到请求中,所以我在日志中得到了握手错误

代码语言:javascript
运行
复制
javax.net.ssl.SSLException: Received fatal alert: handshake_failure

如何将这些证书添加到WebClient请求中,这样我就不会收到这个错误?我有证书,但不确定如何添加。

EN

回答 2

Stack Overflow用户

发布于 2020-08-27 15:07:59

我花了一些时间才找到托马斯答案中缺失的部分。

这就是它:

代码语言:javascript
运行
复制
public static SslContext getTwoWaySslContext() {
        
    try(FileInputStream keyStoreFileInputStream = new FileInputStream(ResourceUtils.getFile(clientSslKeyStoreClassPath));
        FileInputStream trustStoreFileInputStream = new FileInputStream(ResourceUtils.getFile(clientSslTrustStoreClassPath));   
        ) {
        KeyStore keyStore = KeyStore.getInstance("jks");
        keyStore.load(keyStoreFileInputStream, clientSslKeyStorePassword.toCharArray());
        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
        keyManagerFactory.init(keyStore, clientSslKeyStorePassword.toCharArray());
            
        KeyStore trustStore = KeyStore.getInstance("jks");
        trustStore.load(trustStoreFileInputStream, clientSslTrustStorePassword.toCharArray());
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
        trustManagerFactory.init(trustStore);
            
        return SslContextBuilder.forClient()
            .keyManager(keyManagerFactory)
            .trustManager(trustManagerFactory)
            .build();
            
    } catch (Exception e) {
        log.error("An error has occurred: ", e);
    }
        
    return null;
}


HttpClient httpClient = HttpClient.create().secure(sslSpec -> sslSpec.sslContext(SslUtil.getTwoWaySslContext()));
ClientHttpConnector clientHttpConnector = new ReactorClientHttpConnector(httpClient);
WebClient webClient = webClientBuilder
    .clientConnector(clientHttpConnector)
    .baseUrl(baseUrl)
    .build();

享受吧!

票数 4
EN

Stack Overflow用户

发布于 2019-10-03 07:37:23

摘自文档Spring Webclient - Reactor Netty

要访问ssl配置,您需要提供一个带有自定义sslContext的自定义netty HttpClient。

代码语言:javascript
运行
复制
SslContext sslContext = SslContextBuilder
        .forClient()
        // build your ssl context here
        .build();

HttpClient httpClient = HttpClient.create().secure(sslSpec -> sslSpec.sslContext(sslContext));

WebClient webClient = WebClient.builder()
    .clientConnector(new ReactorClientHttpConnector(httpClient))
    .build();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58193135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档