开发者社区> 极趣> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

通过java实现ldap修改AD域用户密码(最新,详细)

简介: 环境及说明,AD证书安装过程,AD证书的导出与导入,AD证书导入java密钥库中,java实现ldap改密
+关注继续查看
目录结构         

      一.概念介绍:windows域,域控

      二.环境及说明

      三.总体过程

      四.AD证书安装过程

      五.AD证书的导出与导入

      六.AD证书导入java密钥库中

     七.java编码实现

     八.问题说明

一.概念介绍

          本文摘要:AD证书安装过程,AD证书的导出与导入,AD证书导入java密钥库中,java实现ldap改密,环境及说明

        windows域:域常跟工作组做对比,这俩个概念有相似的地方,不理解域的可以参照工作组理解。但是,域一般是用在比较大的网络里,工作组则较小;域是有安全边界的,一个域内计算机建立信任关系。那么在域内访问其他机器,不再需要被访问机器的许可,需要一台计算机作为域控服务器。

         域控:能安全集中管理域中账户密码、管理策略等构成数据库,统一安全策略。包含这个域的账号,密码属于这个域的计算机等信息构成的数据库。

二.环境及说明

        1.安装Active Directory 的服务器(我使用的域名为hgcs.local)

        2.安装证书服务(需安装企业根证书)的服务器,此服务器加入hdcs域中(也可以用域控作为证书服务器,我的就是)
        3.安装JAVA应用的计算机,此服务器不需要加入hgcs域中(我是用的是mac电脑,win电脑参照进行修改)

         说明: LDAP 无法直接获取windows Active Directory 用户密码,需要通过一个安全的通道(我这里用的是ssl)

三.总体过程

           1 安装Active Directory 域控制器

           2 安装证书服务

           3 以域用户登录到安装了证书服务的服务器中,导出域根证书和计算机证书

           4 将证书倒入java密钥库中

           5 编码实现

四.AD证书安装过程

          说明:这里我用的服务器是 Windows server 2008 

                      *如果是第一次安装,为了避免出错,下列步骤中能勾选的复选框都选上。

                      *因服务器而异,在安装过程中,仔细阅读windows的说明信息,根据自己的需求作响应调整。

          1.Windows server,进入服务器管理器,如图4.1所示。

 

             ab52b2da7414b67beeb60322820b925b6ad15d97

                                                                 图4.1 服务器管理器

          2.服务器管理器,选择角色,右击,添加角色,如图4.2所示

            ee4f22da7a5988920477c83511546497c6c40b27

                                                                             图4.2 添加角色

        3.添加角色第一步,选择下一步,如图4.3所示

          085be6b307bc60710524942c3d0d3fce94cd19ca

                                                                  图4.3 添加角色-第一步

              4.添加角色第二步,选择Active Directory,下一步,如图4.4所示

            fde550a617dfdfadb27e1ba2043ba699a09eb50e

                                                                             图4.4 添加角色-第二步

          5.添加角色第三步,选择证书颁发机构web注册,会弹出添加角色向导,点击添加必须的角色服务,(这里注意能选的都选上,或者仔细读win说明)如图4.5所示

         8a1f3b04c9e4125a6e6a79d0f4caa1c39c23a5f9

                                                         图4.5 添加角色-第三步

       6.添加角色第四步,选择安装类型-企业,如图4.6所示

         01632f4bb62a5cb5b4b5175602886b4b66015116

                                                         图4.6 添加角色-第四步

          7.添加角色第五步,选择CA类型-根CA,如图4.7所示

         1400bd20ebba67a256bfae2cb970f160e479836f

                                                         图4.7 添加角色-第五步

        8.添加角色第六步,选择新建私钥,如图4.8所示

         70e51c6ea1b053fdf4d0a4b280e1b27c5a64ef35

                                                         图4.8 添加角色-第六步

         9.添加角色第七步,这里我用的是默认,密钥字体长度2048,哈希算法啥sha1,如图4.9所示

         8c26e6f5a3cbaee42d924c7ba77726e2760aacc6

                                                         图4.9 添加角色-第七步

          10.添加角色第八步,输入CA及dc,如图4.10所示

         0f4a91ca3140ea85e6b14d06f21b3cb03611266f

                                                         图4.10 添加角色-第八步

        11.添加角色第九步,这里怕错的话能选的都选上,如图4.11所示

         4dc1fef56ad8ce6010d28511de01c67d7c60ab8c

                                                         图4.11添加角色-第九步

          11.添加角色第十步,至此安装成功,如图4.12所示

         fe0b1796e65c230f5e996ba2a6282c5b05c75518

                                                         图4.12添加角色-第九步

