* @throws KeyManagementException
* @throws NoSuchProviderException
*/
public SSLSocketFactory createSSLFactory(String provider, String protocol, String algorithm, String keyStore, String keyAlias, String trustStore, ClassLoader loader) throws KeystoreIsLocked, KeyIsLocked, NoSuchAlgorithmException, UnrecoverableKeyException, KeyStoreException, KeyManagementException, NoSuchProviderException {
// the keyStore is optional.
KeystoreInstance keyInstance = null;
if (keyStore != null) {
keyInstance = getKeystore(keyStore);
if(keyInstance.isKeystoreLocked()) {
throw new KeystoreIsLocked("Keystore '"+keyStore+"' is locked; please use the keystore page in the admin console to unlock it");
}
if(keyInstance.isKeyLocked(keyAlias)) {
throw new KeystoreIsLocked("Key '"+keyAlias+"' in keystore '"+keyStore+"' is locked; please use the keystore page in the admin console to unlock it");
}
}
KeystoreInstance trustInstance = trustStore == null ? null : getKeystore(trustStore);
if(trustInstance != null && trustInstance.isKeystoreLocked()) {
throw new KeystoreIsLocked("Keystore '"+trustStore+"' is locked; please use the keystore page in the admin console to unlock it");
}
// OMG this hurts, but it causes ClassCastExceptions elsewhere unless done this way!
try {
Class cls = loader.loadClass("javax.net.ssl.SSLContext");
Object ctx = cls.getMethod("getInstance", new Class[] {String.class}).invoke(null, new Object[]{protocol});
Class kmc = loader.loadClass("[Ljavax.net.ssl.KeyManager;");
Class tmc = loader.loadClass("[Ljavax.net.ssl.TrustManager;");
Class src = loader.loadClass("java.security.SecureRandom");
cls.getMethod("init", new Class[]{kmc, tmc, src}).invoke(ctx, new Object[]{
keyInstance == null ? null : keyInstance.getKeyManager(algorithm, keyAlias),
trustInstance == null ? null : trustInstance.getTrustManager(algorithm),
new java.security.SecureRandom()});
Object result = cls.getMethod("getSocketFactory", new Class[0]).invoke(ctx, new Object[0]);
return (SSLSocketFactory) result;
} catch (Exception e) {
log.error("Unable to dynamically load", e);