You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring WebFlux WebClient配置双向TLS时无法发送客户端证书报403如何解决

问题根源

你代码的核心问题是Reactor Netty的HttpClient是不可变设计,所有配置修改都会返回一个全新的HttpClient实例,你原有代码中没有接收httpClient.secure()方法的返回值,导致你写的mTLS配置完全没有生效,发起请求时用的还是默认无客户端证书的HttpClient实例,所以握手阶段无法提供客户端证书触发403错误。

修复方案

你可以直接复用之前已经验证过可以正常工作的sslContext()构建逻辑,同时修正HttpClient的配置写法即可:

private WebClient getMtlsWebClient() throws Exception {
  // 复用你原有WebServiceTemplate用过的、已验证可用的SSLContext构建逻辑
  SSLContext validSslContext = sslContext();

  // 必须接收secure方法返回的新HttpClient实例,配置才会生效
  HttpClient httpClient = HttpClient.create()
      .secure(spec -> spec.sslContext(
          SslContextBuilder.forClient()
              .sslContextProvider(validSslContext)
              .build()
      ));

  return WebClient
      .builder()
      .clientConnector(new ReactorClientHttpConnector(httpClient))
      .build();
}

如果你希望保留当前手写KeyManagerFactory的写法,只要修正HttpClient的配置写法即可:

private WebClient getMtlsWebClient() {
  // 链式调用所有配置方法,直接接收最终的HttpClient实例
  HttpClient httpClient = HttpClient.create()
      .secure(spec -> {
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        keyStore.load(new FileInputStream(ResourceUtils.getFile(keyStorePath)), keyStorePass.toCharArray());
        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        keyManagerFactory.init(keyStore, keyStorePass.toCharArray());
        spec.sslContext(SslContextBuilder.forClient()
            .keyManager(keyManagerFactory)
            .build());
      });

  return WebClient
      .builder()
      .clientConnector(new ReactorClientHttpConnector(httpClient))
      .build();
}

额外排查点

如果修改配置后仍然有问题,请确认你导入的SslContextBuilder是io.netty.handler.ssl.SslContextBuilder,不要误导入Apache HttpClient或其他包的同名类。

内容的提问来源于stack exchange,提问作者Marco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:15:03