五.AD证书导出

          说明:这里将导出的AD证书导入到java密钥库中,根据实际情况灵活使用。

                      *如果是第一次安装,为了避免出错,把能勾选的复选框都选上。

                      *这里要导出俩个证书,域根证书和计算机证书

           1.使用快捷键win+R进入‘运行’,输入mmc进入控制台,如图5.1。

            286e023d473d9581f9e0552838287b45488e0c31

                                                       图5.1进入控制台

          2.进入控制台,如果还没节点,如图5.2。可以添加,这里需要证书的节点。

            529e88dfdcdf78ab70563434d9fa02ea81a3762d

                                                       图5.2控制台-空

          3.添加管理单元,右击文件,选择添加/删除管理单元(本地计算机),如图5.3所示。

            2012f040e52b16ca23b22b56eca2f79f88b282d4

                                                       图5.3添加管理单元

           4.管理单元,选择‘证书’节点,点击添加,确定,如图5.4所示。

            1d9a22bc68b26b5f239122e305287536ca4b8b87

                                                       图5.4添加证书节点

           5.添加完‘证书’节点后,打开‘个人’,‘证书’,选择要导出的证书,如图5.5所示。

            3a258aa112ec1b2ad96b15820dc3e584d6ace73a

                                                       图5.5导出证书,第一步

           6.右击需要的证书,选择‘所有任务’,‘导出’,导出证书,如图5.6所示。

            7d8c4f96409d7a1a053dff7c62202895c8a04933

                                                       图5.6导出证书,第二步

          7.进入证书导出时,基本都是选择‘默认’直接下一步,下一步就可以,如图5.7所示。

            0107ceeca2a1176fc14c78f8c215cbaec3ad01cf

                                                       图5.7导出证书,第三步

          8.如果证书列表里只有一个证书,可能缺少计算机证书,可以根据步骤8,9申请新证书,再参照1-7导出证书,如图5.8所示。

            b0f5be54e2ef87f1ab43489214ae9b072f2f25ea

                                                       图5.8申请新证书

          9.申请新证书要选择证书类型为‘计算机’,其他选择默认,如图5.9所示。

            b6188a92c2ec06d5bea17c2ccd6a419425225ff4

                                                       图5.9申请新证书-要点


六.AD证书导入java密钥库中

       说明: 将从证书中导出的两个证书文件,*.cer 使用javakeytool工具创建或导入证书库文件中  

                  这里我导出时,根证书命名为‘ADroot.cer
’ ,计算机证书命名为‘AD.cer’       

                   /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home是我java根目录

                /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin 下有keytool工具

               /Users/handongchen/Desktop/ADroot.cer
 是我证书的位置

              /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin/keytool -import -keystore security.keystore -file /Users/handongchen/Desktop/ADroot.cer


          /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin/keytool -import -keystore security.keystore -alias comkey -file /Users/handongchen/Desktop/AD.cer       

        终端提示证书导入到密钥库,且没报错,说明证书导入完成,这时一定要看下security.keystore在那,我的是在/Users/xxxx/security.keystore

     也有可能在/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/security目录下。我的证书密码是“123456”

七.java编码实现

      import java.util.Hashtable;


import javax.naming.Context;

import javax.naming.directory.BasicAttribute;

import javax.naming.directory.DirContext;

import javax.naming.directory.ModificationItem;

import javax.naming.ldap.InitialLdapContext;

import javax.naming.ldap.LdapContext;


public class LdapTest {

@SuppressWarnings({ "unchecked", "rawtypes" })

public static void main(String[] args) {

// ladp的一些配置

Hashtable env = new Hashtable();

//String adminName = "Administrator@hgcs.local"; //管理员账号

String adminName = "cn=Administrator,cn=users,dc=hgcs,dc=local"; //管理员账号

String adminPassword = "root.1234";      //管理员密码

String userName = ("cn=wph1,cn=users,dc=hgcs,dc=local"); //用户

//String userName = ("wph@hgcs.local"); //用户

String newPassword = "root.1234";   //用户新密码

String keystore = "/Users/xxxx/security.keystore";

System.setProperty("javax.net.ssl.trustStore", keystore);

System.setProperty("javax.net.ssl.trustStorePassword", "123456"); 

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

env.put(Context.SECURITY_AUTHENTICATION, "simple");

env.put(Context.SECURITY_PRINCIPAL, adminName);

env.put(Context.SECURITY_CREDENTIALS, adminPassword);

env.put(Context.SECURITY_PROTOCOL, "ssl");

String ldapURL = "ldaps://192.168.23.156:636";

env.put(Context.PROVIDER_URL, ldapURL);

try {

// 初始化ldapcontext

LdapContext ctx = new InitialLdapContext(env, null);

ModificationItem[] mods = new ModificationItem[1];

String newQuotedPassword = "\"" + newPassword + "\"";

byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");

mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,

new BasicAttribute("unicodePwd", newUnicodePassword));

// 修改密码

ctx.modifyAttributes(userName, mods);

System.out.println("Reset Password for: " + userName);

ctx.close();

} catch (Exception e) {

System.out.println("Problem resetting password: " + e);

e.printStackTrace();

}


}


}

