如何通过LDAP SSL启用连接池?

时间:2010-09-29 20:37:26

标签: java ssl ldap connection-pooling

好的,我正在将我的应用程序从非SSL连接到我的LDAP服务器的SSL连接。在非SSL中运行应用程序时,连接池工作正常。但是,当我切换到SSL时,连接池不再有效。

在研究here时,我意识到我从未将“com.sun.jndi.ldap.connect.pool.protocol”属性设置为“plain ssl”,因为默认情况下它设置为plain。我认为这是问题所在。

当我实现更改以包含“plain ssl”时,它没有解决问题,并且仍然没有使用连接池。

我还缺少其他一些设置吗?

相关代码:

    Hashtable LDAPEnvironment = new Hashtable();
    LDAPEnvironment.put(Context.SECURITY_AUTHENTICATION, SECURITY_AUTHENTICATION);
    LDAPEnvironment.put(Context.SECURITY_PRINCIPAL, SECURITY_PRINCIPAL);
    LDAPEnvironment.put(Context.SECURITY_CREDENTIALS, SECURITY_CREDENTIALS);
    LDAPEnvironment.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
    LDAPEnvironment.put(Context.PROVIDER_URL, PROVIDER_URL );
    LDAPEnvironment.put(Context.SECURITY_AUTHENTICATION, "simple");
    LDAPEnvironment.put("java.naming.ldap.version", versionOfLDAP );

    if (ldapProtocol != null && ldapProtocol.equalsIgnoreCase("SSL")){
        LDAPEnvironment.put(Context.SECURITY_PROTOCOL,"ssl");
        LDAPEnvironment.put("com.sun.jndi.ldap.connect.pool.protocol","plain ssl");
    }

    LDAPEnvironment.put("com.sun.jndi.ldap.connect.pool", "true");

2 个答案:

答案 0 :(得分:1)

我发现了这个问题。该文档明确指出这些属性是系统属性不是环境属性。我将它们设置为环境属性。 : - )

答案 1 :(得分:0)

如果向下滚动一下,在您提供的链接处(滚动到“如何汇集连接”),您将看到有关池如何工作的说明。

当您请求池化连接时,仅当所有指定的属性相同时才会获得一个连接。这是一长串属性......

我的情况是:

  • 连接控件
  • 主机名,“java.naming.provider.url”属性中指定的端口号,引用或提供给初始上下文的URL
  • java.naming.security.protocol property
  • java.naming.ldap.version property
  • java.naming.security.principal property
  • java.naming.security.credentials property

如果在从连接池请求连接时总是使用相同的常量,我认为您应该获得相同的池连接。也就是说,如果正确设置com.sun.jndi.ldap.connect.pool。*属性 - 但我在您提供的代码中没有看到。

如果您确实将com.sun.jndi.ldap.connect.pool。*属性设置为合理值,请尝试将com.sun.jndi.ldap.connect.pool.debug设置为fine。这将帮助您调试。

另一种选择是使用支持连接池的框架或提供程序。请注意,Java提供给您的池非常有限。我过去使用过Spring-Ldap,它有很好的支持。

希望这有帮助。