* unlocked.
* @throws KeystoreException
*/
public SSLSocketFactory createSSLFactory(String provider, String protocol, String algorithm, String keyStore, String keyAlias, String trustStore, ClassLoader loader) throws KeystoreException {
// the keyStore is optional.
KeystoreInstance keyInstance = null;
if (keyStore != null) {
keyInstance = getKeystore(keyStore, null);
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, null);
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 = Class.forName("[Ljavax.net.ssl.KeyManager;", false, loader);
Class tmc = Class.forName("[Ljavax.net.ssl.TrustManager;", false, loader); 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, null),
trustInstance == null ? null : trustInstance.getTrustManager(algorithm, null),
new java.security.SecureRandom()});
Object result = cls.getMethod("getSocketFactory", new Class[0]).invoke(ctx, new Object[0]);
return (SSLSocketFactory) result;
} catch (Exception e) {
throw new KeystoreException("Unable to create SSL Factory", e);