2017-07-31 36 views
2

WebClientの使用例を探しています。 Spring 5 WebClientを使用してhttpsと自己署名入り証明書を使用してRESTサービスを照会することです。Spring 5 WebClient(sslを使用)

答えて

4

insecure TrustManagerFactoryの例では、検証なしですべてのX.509証明書(自己署名を含む)を信頼しています。ドキュメントからの重要な注意:

このTrustManagerFactoryを実稼働環境で使用しないでください。純粋にテスト目的のためであり、したがって非常に安全ではありません。

@Bean 
public WebClient createWebClient() throws SSLException { 
    SslContext sslContext = SslContextBuilder 
      .forClient() 
      .trustManager(InsecureTrustManagerFactory.INSTANCE) 
      .build(); 

    ClientHttpConnector httpConnector = new ReactorClientHttpConnector(opt -> opt.sslContext(sslContext)); 
    return WebClient.builder(httpConnector).build(); 
} 
+0

あなたの答えはありがたいです。また、読み取りと接続でタイムアウトを設定する必要があります。どのように達成できますか? – Seb

0

別の方法、あなたはどこトラストストアとキーストアの春ブートサーバーから設定を使用して、注入されたWebクライアントを変更するなどのような春のBeanを作成するために、生産のコードをされている番組にしたい場合あります。クライアントでは、2-way-sslを使用している場合は、キーストアを指定する必要があります。確かに、本当にクールなバネブートサーバ設定と同じように、なぜssl-stuffが事前設定されずに簡単に注入可能でないのか。

ここ
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 new WebClientCustomizer() { 

     @Override 
     public void customize(Builder webClientBuilder) { 
     SslContext sslContext; 
     try { 
      KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
      trustStore.load(new FileInputStream(ResourceUtils.getFile(trustStorePath)), trustStorePass.toCharArray()); 

      List<Certificate> certificateCollcetion = Collections.list(trustStore.aliases()).stream().filter(t -> { 
      try { 
       return trustStore.isCertificateEntry(t); 
      } catch (KeyStoreException e1) { 
       throw new RuntimeException("Error reading truststore", e1); 
      } 
      }).map(t -> { 
      try { 
       return trustStore.getCertificate(t); 
      } catch (KeyStoreException e2) { 
       throw new RuntimeException("Error reading truststore", e2); 
      } 
      }).collect(Collectors.toList()); 

      KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
      keyStore.load(new FileInputStream(ResourceUtils.getFile(keyStorePath)), keyStorePass.toCharArray()); 
      sslContext = SslContextBuilder.forClient() 
       .keyManager((PrivateKey) keyStore.getKey(keyAlias, keyStorePass.toCharArray())) 
       .trustManager((X509Certificate[]) certificateCollcetion.toArray(new X509Certificate[certificateCollcetion.size()])) 
       .build(); 
     } catch (Exception e) { 
      log.error("Error creating web client", e); 
      throw new RuntimeException(e); 
     } 
     ClientHttpConnector connector = new ReactorClientHttpConnector((opt) -> { 
      opt.sslContext(sslContext); 
     }); 
     webClientBuilder.clientConnector(connector); 
     } 
    }; 
    } 

あなたがWebクライアントを使用して一部、: 輸入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(); 
    } 
} 
関連する問題