Мне нужна замена SecureSocketFactory по умолчанию (1.4) по умолчанию моей собственной реализацией. Я успешно справился с автономной JRE (1.6), и все протестировано просто отлично. Но когда я развертываю Tomcat 5.5 - где это приложение будет в конечном итоге проживать - насколько я могу судить, Axis все еще использует JSSESecureSocketFactory. Я пытался как:Установка оси.SecureSocketFactory в автономном JRE vs Tomcat
System.setProperty("org.apache.axis.components.net.SecureSocketFactory", "my.CustomSecureSocketFactory");
и
AxisProperties.setProperty("axis.socketSecureFactory", "my.CustomSecureSocketFactory");
, а также установка свойства виртуальной машины Java для Tomcat:
-Dorg.apache.axis.components.net.SecureSocketFactory=my.CustomSecureSocketFactory
JREs, библиотеки, ключ/доверие магазины, и все, иначе я могу думать, что они идентичны. Я даже запускаю свой автономный тест на сервере, используя JRE и параметры Tomcat, и все же он отлично работает.
У меня нет идей как устранить эту проблему. Кто-нибудь имеет представление о том, где искать, или альтернативный подход к использованию Axis для использования определенного SecureSocketFactory?
Соответствующие фрагменты кода:
public class CustomKeyManager extends X509ExtendedKeyManager {
private final X509ExtendedKeyManager base;
public CustomKeyManager(X509ExtendedKeyManager base) {
this.base = base;
}
/* Lots of methods omitted */
static SSLContext SSL_CONTEXT;
static void updateSSL(String keyStoreFile, String keyStorePassword){
System.setProperty("org.apache.axis.components.net.SecureSocketFactory", "com.spanlink.cfg.crypto.HostNameSecureSocketFactory");
AxisProperties.setProperty("axis.socketSecureFactory", "com.spanlink.cfg.crypto.HostNameSecureSocketFactory");
KeyStore keyStore = KeyStore.getInstance("jks");
keyStore.load(new FileInputStream(keyStoreFile), keyStorePassword.toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, keyStorePassword.toCharArray());
KeyManager[] oldManagers = kmf.getKeyManagers();
KeyManager[] newManagers = new KeyManager[oldManagers.length];
for (int i = 0; i < oldManagers.length; i++) {
if (oldManagers[i] instanceof X509ExtendedKeyManager) {
newManagers[i] = new CustomKeyManager((X509ExtendedKeyManager) oldManagers[i]);
}else{
newManagers[i] = oldManagers[i];
}
}
SSL_CONTEXT = SSLContext.getInstance("SSL");
SSL_CONTEXT.init(newManagers, null, null);
}
}
public class CustomSecureSocketFactory extends JSSESocketFactory {
public CustomSecureSocketFactory(Hashtable table) {
super(table);
super.sslFactory = CustomKeyManager.SSL_CONTEXT.getSocketFactory();
}
}
Не могли бы вы подробнее описать свое исправление? Каким параметром вы пользовались в вызове Class.forName()? Я думаю, что у меня такая же проблема. Я попытался добавить «Class.forName (SocketFactoryFactory.class.getCanonicalName()); перед AxistProperties.setProperty («axis.socketSecureFactory», MyCustomSocketFactory.class.getCanonicalName()); но это не решило проблему. – CDelaney
Я понял свою ошибку. Я выполнял другой запрос между установкой переопределения и выполнением запроса, для которого было выполнено переопределение. Он работал локально, но не на jboss. Я обновил его, чтобы установить переопределение непосредственно перед тем, как выполнить требуемый запрос. – CDelaney