Java 无法连接Active Directory以重置密码

Java 无法连接Active Directory以重置密码,java,ssl,active-directory,ssl-certificate,Java,Ssl,Active Directory,Ssl Certificate,我对这个领域完全陌生,对java也没有太多经验。我被分配了这个任务,我可以以管理员的身份以简单模式连接并检索信息,但无法重置密码。我在许多网站上发现,我必须使用ssl来实现这一点,但当我得到一个 “简单绑定失败” 错误我在下面发布了我的代码,包括我所做的事情以及我注释掉的代码(我之前尝试过)。请帮忙。我从任何渠道都无法解决这个问题。我使用了从服务器复制到密钥库的证书。这是正确的使用方法吗??如果我删除ssl部分 env.put(Context.SECURITY_PROTOCOL,"ssl");

我对这个领域完全陌生,对java也没有太多经验。我被分配了这个任务,我可以以管理员的身份以简单模式连接并检索信息,但无法重置密码。我在许多网站上发现,我必须使用ssl来实现这一点,但当我得到一个

“简单绑定失败”

错误我在下面发布了我的代码,包括我所做的事情以及我注释掉的代码(我之前尝试过)。请帮忙。我从任何渠道都无法解决这个问题。我使用了从服务器复制到密钥库的证书。这是正确的使用方法吗??如果我删除ssl部分

 env.put(Context.SECURITY_PROTOCOL,"ssl");
我得到一个握手例外

Problem with TLS: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: signature check failed


public class ActiveDirectory {
private DirContext ctx;

public boolean connect(String username,String password){
    Hashtable<String, String> env = new Hashtable<String, String>();
//      Properties env=new Properties();
    env.put(Context.SECURITY_PROTOCOL,"ssl");
    env.put(Context.INITIAL_CONTEXT_FACTORY,
            "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.PROVIDER_URL, "ldap://192.168.1.199:389");
    env.put(Context.REFERRAL, "follow");

    // The value of Context.SECURITY_PRINCIPAL must be the logon username
    // with the domain name
    env.put(Context.SECURITY_PRINCIPAL, username+"@xxxx.net");

    // The value of the Context.SECURITY_CREDENTIALS should be the user's
    // password
    env.put(Context.SECURITY_CREDENTIALS, password);

    try {
        // Authenticate the logon user
        ctx = new InitialLdapContext(env,null);
        return true;
    }catch(NamingException e){
        System.out.println("Error in connecting : " + e.getMessage());
        return false;
    }

}


public boolean changePasswordAdmin(String userName,String newPassword){
    try {

        //set password is a ldap modfy operation
        //Secure the session with TLS

        StartTlsResponse tls = (StartTlsResponse)((LdapContext) ctx).extendedOperation(new StartTlsRequest());
        tls.negotiate();

        //set password is a ldap modfy operation
        ModificationItem[] mods = new ModificationItem[1];

        //Replace the "unicdodePwd" attribute with a new value
        //Password must be both Unicode and a quoted string
        String newQuotedPassword = "\"" + newPassword + "\"";
        byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");

        mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("unicodePwd", newUnicodePassword));

        // Perform the update
        ctx.modifyAttributes(userName, mods);

        System.out.println("Reset Password for: " + userName);
        tls.close();
        ctx.close();
        return true;
    } 
    catch (NamingException e) {
        System.out.println("Problem resetting password: " + e);
    }
    catch (UnsupportedEncodingException e) {
        System.out.println("Problem encoding password: " + e);
    }
    catch (IOException e) {
        System.out.println("Problem with TLS: " + e);
    }
    return false;
}

public static void main(String args[]) throws NamingException {
    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); 
    // the keystore that holds trusted root certificates 
    System.setProperty("javax.net.ssl.trustStore", "C:\\keystore.jks"); 
    System.setProperty("javax.net.ssl.trustStorePassword", "****"); 
    System.setProperty("javax.net.ssl.keyStore", "C:\\keystore.jks"); 
    System.setProperty("javax.net.ssl.keyStorePassword", "****"); 


