SecuredWebClient.java 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package com.provectus.kafka.ui.util;
  2. import io.netty.handler.ssl.SslContext;
  3. import io.netty.handler.ssl.SslContextBuilder;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;
  7. import java.security.KeyStore;
  8. import java.security.KeyStoreException;
  9. import java.security.NoSuchAlgorithmException;
  10. import java.security.UnrecoverableKeyException;
  11. import java.security.cert.CertificateException;
  12. import javax.net.ssl.KeyManagerFactory;
  13. import javax.net.ssl.TrustManagerFactory;
  14. import org.springframework.http.client.reactive.ReactorClientHttpConnector;
  15. import org.springframework.util.ResourceUtils;
  16. import org.springframework.web.reactive.function.client.WebClient;
  17. import reactor.netty.http.client.HttpClient;
  18. public class SecuredWebClient {
  19. public static WebClient.Builder configure(
  20. String keystoreLocation,
  21. String keystorePassword,
  22. String truststoreLocation,
  23. String truststorePassword)
  24. throws NoSuchAlgorithmException, IOException, KeyStoreException, CertificateException, UnrecoverableKeyException {
  25. // If we want to customize our TLS configuration, we need at least a truststore
  26. if (truststoreLocation == null || truststorePassword == null) {
  27. return WebClient.builder();
  28. }
  29. SslContextBuilder contextBuilder = SslContextBuilder.forClient();
  30. // Prepare truststore
  31. KeyStore trustStore = KeyStore.getInstance("JKS");
  32. trustStore.load(
  33. new FileInputStream((ResourceUtils.getFile(truststoreLocation))),
  34. truststorePassword.toCharArray()
  35. );
  36. TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
  37. TrustManagerFactory.getDefaultAlgorithm()
  38. );
  39. trustManagerFactory.init(trustStore);
  40. contextBuilder.trustManager(trustManagerFactory);
  41. // Prepare keystore only if we got a keystore
  42. if (keystoreLocation != null && keystorePassword != null) {
  43. KeyStore keyStore = KeyStore.getInstance("JKS");
  44. keyStore.load(
  45. new FileInputStream(ResourceUtils.getFile(keystoreLocation)),
  46. keystorePassword.toCharArray()
  47. );
  48. KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
  49. keyManagerFactory.init(keyStore, keystorePassword.toCharArray());
  50. contextBuilder.keyManager(keyManagerFactory);
  51. }
  52. // Create webclient
  53. SslContext context = contextBuilder.build();
  54. return WebClient.builder()
  55. .clientConnector(new ReactorClientHttpConnector(HttpClient.create().secure(t -> t.sslContext(context))));
  56. }
  57. }