jndi LDAPS пользовательские HostnameVerifier и TrustManager

Мы пишем приложение, которое будет подключаться к различным серверам LDAP. Для каждого сервера мы можем принять только определенный сертификат. Имя хоста в этом сертификате не имеет значения. Это легко, когда мы используем LDAP и STARTTLS, потому что мы можем использоватьStartTlsResponse.setHostnameVerifier(..-) и использоватьStartTlsResponse.negotiate(...) с соответствиемSSLSocketFactory, Однако нам также необходимо поддерживать соединения LDAPS. Java поддерживает это изначально, но только если сертификат сервера является доверенным для хранилища ключей Java по умолчанию. Хотя мы могли бы заменить это, мы все еще не можем использовать разные хранилища ключей для разных серверов.

Существующий код подключения выглядит следующим образом:

Hashtable<String,String> env = new Hashtable<String,String>();
env.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
env.put( Context.PROVIDER_URL, ( encryption == SSL ? "ldaps://" : "ldap://" ) + host + ":" + port );
if ( encryption == SSL ) {
    // env.put( "java.naming.ldap.factory.socket", "CustomSocketFactory" );
}
ctx = new InitialLdapContext( env, null );
if ( encryption != START_TLS )
    tls = null;
else {
    tls = (StartTlsResponse) ctx.extendedOperation( new StartTlsRequest() );
    tls.setHostnameVerifier( hostnameVerifier );
    tls.negotiate( sslContext.getSocketFactory() );
}

Мы могли бы добавить собственныйCustomSocketFactoryа как передать информацию тому?

Ответы на вопрос(2)

Ваш ответ на вопрос