从Java修改LDAP属性失败,但使用ldapmodify命令

时间:2018-02-07 13:06:38

标签: java ssl ldap openldap tls1.2

我设法执行属性的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?

1 个答案:

答案 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。