2017-01-11 12 views
3

sslなしでActive Directoryユーザーのパスワードをリセットしようとしています。このlinkを通して、sslに対する衝動がADで無効になる可能性があることを確認してください。しかし、このコードを使用して:SSLなしのActive Directoryパスワードリセット

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に直接接続し、reset passwordコマンドを実行して、実際にjavax.naming。*の代わりを探しています。それは可能ですか?誰もがSSLなしでADパスワードをリセットしようとした?

P.S:アプリケーションサーバーとADサーバーはプライベートなセキュリティ保護されたネットワークにあり、私は盗聴を心配していません。

+0

Javaはそのエラー・コードを提供したり工夫しませんでした。 ADはしました。 'javax.naming'の代替案を探すのはあなたをどこにでもつかまえません。残りのエラーメッセージを詳しく見てください。 – EJP

+0

ありがとう、それは意味がありますが、マイクロソフトが提案した「セキュリティで保護されていない接続でのパスワードの許可」はどうでしょうか? – redbeard1970

+1

パスワードはTCP 389でリセットできますが、まず暗号化するセッションのコンテキストを切り替えるSTARTTLSコマンドを発行する必要があります。いずれにしても、[dsHeuristics](https://msdn.microsoft.com/en-us/library/cc223560.aspx)を変更しない限り、ADのパスワード変更のSSL要件を回避することはできません。これは、あなたはSTARTTLSを発行し、盲目的に証明書を受け入れることもできます(また、危険です...証明書が信頼できるものであることを確認する必要がありますが、それは何よりも優れています...)。 – ChadSikorra

答えて

0

Windowsでは、プレーンなLDAPよりもActive Directoryのパスワードを変更できません。 ADがパスワードを保存するunicodePwd属性を変更するには、SSL接続が必要です。

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

ソリューション:

時々、あなたのような例外得ることができ、この属性を変更するために使用するSSL証明書

を、クライアントは(128ビットのトランスポートレイヤセキュリティを持っている必要がありますTLS)/サーバーへのSecure Socket Layer(SSL)接続。 NTLMまたはKerberosを使用してSSPによって作成されたセッションキーを使用して暗号化されたセッションも、最小キーの長さが満たされている限り、使用できます。

Further reading