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