2017-01-11 8 views
3

Я пытаюсь сбросить пароль пользователя Active Directory без ssl. Выясните из этого link, что стремление к ssl может быть отключено в AD. Но с помощью этого кода:Восстановление пароля Active Directory без SSL

import javax.naming.*; 
import javax.naming.directory.*; 
import javax.naming.ldap.*; 
import java.util.*; 
import java.security.*; 
public class ADConnection { 
DirContext ldapContext; 
String baseName = ",cn=users,DC=fabrikam,DC=com"; 
String serverIP = "10.1.1.7"; 
public ADConnection() { 
try { 
Hashtable ldapEnv = new Hashtable(11); 
ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
ldapEnv.put(Context.PROVIDER_URL, "ldap://" + serverIP + ":389"); 
ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); 
ldapEnv.put(Context.SECURITY_PRINCIPAL, "cn=administrator" + baseName); 
ldapEnv.put(Context.SECURITY_CREDENTIALS, "PA$$w0rd"); 
ldapContext = new InitialDirContext(ldapEnv); 
} 
catch (Exception e) { 
System.out.println(" bind error: " + e); 
e.printStackTrace(); 
System.exit(-1); 
} 
} 
public void updatePassword(String username, String password) { 
try { 
String quotedPassword = "\"" + password + "\""; 
char unicodePwd[] = quotedPassword.toCharArray(); 
byte pwdArray[] = new byte[unicodePwd.length * 2]; 
for (int i=0; i<unicodePwd.length; i++) { 
pwdArray[i*2 + 1] = (byte) (unicodePwd[i] >>> 8); 
pwdArray[i*2 + 0] = (byte) (unicodePwd[i] & 0xff); 
} 
ModificationItem[] mods = new ModificationItem[1]; 
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, 
new BasicAttribute("UnicodePwd", pwdArray)); 
ldapContext.modifyAttributes("cn=" + username + baseName, mods); 
} 
catch (Exception e) { 
System.out.println("update password error: " + e); 
System.exit(-1); 
} 
} 
public static void main(String[] args) { 
ADConnection adc = new ADConnection(); 
adc.updatePassword("Java User2", [email protected]); 
} 
} 

результат в:

javax.naming.OperationNotSupported: [LDAP: error code 53 - 00002077: SvcErr: DSID-03190F0A, problem 5003 (WILL_NOT_PERFORM).... 

Если предположить, что мы можем доверять документы Microsoft (пароль может быть сброшен через без SSL порт 389), я заподозрить Java API и хотите установить прямое соединение с AD с сокетами и запустить команды сброса пароля, фактически ища альтернативу javax.naming. *. Это возможно? кто-нибудь пробовал реселлировать пароль AD без ssl?

P.S: Сервер приложений и сервер AD находятся в частной защищенной сети, и я не беспокоюсь о нюхании.

+0

Java не поставляли или изобрести этот код ошибки. AD сделал. Поиск альтернативы 'javax.naming' не приведет вас никуда. Познакомьтесь с остальной частью сообщения об ошибке. – EJP

+0

Спасибо, это имеет смысл, но, как насчет всех «разрешить passwd op на незащищенном соединении», предложенном Microsoft? – redbeard1970

+1

Вы можете сбросить пароль через TCP 389, но сначала вам нужно выпустить команду STARTTLS, которая переключает контекст сеанса, который будет зашифрован. В любом случае вы не сможете обойти требование SSL для модификаций паролей в AD, если вы не измените [dsHeuristics] (https://msdn.microsoft.com/en-us/library/cc223560.aspx), что может быть чрезмерным для этого, когда вы можете просто выпустить STARTTLS и слепо принять сертификат (также рискованно ... вы должны проверить, что сертификат доверен, но он лучше, чем ничего ...). – ChadSikorra

ответ

0

Windows не позволяет изменять пароль в Active Directory через простой ldap. Для того, чтобы изменить атрибут unicodePwd, где AD хранит пароль, требуется соединение SSL.

Иногда вы можете получить исключение, как:

javax.naming.OperationNotSupportedException: [LDAP: error code 53 - 00002077: SvcErr: DSID-03190F4C, problem 5003 (WILL_NOT_PERFORM), data 0 ] 

Решение: Используйте SSL сертификат

Для того, чтобы изменить этот атрибут, клиент должен иметь 128-битную Transport Layer Security (TLS)/Secure Socket Layer (SSL) на сервер. Зашифрованный сеанс с использованием SSP-созданных ключей сеанса с использованием NTLM или Kerberos также допустим, если выполняется минимальная длина ключа.

Further reading

 Смежные вопросы

  • Нет связанных вопросов^_^