2014-09-21 5 views
3

Мне нужна замена 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(); 
    } 

} 

ответ

1

в конечном итоге выяснить это. При загрузке класса Axis SocketFactoryFactory сбрасывает значение свойства оси Ax.socketSecureFactory по умолчанию. Из JRE загрузчик классов загрузил SocketFactoryFactory до моего кода; от Tomcat, он не был загружен до тех пор, пока мой код не запустится, перезаписав мои пользовательские настройки.

Я только что добавил вызов Class.forName() перед установкой axis.socketSecureFactory и все сработало.

+0

Не могли бы вы подробнее описать свое исправление? Каким параметром вы пользовались в вызове Class.forName()? Я думаю, что у меня такая же проблема. Я попытался добавить «Class.forName (SocketFactoryFactory.class.getCanonicalName()); перед AxistProperties.setProperty («axis.socketSecureFactory», MyCustomSocketFactory.class.getCanonicalName()); но это не решило проблему. – CDelaney

+0

Я понял свою ошибку. Я выполнял другой запрос между установкой переопределения и выполнением запроса, для которого было выполнено переопределение. Он работал локально, но не на jboss. Я обновил его, чтобы установить переопределение непосредственно перед тем, как выполнить требуемый запрос. – CDelaney

 Смежные вопросы

  • Нет связанных вопросов^_^