我实现了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);
}
}
这是确保始终安全发送初始密码的方法吗?
由于
答案 0 :(得分:0)
就像LDAP over SSL一样,LDAP over TLS应该监听端口636而不是389.在这种情况下,TLS应该与SSL同义(例如,TLS只是SSL的下一个版本..,SSL1-> SSL3-> ; TLS1-> TLS11-> TLS12)