如何在Spring RestClient中禁用SSL证书校验?
一个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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。