Могу ли я заставить HttpClient использовать пользовательские настройки хранилища ключей / хранилища доверенных сертификатов Weblogic?

В моем приложении используется HttpClient 3.1 от Apache, развернутый на Weblogic 10.3, для выполнения POST с использованием взаимной аутентификации SSL. Я могу заставить это работать, используя следующие системные свойства для настройки хранилища ключей и хранилища доверенных сертификатов: -

-Djavax.net.ssl.keyStore=C:\Keystore\KEYSTORE.jks
-Djavax.net.ssl.keyStorePassword=changeit
-Djavax.net.ssl.trustStore=C:\Truststore\TRUSTSTORE.jks
-Djavax.net.ssl.trustStorePassword=changeit

Есть ли способ заставить HttpClient распознавать и использовать настройки Weblogic пользовательского keystore и truststore (как настроено в консоль /config.xml). Среди прочего, это даст возможность сохранять пароли «скрытыми» и невидимыми в виде простого текста в файлах конфигурации / консоли и т. Д.

Кто-нибудь может просветить меня?


person Dave Allen    schedule 25.05.2011    source источник


Ответы (2)


Мне удалось заставить HttpClient использовать пользовательские сертификаты хранилища доверенных сертификатов weblogic для SSL-соединения, внедрив пользовательский TrustStrategy:

import sun.security.provider.certpath.X509CertPath;
import weblogic.security.pk.CertPathValidatorParameters;
import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertPath;
import java.security.cert.CertPathParameters;
import java.security.cert.CertPathValidator;
import java.security.cert.CertPathValidatorException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Arrays;

public class WeblogicSSLTrustStrategy implements TrustStrategy {

  @Override
  public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    validator = CertPathValidator.getInstance("WLSCertPathValidator");
    CertPath certPath = new X509CertPath(Arrays.asList(chain));

    // supply here the weblogic realm name, configured in weblogic console
    // "myrealm" is the default one
    CertPathParameters params = new CertPathValidatorParameters("myrealm", null, null);
    try {
      validator.validate(certPath, params);
    } catch (CertPathValidatorException e) {
      throw new CertificateException(e);
    } catch (InvalidAlgorithmParameterException e) {
      throw new CertificateException(e);
    }

    return true;
  }
} 

Этот код основан на документации Weblogic. Стратегию можно передать HttpClient через SSLSocketFactory:

SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));

SSLSocketFactory sslSocketFactory = new SSLSocketFactory(new WeblogicSSLTrustStrategy());
schemeRegistry.register(new Scheme("https", 443, sslSocketFactory));

PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(schemeRegistry);

DefaultHttpClient httpClient = new DefaultHttpClient(connectionManager);

Единственный неизвестный параметр — это имя Weblogic Realm, которое можно взять из Weblogic JMX API или просто предварительно настроить. Таким образом, не требуется создавать хранилище доверенных сертификатов или перенастраивать параметры запуска Weblogic.

person Vladimir Hlavacek    schedule 08.03.2013

Вы можете получить эти значения через JMX, используя KeyStoreMBean. Имейте в виду, однако, что это может быть нетривиальным упражнением из-за следующего:

  • Для этого потребуется хранить пароли хранилища ключей в открытом виде в вашем JMX-клиенте (теперь, когда вы будете писать его в своем приложении). Это небезопасно, и из-за этого может произойти сбой аудита безопасности, в зависимости от того, что должен искать аудит.
  • MBeans могут быть недоступны во время выполнения из-за конфигурации службы JMX, или доступ к ним может быть разным в разных сценариях. Предполагая WebLogic 11g, значения могут быть доступны только для чтения с помощью устанавливая значение атрибута EditMBeanServerEnabled JMXMBean в false.
person Vineet Reynolds    schedule 05.06.2011