【发布时间】: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