LDAP TLS与SSL

时间:2014-02-16 11:40:54

标签: ssl ldap

我实现了LDAP身份验证。我需要同时支持TLS和SSL

我使用以下代码:

 Properties bindEnv = new Properties();
 LdapContext  bindCtx = null;

 ....
 if (SSL){
    bindEnv.put(Context.PROVIDER_URL, "ldaps://ldap.example.com:636");
 }
 else{ 
   if(TLS){
       bindEnv.put(Context.PROVIDER_URL, "ldap://ldap.example.com:389");
   }
 }

 bindEnv.put(Context.SECURITY_PRINCIPAL, "INITIAL DN");    
 bindEnv.put(Context.SECURITY_CREDENTIALS, "PASSWORD");
 bindCtx = new InitialLdapContext(bindEnv, null);

 if(TLS){
     StartTlsResponse tls = 
         (StartTlsResponse) bindCtx.extendedOperation(new StartTlsRequest());
     tls.negotiate();
 }    

 ... Get username/password and authenticate user...

现在,在SSL模式下,初始DN&密码在SSL上发送。如果出现问题,初始上下文将立即抛出异常。

但是在TLS模式下,密码是在普通的389端口发送的。 TLS之后才开始。
那么,TLS意味着什么?这不安全。

似乎在TLS的情况下,正确的方法是打开没有DN /密码的初始上下文,启动TLS,然后使用bind / reconnect?

类似的东西:

if (SSL){
     bindEnv.put(Context.PROVIDER_URL, "ldaps://ldap.example.com:636");
     bindEnv.put(Context.SECURITY_PRINCIPAL, "INITIAL DN");    
     bindEnv.put(Context.SECURITY_CREDENTIALS, "PASSWORD");
     bindCtx = new InitialLdapContext(bindEnv, null);
 }     
 else{ 
   if(TLS){
       bindEnv.put(Context.PROVIDER_URL, "ldap://ldap.example.com:389");
       bindCtx = new InitialLdapContext(bindEnv, null);
       StartTlsResponse tls = 
             (StartTlsResponse) bindCtx.extendedOperation(new StartTlsRequest());
       tls.negotiate();
       bindCtx.addToEnvironment(Context.SECURITY_PRINCIPAL, "INITIAL DN");
       bindCtx.addToEnvironment(Context.SECURITY_CREDENTIALS,"PASSWORD");
       bindCtx.reconnect(null);
   }
 }

这是确保始终安全发送初始密码的方法吗?

由于

1 个答案:

答案 0 :(得分:0)

就像LDAP over SSL一样,LDAP over TLS应该监听端口636而不是389.在这种情况下,TLS应该与SSL同义(例如,TL​​S只是SSL的下一个版本..,SSL1-> SSL3-> ; TLS1-> TLS11-> TLS12)