如何在Spring RestClient中禁用SSL证书校验?

后端开发 2026-07-10

一个RestClient需要通过HTTPS与使用自签名TLS证书的主机通信。

我在StackOverflow上看到过一个类似的问题,在Spring RestTemplate中禁用SSL证书验证,它使用的是RestTemplate。

不过我的问题是,如何用现代的RestClient来实现呢?

@Bean
RestClient restClient(RestClient.Builder builder) {
    return builder.build()
}

解决方案

在不改变Spring默认设置的前提下,采取最小化的修改,除了自定义的SSL验证策略。适用于Spring 6.1+。在Spring 7中,请将同一包中的 ClientHttpRequestFactorySettings 替换为 HttpClientSettings

import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
import org.springframework.boot.ssl.SslBundle;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestClient;

@Configuration
class RestClientConfiguration {
    @Bean
    RestClient restClient(RestClient.Builder builder) {
        final SslManagerBundle sslManagerBundle = SslManagerBundle.from(new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }

            public void checkClientTrusted(X509Certificate[] certs, String authType) {
                // noop
            }

            public void checkServerTrusted(X509Certificate[] certs, String authType) {
                // noop
            }
        });
        final SslBundle sslBundle = SslBundle.of(null, null, null, "TLS", sslManagerBundle);
        final ClientHttpRequestFactorySettings settings = new ClientHttpRequestFactorySettings(
                null,
                null,
                null,
                sslBundle
        );
        final ClientHttpRequestFactory requestFactory = ClientHttpRequestFactoryBuilder.detect().build(settings);
        return builder.requestFactory(requestFactory).build();
    }
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章