Saltar al contenido

Spring 5 WebClient usando ssl

Este escrito fue evaluado por expertos para que tengas la garantía de la veracidad de nuestra esta reseña.

Solución:

Parece que Spring 5.1.1 (Spring boot 2.1.0) eliminado HttpClientOptions de ReactorClientHttpConnector, por lo que no puede configurar opciones mientras crea una instancia de ReactorClientHttpConnector

Una opción que funciona ahora es:

val sslContext = SslContextBuilder
            .forClient()
            .trustManager(InsecureTrustManagerFactory.INSTANCE)
            .build()
val httpClient = HttpClient.create().secure  t -> t.sslContext(sslContext) 
val webClient = WebClient.builder().clientConnector(ReactorClientHttpConnector(httpClient)).build()

Básicamente, mientras creamos el HttpClient, estamos configurando el insegurosslContexty luego pasar este httpClient para su uso en ReactorClientHttpConnector a nivel mundial.

La otra opcion es configurar TcpClient con sslContext inseguro y utilícelo para crear HttpClient ejemplo, como se ilustra a continuación:

val sslContext = SslContextBuilder
            .forClient()
            .trustManager(InsecureTrustManagerFactory.INSTANCE)
            .build()
val tcpClient = TcpClient.create().secure  sslProviderBuilder -> sslProviderBuilder.sslContext(sslContext) 
val httpClient = HttpClient.from(tcpClient)
val webClient =  WebClient.builder().clientConnector(ReactorClientHttpConnector(httpClient)).build()

Para más información:

  • https://docs.spring.io/spring/docs/5.1.1.RELEASE/spring-framework-reference/web-reactive.html#webflux-client-builder-reactor
  • https://netty.io/4.0/api/io/netty/handler/ssl/util/InsecureTrustManagerFactory.html

Actualización: versión Java del mismo código

SslContext context = SslContextBuilder.forClient()
    .trustManager(InsecureTrustManagerFactory.INSTANCE)
    .build();
                
HttpClient httpClient = HttpClient.create().secure(t -> t.sslContext(context));

WebClient wc = WebClient
                    .builder()
                    .clientConnector(new ReactorClientHttpConnector(httpClient)).build();

Vea un ejemplo de uso inseguro de TrustManagerFactory que confía en todos los certificados X.509 (incluidos los autofirmados) sin ninguna verificación. La nota importante de la documentación:

Nunca use este TrustManagerFactory en producción. Es puramente con fines de prueba y, por lo tanto, es muy inseguro.

@Bean
public WebClient createWebClient() throws SSLException 
    SslContext sslContext = SslContextBuilder
            .forClient()
            .trustManager(InsecureTrustManagerFactory.INSTANCE)
            .build();
    ClientHttpConnector httpConnector = HttpClient.create().secure(t -> t.sslContext(sslContext) )
    return WebClient.builder().clientConnector(httpConnector).build();

Tuve que editar esto, para acomodar los cambios de spring-boot 2.0-> 2.1.

Otra forma, si desea programar el código de producción, es crear un bean de primavera como tal, que modifique el WebClient inyectado, usando la configuración del servidor de arranque de primavera para donde están el almacén de confianza y el almacén de claves. En el cliente, solo necesita proporcionar el almacén de claves, si está utilizando 2-way-ssl. No estoy seguro de por qué ssl-stuff no está preconfigurado y es fácilmente inyectable, similar a la realmente genial configuración del servidor de arranque de primavera.

import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
.
.
.

  @Bean
  WebClientCustomizer configureWebclient(@Value("$server.ssl.trust-store") String trustStorePath, @Value("$server.ssl.trust-store-password") String trustStorePass,
      @Value("$server.ssl.key-store") String keyStorePath, @Value("$server.ssl.key-store-password") String keyStorePass, @Value("$server.ssl.key-alias") String keyAlias) 

      return (WebClient.Builder webClientBuilder) ->  UnrecoverableKeyException e) 
            throw new RuntimeException(e);
          
        ;
  

Aquí la parte, donde usa el Webclient:

import org.springframework.web.reactive.function.client.WebClient;

@Component
public class ClientComponent 

  public ClientComponent(WebClient.Builder webClientBuilder, @Value("$url") String url) 
    this.client = webClientBuilder.baseUrl(solrUrl).build();
  

Te mostramos las comentarios y valoraciones de los usuarios

Si tienes alguna desconfianza y capacidad de mejorar nuestro artículo eres capaz de dejar una crítica y con placer lo analizaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *