我设法执行属性的STARTTLS ldapmodify(-ZZ),但无法使用javax.naming.ldap编码执行相同的修改
服务器是OpenLDAP。它具有用于修改的SSigned SSL证书,并且允许不安全的读取。经典组合。
我从同一个服务器上运行以下命令,我将尝试执行Java代码(稍后):
ldapmodify -H ldap://my.ldap.server:389 -D "myldapadmin" -W -ZZ
Enter LDAP Password:
dn: CN=John Westood,OU=L100,DC=l,DC=woods
changetype: modify
replace: uPwd
uPwd:: 234WF34TG2U
modifying entry "CN=John Westood,OU=L100,DC=l,DC=woods"
...正如你所看到的,它要求我提供myldapadmin的密码,我输入密码,然后进行修改。
以下是我在Java中所做的事情,我想做同样的修改,我在同一台服务器上运行它。我先将SSigned LDAP SSL证书导入java。
Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://my.ldap.server:389");
// Create initial context
LdapContext ctx = new InitialLdapContext(env, null);
ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, "myldapadmin");
ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, "myadminpass");
// Start TLS (STARTTLS is also used by the console command ldapmodify)
StartTlsResponse tls = (StartTlsResponse) ctx.extendedOperation(new
StartTlsRequest());
SSLSession sess = tls.negotiate();
//Modification of 'uPwd' attribute
ModificationItem[] mods = new ModificationItem[1];
Attribute mod0 = new BasicAttribute("uPwd", "4G45G435G436UJWG");
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, mod0);
ctx.modifyAttributes("CN=John Westood,OU=L100,DC=l,DC=woods", mods);
// Stop TLS
tls.close();
// Context close
ctx.close();
我在方法ctx.modifyAttributes中遇到异常。例外情况如下:
javax.naming.OperationNotSupportedException: [LDAP: error code 53 - 0000052D: SvcErr: DSID-031A12D2, problem 5003 (WILL_NOT_PERFORM), data 0
任何人都知道为什么修改uPwd可以从命令行使用STARTLS,但不能使用Java?
答案 0 :(得分:0)
似乎您尝试更改Microsoft Active Directory的密码(即使您显示openLDAP) (我不知道uPwd会是什么。)
更改Microsoft Active Directory Passwords has several constraints。
一旦您确信自己拥有可接受的Microsoft Active Directory连接,我们就有example for Changing Microsoft Active Directory Password with JNDI
仅供参考:默认情况下,startTLS将使用389。