gpt4 book ai didi

java - 没有 SSL 的 Active Directory 密码重置

转载 作者:搜寻专家 更新时间:2023-11-01 03:47:32 25 4
gpt4 key购买 nike

我正在尝试在没有 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 的直接连接并运行重置密码命令,实际上是在寻找javax.naming.* 的替代方法。那可能吗?有人试过不用 ssl 重置 AD 密码吗?

P.S:应用服务器和 AD 服务器位于私有(private)安全网络中,我不担心嗅探。

最佳答案

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证书

In order to modify this attribute, the client must have a 128-bit Transport Layer Security (TLS)/Secure Socket Layer (SSL) connection to the server. An encrypted session using SSP-created session keys using NTLM or Kerberos are also acceptable as long as the minimum key length is met.

Further reading

关于java - 没有 SSL 的 Active Directory 密码重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41582596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com