2012-10-23 83 views
2

这是我的场景,我想连接到ldap usign jndi,我正在使用定制的SSLSOcketfactory来读取truststore和keystore。上下文创建成功,但当我尝试使用相同的凭据进行身份验证时,会引发错误,指出身份验证方法不受支持。使用证书和定制ssl套接字工厂连接到ldap的SSL连接

这里是我的自定义SSL套接字的代码 -

try { 
    StringBuffer trustStore = new StringBuffer("c:/Temp/certs/TrustStore"); 
      StringBuffer keyStore = new StringBuffer("c:/Temp/certs/keystore.arun"); 
    StringBuffer keyStorePass = new StringBuffer("xxxxx"); 
       StringBuffer keyAlias = new StringBuffer("user"); 
     StringBuffer keyPass = new StringBuffer("XXXX"); 

      TrustManagerFactory tmf =TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 

    FileInputStream fis = new FileInputStream(trustStore.toString()); 
    KeyStore ks1 = KeyStore.getInstance("jks"); 
    ks1.load(fis, trustStorePass.toString().toCharArray()); 
      fis.close(); 
    tmf.init(ks1); 
    TrustManager[] tms = tmf.getTrustManagers(); 
    FileInputStream fin = new FileInputStream(keyStore.toString()); 
    KeyStore ks2 = KeyStore.getInstance("jks"); 
    ks2.load(fin, keyStorePass.toString().toCharArray()); 
    fin.close(); 
    KeyManagerFactory kmf = 
     KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    kmf.init(ks2, keyStorePass.toString().toCharArray()); 
    KeyManager[] kms = kmf.getKeyManagers(); 
    if (keyAlias != null && keyAlias.length() > 0) { 
      for (int i = 0; i < kms.length; i++) { 
       // We can only deal with instances of X509KeyManager 
       if (kms[i] instanceof X509KeyManager) 
        kms[i] = new CustomKeyManager(
          (X509KeyManager) kms[i], keyAlias.toString()); 
      } 
     } 

SSLContext context = SSLContext.getInstance("TLS"); 
    context.init(kms,tms, null); 
    ssf = context.getSocketFactory(); 
} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
} 

    public static SocketFactory getDefault() { 

    return new CustomSSLSocketFactory(); 
} 

而且使用这种CustomSSLSocketFactory如下

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
    env.put(Context.PROVIDER_URL, "ldaps://wx64ads01a.vapps.esca.com:636"); 
    env.put(Context.REFERRAL, "follow"); 
env.put("java.naming.ldap.derefAliases", "always"); 
env.put("java.naming.ldap.factory.socket","com.eterra.security.authz.dao.CustomSSLSocketFactory"); 

try { 
    ctx = new InitialLdapContext(env, null); 
// start ssl session for server authentication 
    }catch(Exception e){ 
    System.out.println(e); 
} 
    try{ 
ctx.addToEnvironment(Context.SECURITY_AUTHENTICATION, 
        "EXTERNAL"); 
    String path = "CN=domain,DC=casa,DC=com" 
    String inFilter = "(&(objectClass=*))"; 
    SearchControls sc = new SearchControls(); 
sc.setSearchScope(SearchControls.SUBTREE_SCOPE); 
NamingEnumeration<SearchResult> results = null; 

results = ctx.search(path, inFilter, sc); 
    } 

我的背景是完全建立,但JNDI代码时,我尝试验证并绑定到ldap,我得到无效身份验证方法。任何帮助将不胜感激,现在努力解决这些错误很长一段时间。提前致谢 。

+0

为什么所有的'StringBuffers'和toString()调用?你真的使这个模糊。 – EJP

回答

0

Context.SECURITY_AUTHENTICATION,“外部”

当我尝试进行身份验证并绑定到LDAP,我得到无效的认证方法

所以,你的LDAP服务器不支持外部认证。