八.问题说明

       说明:下面是我写的catch里对错误的判断,可以参照

                      catch (Exception e) {

/*

* 根据ldap返回码判断错误原因并返回

*/

if (e.toString().indexOf("LDAP: error code") > 0) {

// 得到ldap返回的错误吗

String errorMsg = e.toString();

int startNum = errorMsg.toString().indexOf("LDAP: error code") + 17;

errorMsg = errorMsg.substring(startNum, startNum + 19);

int endNum = errorMsg.toString().indexOf(" - ");

errorMsg = errorMsg.substring(0, endNum);

if ("49".equals(errorMsg)) {

errorMsg = "域控管理员账户/密码错误";

} else if ("32".equals(errorMsg) || "34".equals(errorMsg)) {

errorMsg = "域内账户错误";

} else if ("10".equals(errorMsg)) {

errorMsg = "dc错误";

} else {

errorMsg = "修改失败,错误吗:" + errorMsg;

e.printStackTrace();

}

System.out.println("Problem resetting password(ldap):" + errorMsg);

return errorMsg;

} else {

if (e.toString().indexOf(

"algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext") > 0) {

System.out.println("Problem resetting password(ldap):" + "证书无效/证书密码错误");

return "修改失败,证书无效/证书密码错误";

}

if (e.toString().indexOf(

"the trustAnchors parameter must be non-empty") > 0) {

System.out.println("Problem resetting password(ldap):" + "证书不存在");

return "修改失败,证书不存在";

}

e.printStackTrace();

return "修改失败!";

}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
时间轮-Java实现篇
在前面的文章《[时间轮-理论篇](https://developer.aliyun.com/article/910513)》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。
328 0
《Java学习指南》—— 1.5 实现安全
安全管理器的完整性依赖于Java安全模型在更低层次所提供的保护。如果没有校验器和类加载器所提供的保证,有关系统资源安全性的高级断言就没有意义。由Java字节码校验器所提供的安全表明,解释器不能被破坏或搅扰,而且Java代码必须如期使用组件。
1786 0
【JAVA秒会技术之玩转图片】图片下载和等比或指定大小压缩快速实现
JAVA图片下载和等比或指定大小压缩工具类 话不多,直接上代码: package com.netease.test; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt
2155 0
Jackcard相似度和余弦相似度(向量空间模型)的java实现
版权声明:本文为博主原创文章,地址:http://blog.csdn.net/napoay,转载请留言。 总结Jackcard相似度和余弦相似度。
1058 0
Java并发指南9:AQS共享模式与并发工具类的实现
这位大侠,这是我的公众号:程序员江湖。 分享程序员面试与技术的那些事。 干货满满,关注就送。  一行一行源码分析清楚 AbstractQueuedSynchronizer (三) 转自:https://javadoop.com/post/AbstractQueuedSynchronizer-3 这篇文章是 AQS 系列的最后一篇,第一篇,我们通过 ReentrantLock 公平锁分析了 AQS 的核心,第二篇的重点是把 Condition 说明白,同时也说清楚了对于线程中断的使用。
991 0
Java实现全排列、组合算法
Java实现全排列、组合算法
9733 0
Java使用OpenCV3.2实现视频读取与播放
Java使用OpenCV3.2实现视频读取与播放 OpenCV从3.x版本开始其JAVA语言的SDK支持视频文件读写,这样就极大的方便了广大Java语言开发者学习与使用OpenCV,通过摄像头或者视频文件读取帧的内容与播放,完成视频内容分析与对象跟踪等各种应用开发任务。
1942 0
将c++静态库实现二次封装供java调用
工作中常常作为c++开发者,常常需要与java开发人员进行对接,或者他们看重了一些很好的c++库想借用,就需要将这些已有的开发可进行二次封装给java开发调用 首先需要从官网下载jdk并安装,例如本人的安装路径:C:\software\java\jdk1.
959 0
剑指offer Java实现
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/68935922 剑指offer Java实现 代码地址如下: https://github.
765 0
java多线程 -- 创建线程的第三者方式 实现Callable接口
Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。
671 0
+关注
极趣
不断追求上进的小菜,通过一点一滴的积累,完善大神之路。
14
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载