Мы пишем приложение, которое будет подключаться к различным серверам 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
, но как передать информацию?