没有SSL的Active Directory密码重置

时间:2017-01-11 04:14:10

标签: java active-directory ldap

我试图在没有ssl的情况下重置Active Directory用户的密码。通过这个link可以了解在AD中可以禁用对ssl的强烈要求。但是使用这段代码:

import javax.naming.*; 
import javax.naming.directory.*; 
import javax.naming.ldap.*; 
import java.util.*; 
import java.security.*; 
public class ADConnection { 
DirContext ldapContext; 
String baseName = ",cn=users,DC=fabrikam,DC=com"; 
String serverIP = "10.1.1.7"; 
public ADConnection() { 
try { 
Hashtable ldapEnv = new Hashtable(11); 
ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
ldapEnv.put(Context.PROVIDER_URL, "ldap://" + serverIP + ":389"); 
ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); 
ldapEnv.put(Context.SECURITY_PRINCIPAL, "cn=administrator" + baseName); 
ldapEnv.put(Context.SECURITY_CREDENTIALS, "PA$$w0rd"); 
ldapContext = new InitialDirContext(ldapEnv); 
} 
catch (Exception e) { 
System.out.println(" bind error: " + e); 
e.printStackTrace(); 
System.exit(-1); 
} 
} 
public void updatePassword(String username, String password) { 
try { 
String quotedPassword = "\"" + password + "\""; 
char unicodePwd[] = quotedPassword.toCharArray(); 
byte pwdArray[] = new byte[unicodePwd.length * 2]; 
for (int i=0; i<unicodePwd.length; i++) { 
pwdArray[i*2 + 1] = (byte) (unicodePwd[i] >>> 8); 
pwdArray[i*2 + 0] = (byte) (unicodePwd[i] & 0xff); 
} 
ModificationItem[] mods = new ModificationItem[1]; 
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, 
new BasicAttribute("UnicodePwd", pwdArray)); 
ldapContext.modifyAttributes("cn=" + username + baseName, mods); 
} 
catch (Exception e) { 
System.out.println("update password error: " + e); 
System.exit(-1); 
} 
} 
public static void main(String[] args) { 
ADConnection adc = new ADConnection(); 
adc.updatePassword("Java User2", pass@word3); 
} 
}

结果:

javax.naming.OperationNotSupported: [LDAP: error code 53 - 00002077: SvcErr: DSID-03190F0A, problem 5003 (WILL_NOT_PERFORM)....

假设我们可以信任Microsoft文档(密码可以通过非ssl端口389重置),我怀疑是java API并希望与套接字建立AD直接连接并运行reset password命令,实际上寻找javax.naming的替代品。*。那可能吗?有人尝试过没有ssl重置AD密码吗?

P.S:Application Server和AD服务器处于私有安全网络中,我并不担心嗅探。

1 个答案:

答案 0 :(得分:0)

Windows不允许通过普通ldap更改Active Directory中的密码。 它需要具有SSL连接才能更改AD存储密码的unicodePwd属性。

有时您可能会遇到以下异常:

javax.naming.OperationNotSupportedException: [LDAP: error code 53 - 00002077: SvcErr: DSID-03190F4C, problem 5003 (WILL_NOT_PERFORM), data 0 ]

解决方案:使用SSL证书

  

要修改此属性,客户端必须具有到服务器的128位传输层安全性(TLS)/安全套接字层(SSL)连接。只要满足最小密钥长度,使用SSP创建的会话密钥使用NTLM或Kerberos的加密会话也是可以接受的。

Further reading