2010-09-29 3 views
4

Bon, alors je passe mon application de connexions non-SSL vers SSL à mon serveur LDAP. Lors de l'exécution de l'application dans un environnement non SSL, le regroupement de connexions fonctionne correctement. Cependant, lorsque je passe à la connexion SSL, les pools ne fonctionnent plus. En recherchant here, j'ai réalisé que je ne définissais jamais la propriété "com.sun.jndi.ldap.connect.pool.protocol" à "plain ssl" car par défaut, elle est définie sur "plain". Je pensais que c'était le problème. Lorsque j'ai implémenté la modification pour inclure "SSL simple", cela n'a pas résolu le problème et les pools de connexions n'étaient toujours pas utilisés.Comment activer la mise en pool des connexions via LDAP SSL?

Y at-il un autre paramètre qui me manque?

Code pertinent:

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"); 
+1

@Le gars qui a voté pour la fermeture: Cela n'appartient pas à serverfault.com car il s'agit d'un problème Java. –

Répondre

1

J'ai trouvé le problème. La documentation indique spécifiquement que ces propriétés sont propriétés système et pas propriétés d'environnement. Je les définissais comme des propriétés d'environnement. :-)

0

Si vous faites défiler vers le bas un peu, au lien que vous avez fourni (faites défiler jusqu'à « Comment connexions sont mises en commun »), vous verrez l'explication de la façon dont les travaux de mise en commun .

Lorsque vous demandez une connexion groupée, vous en obtiendrez une uniquement si TOUTES les propriétés spécifiées sont identiques. Et c'est une longue liste de propriétés ...

Je votre cas cela est:

  • commande Connexion
  • nom d'hôte, le numéro de port spécifié dans la propriété « java.naming.provider.url » , un renvoi ou URL fournie au contexte initial
  • java.naming.security.protocol propriété
  • java.naming.ldap.version propriété
  • propriété java.naming.security.principal
  • java.naming.security.credentials propriété

Si vous utilisez toujours les mêmes constantes lorsque demande une connexion à partir du pool de connexion, je pense que vous devriez obtenir la même connexion mis en commun. C'est-à-dire, si vous définissez les propriétés com.sun.jndi.ldap.connect.pool. * Correctement - mais je n'ai pas vu cela dans le code que vous avez fourni.

Si vous avez défini les propriétés com.sun.jndi.ldap.connect.pool. * Sur des valeurs sensibles, essayez de définir com.sun.jndi.ldap.connect.pool.debug comme fin. Cela vous aidera à déboguer.

Une autre option consiste à utiliser une infrastructure ou un fournisseur prenant en charge le regroupement de connexions. Notez que le regroupement fourni par Java est plutôt limité. J'ai utilisé Spring-Ldap par le passé, et il a un très bon support.

Espérons que cela aide.

+0

Pouvez-vous élaborer s'il vous plaît? J'ai inclus l'extrait de code dans l'édition ci-dessus. –

+0

De plus, nous n'utilisons que la méthode 'simple', donc ce n'est qu'une poignée de propriétés ... et toutes ces propriétés semblent être définies. –

+0

J'ai édité ma réponse. J'espère que ça aide. –