content: package allen.town.podcast.net.ssl;
  
  import javax.net.ssl.X509TrustManager;
  import java.security.cert.CertificateException;
  import java.security.cert.X509Certificate;
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.List;
  
  /**
   * Represents an ordered list of {@link X509TrustManager}s with additive trust. If any one of the composed managers
   * trusts a certificate chain, then it is trusted by the composite manager.
   * Based on https://stackoverflow.com/a/16229909
   */
  public class CompositeX509TrustManager implements X509TrustManager {
      private final List<X509TrustManager> trustManagers;
  
      public CompositeX509TrustManager(List<X509TrustManager> trustManagers) {
          this.trustManagers = trustManagers;
      }
  
      @Override
      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
          CertificateException reason = null;
          for (X509TrustManager trustManager : trustManagers) {
              try {
                  trustManager.checkClientTrusted(chain, authType);
                  return; // someone trusts them. success!
              } catch (CertificateException e) {
                  // maybe someone else will trust them
                  reason = e;
              }
          }
          throw reason;
      }
  
      @Override
      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
          CertificateException reason = null;
          for (X509TrustManager trustManager : trustManagers) {
              try {
                  trustManager.checkServerTrusted(chain, authType);
                  return; // someone trusts them. success!
              } catch (CertificateException e) {
                  // maybe someone else will trust them
                  reason = e;
              }
          }
          throw reason;
      }
  
      @Override
      public X509Certificate[] getAcceptedIssuers() {
          List<X509Certificate> certificates = new ArrayList<>();
          for (X509TrustManager trustManager : trustManagers) {
              certificates.addAll(Arrays.asList(trustManager.getAcceptedIssuers()));
          }
          return certificates.toArray(new X509Certificate[0]);
      }
  }
  