title: Modify LDAP attribute fails from Java, but succeeds with ldapmodify command
body: <p>I manage to perform a STARTTLS ldapmodify ( -ZZ) of an attribute, but fail to perform the same modification using javax.naming.ldap coding</p>
  
  <p>The server is OpenLDAP. It has SSigned SSL Certificate for modification, and unsecured reading is allowed. Classical combination.</p>
  
  <p>I run the following command from the same server on which I will try to execute the Java code (later):</p>
  
  <pre><code>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" 
  </code></pre>
  
  <p>... as you can see, it asks me for myldapadmin's password, I enter it, and the modification happens.</p>
  
  <p>Here is what I am doing from Java, I want to do the same modification, I am running it on the same server. I have imported the SSigned LDAP SSL certificate into java first.</p>
  
  <pre><code>Hashtable&lt;String, Object&gt; env = new Hashtable&lt;String, Object&gt;();
  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();
  </code></pre>
  
  <p>I get exception in method ctx.modifyAttributes. The Exception is the following:</p>
  
  <pre><code>javax.naming.OperationNotSupportedException: [LDAP: error code 53 - 0000052D: SvcErr: DSID-031A12D2, problem 5003 (WILL_NOT_PERFORM), data 0
  </code></pre>
  
  <p>Anybody have idea why modify uPwd works with STARTLS from commandline, but not from Java ?</p>