【问题标题】:Modify LDAP attribute fails from Java, but succeeds with ldapmodify command从 Java 修改 LDAP 属性失败,但使用 ldapmodify 命令成功
【发布时间】:2018-07-17 18:59:50
【问题描述】:

我设法对属性执行 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 中使用?

【问题讨论】:

  • 为什么你认为问题是STARTLS? AFAIK 如果那是问题,您应该只收到 Connection denied 错误。您的 Java 程序似乎没有执行您认为的操作。您是否 ldap 服务器记录所有请求的修改?试试看java代码在做什么
  • 是的,你是对的。我不确定这取决于 STARTTLS。
  • 无论如何,只要我理解正确,使用 REPLACE_ATTRIBUTE 我正在通过 STARTTLS 层修改 uPwd 属性,这正是 ldapmodify 命令在命令行中所做的。 ldapmodify 正在工作,但 Java 中的 REPLACE_ATTRIBUTE - 没有。 STARTTLS 和 Authentication 在 Java 中似乎很好,在常规代码上抛出异常以进行属性修改。
  • 根据这个问题:stackoverflow.com/questions/17290539/… 您可能使用了错误的端口。尝试使用636 而不是389
  • 谢谢,但我们已经尝试过了。还有,为什么 ldapmodify 使用 389 ?

标签: java ssl ldap openldap tls1.2


【解决方案1】:

您似乎正在尝试更改 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。

【讨论】:

  • 它没有帮助。 LDAP 服务器是 Microsoft Active Directory。我无法控制它。这就是我在本地安装 OpenLDAP 进行测试的原因。我在 TLS 握手之后移动了 ctx.addToEnvironment(SECURITY_PRINCIPAL 和 SECURITY_REDENTIALS,这使得它可以在我的本地 OpenLDAP 上连接和更改密码。但是在 MS Active Directory 服务器上 - 不会执行异常:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多