    ActiveDirectory d= new ActiveDirectory();
    d.connect("Administrator", "Group&Team2");
    System.out.println(d.fetchData("MG"));
    System.out.println(d.changePasswordAdmin("CN=Manager MG. Manager,OU=Manager,DC=xxxxx,DC=net", "Abcd@10"));
}
}
TLS问题:javax.net.ssl.SSLHandshakeException:sun.security.validator.validator异常:PKIX路径验证失败:java.security.cert.certpathValidator异常:签名检查失败 公共类ActiveDirectory{ 私有目录ctx; 公共布尔连接(字符串用户名、字符串密码){ Hashtable env=新的Hashtable(); //Properties env=新属性(); 环境put(上下文安全协议,“ssl”); 环境放置(Context.INITIAL\u Context\u工厂, “com.sun.jndi.ldap.LdapCtxFactory”); 环境put(Context.SECURITY_认证,“simple”); env.put(Context.PROVIDER\u URL,“ldap://192.168.1.199:389"); 环境投入(Context.reference,“follow”); //Context.SECURITY\u PRINCIPAL的值必须是登录用户名 //使用域名 环境put(Context.SECURITY_主体,用户名+“@xxxx.net”); //Context.SECURITY\u凭据的值应该是用户的 //密码 环境放置(Context.SECURITY\u凭证、密码); 试一试{ //对登录用户进行身份验证 ctx=新的InitialLdapContext(env,null); 返回true; }捕获(NamingE例外){ System.out.println(“连接错误:+e.getMessage()); 返回false; } } 公共布尔changePasswordAdmin(字符串用户名、字符串新密码){ 试一试{ //设置密码是ldap修改操作 //使用TLS保护会话 StartTlsResponse tls=(StartTlsResponse)((LdapContext)ctx).extendedOperation(新的StartTlsRequest()); 协商(); //设置密码是ldap修改操作 ModificationItem[]mods=新的ModificationItem[1]; //用新值替换“UnicodePwd”属性 //密码必须是Unicode和带引号的字符串 字符串newQuotedPassword=“\”“+newPassword+”\”; byte[]newUnicode密码=newQuotedPassword.getBytes(“UTF-16LE”); mods[0]=新的修改项(DirContext.REPLACE_属性,新的基本属性(“unicodePwd”,newUnicodePassword)); //执行更新 修改属性(用户名、mods); System.out.println(“重置密码:“+用户名”); tls.close(); ctx.close(); 返回true; } 捕获(NamingE例外){ System.out.println(“重置密码时出现问题:+e”); } 捕获(不支持的编码异常e){ System.out.println(“问题编码密码:+e”); } 捕获(IOE异常){ System.out.println(“TLS问题:+e”); } 返回false; } 公共静态void main(字符串args[])引发NamingException{ addProvider(新的com.sun.net.ssl.internal.ssl.Provider()); //保存受信任根证书的密钥库 System.setProperty(“javax.net.ssl.trustStore”,“C:\\keystore.jks”); System.setProperty(“javax.net.ssl.trustStorePassword”、“****”; set属性(“javax.net.ssl.keyStore”,“C:\\keyStore.jks”); System.setProperty(“javax.net.ssl.keystrepassword”、“****”; ActiveDirectory d=新的ActiveDirectory(); d、 连接(“管理员”、“组和团队2”); System.out.println(d.fetchData(“MG”)); System.out.println(d.changePasswordAdmin(“CN=Manager-MG.Manager,OU=Manager,DC=xxxxx,DC=net,”Abcd@10")); } }
您的active directory没有有效的证书

这可能是因为根证书不是用Java导入的


是一个如何将证书导入java的小教程。

Errrr。。。实际上,我从服务器激活了active directory证书服务(win 2008)并复制了证书,将其添加到jre\lib\security中的cacerts???您是否将证书添加到密钥库?#转换:openssl x509-在a-cert-globaltrust.crt中-out a-cert-globaltrust.pem-outform pem您能告诉我这是什么意思吗??我想在我的系统中使用openssl。。(MD5)(SHA1)(PGP标志)有三个吗?你用过钥匙工具吗?是的,我用过。。。。keytool-import-trustcacerts-alias root-file xxxx.crt-keystore keystore.jks