package eu.europa.esig.dss.client.http.commons;
import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
/**
* Default trust manager.
*
* @author lodermatt
*/
public final class DefaultTrustManager implements X509TrustManager {
/** TrustStore. */
private X509TrustManager trustManager;
/**
* @param keystore
*
* @throws GeneralSecurityException
* Certificate/Keystore/Algorithm/... exception
* @throws IOException
* I/O Error
*/
public DefaultTrustManager(final KeyStore keystore) throws GeneralSecurityException, IOException {
// initialize a new TMF with the ts we just loaded
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keystore);
// acquire X509 trust manager from factory
TrustManager[] tms = tmf.getTrustManagers();
for (final TrustManager tm : tms) {
if (tm instanceof X509TrustManager) {
this.trustManager = (X509TrustManager) tm;
return;
}
}
throw new NoSuchAlgorithmException("No X509TrustManager in TrustManagerFactory");
}
/**
* Constructor.
*
* @param tsInputStream
* The truststore
* @param tsType
* the trust store type
* @param tsPasswd
* truststore password
*
* @throws GeneralSecurityException
* Certificate/Keystore/Algorithm/... exception
* @throws IOException
* I/O Error
*/
public DefaultTrustManager(InputStream tsInputStream, String tsType, String tsPasswd) throws GeneralSecurityException, IOException {
// load keystore from specified cert store (or default)
KeyStore keystore = KeyStore.getInstance(tsType);
keystore.load(tsInputStream, tsPasswd.toCharArray());
this.initTrustManager(keystore);
}
/**
* Loading the truststore.
*
* @param keystore
* truststore
*
* @throws GeneralSecurityException
* Certificate/Keystore/Algorithm/... exception
* @throws IOException
* I/O Error
*/
private void initTrustManager(final KeyStore keystore) throws GeneralSecurityException, IOException {
// initialize a new TMF with the ts we just loaded
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keystore);
// acquire X509 trust manager from factory
TrustManager[] tms = tmf.getTrustManagers();
for (final TrustManager tm : tms) {
if (tm instanceof X509TrustManager) {
trustManager = (X509TrustManager) tm;
return;
}
}
throw new NoSuchAlgorithmException("No X509TrustManager in TrustManagerFactory");
}
/*
* (non-Javadoc)
*
* @see javax.net.ssl.X509TrustManager#checkClientTrusted(java.security.cert.X509Certificate[], java.lang.String)
*/
@Override
public void checkClientTrusted(final X509Certificate[] chain, final String authType) throws CertificateException {
trustManager.checkClientTrusted(chain, authType);
}
/*
* (non-Javadoc)
*
* @see javax.net.ssl.X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String)
*/
@Override
public void checkServerTrusted(final X509Certificate[] chain, final String authType) throws CertificateException {
trustManager.checkServerTrusted(chain, authType);
}
/*
* (non-Javadoc)
*
* @see javax.net.ssl.X509TrustManager#getAcceptedIssuers()
*/
@Override
public X509Certificate[] getAcceptedIssuers() {
return trustManager.getAcceptedIssuers();
}
}