/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive.ssl;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Loads the trust managers from the default {@link TrustManagerFactory} and delegates to those.
*
* @author Middleware Services
*/
public class DefaultTrustManager implements X509TrustManager
{
/** Logger for this class. */
protected final Logger logger = LoggerFactory.getLogger(getClass());
/** Default trust managers. */
private final X509TrustManager[] trustManagers;
/** Creates a new default trust manager. */
public DefaultTrustManager()
{
try {
final TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore) null);
final TrustManager[] tm = tmf.getTrustManagers();
trustManagers = new X509TrustManager[tm.length];
for (int i = 0; i < tm.length; i++) {
trustManagers[i] = (X509TrustManager) tm[i];
}
} catch (GeneralSecurityException e) {
throw new IllegalStateException(e);
}
}
@Override
public void checkClientTrusted(final X509Certificate[] chain, final String authType)
throws CertificateException
{
for (X509TrustManager tm : trustManagers) {
logger.trace("invoking checkClientTrusted for {}", tm);
tm.checkClientTrusted(chain, authType);
}
}
@Override
public void checkServerTrusted(final X509Certificate[] chain, final String authType)
throws CertificateException
{
for (X509TrustManager tm : trustManagers) {
logger.trace("invoking checkServerTrusted for {}", tm);
tm.checkServerTrusted(chain, authType);
}
}
@Override
public X509Certificate[] getAcceptedIssuers()
{
final List<X509Certificate> issuers = new ArrayList<>();
if (trustManagers != null) {
for (X509TrustManager tm : trustManagers) {
logger.trace("invoking getAcceptedIssuers for {}", tm);
Collections.addAll(issuers, tm.getAcceptedIssuers());
}
}
return issuers.toArray(new X509Certificate[issuers.size()]);
}
}