近期由于工作需要整理一下自动化的东西,因为公司去年上线了OA,所以公司的入职系统会提交用户的信息到IT部门,最早的做法是入职到了,IT部门收集用户信息在AD中创建对应的用户信息,所以为了提高管理员的工作效率,所以准备实施自动创建AD账户,当OA流程到IT人员审批节点后,IT人员审批后根据人员信息自动创建AD账户,所以整理了一些JAVA创建AD人员信息的信息,但是我们需要注意点的是,对于JAVA语言操作MS AD的一些普通操作是不需要SSL的,但是对于用户密码的重置操作必须使用SSL,当然之前看网上有说可以跳过的,但是没有试验成功,所以还是按照标准的配置来通过SSL对用户的AD密码进行操作,废话不多说了,今天我们主要介绍使用JAVA通过SSL方式创建MS AD账户,因为要对创建的用户设置密码,所以需要使用SSL证书,既然需要SSL证书,目的就是为了让JAVA信任LDAP,所以我们需要从AD中导出受信任的证书,然后导入到JAVA运行环境中的JRE下的cacert证书文件中。我们既然说到了OA,其实OA中就可以通过系统自带的功能进行证书申请及证书导入,这样比较简单;当然如果没有OA环境的,我们可以通过JAVA运行环境中的JDK中的keytool进行证书导入工作,我们下面都会介绍到;

我们首先使用OA中的功能进行证书导入;我们OA中的证书路劲在/OAFS/WEAVER/jdk1.8.0_101/jre/lib/security/cacerts

确认OA环境中的JDK路劲后,我们接下来就是证书申请及导入了;

我们访问OA的地址,然后路劲增加/integration/ldapcert.jsp路劲访问即可;如果没有后面的JAVA文件可以找OA供应商要;或者在附件下载;

我们首先下载附件中的文件,下载后,附件中有三个文件;classbean、

我们首先进入classbean文件夹内的内容拷贝到对应的OA服务器的对应目录;

ecology\classbean\weaver\ldap

2.然后将解压文件中的文件夹integration文件中的以下文件拷贝到OA的对应的服务器目录下:

ecology\integration

3.因为解压后有三个文件夹,第三个文件夹src为源码,我们就不用管了

按照以上方法走完后,我们就可以通过以下链接来配置了

http://192.168.6.101/integration/ldapcert.jsp

访问后,我们再LDAP IP输入环境的AD DC服务器地址,系统会默认填写LDAP端口636,及证书路劲,这些信息系统会自动补全;我们需要手动设置证书密码,一般我们都会设置成changeit,设置好这些信息后,我们导入证书,会提示下面的导入信息;

导入完成

然后我们需要在证书路劲下载证书到本地的JRE环境进行测试了

接着我们看看第二种方式的证书申请;

我们需要从DC上导入域的根证书

mmc---增加---证书---计算机---个人---选择根证书----导出

不需要导出私钥

使用默认的DRE编码

保存

我们按照同样的方式,将另外一张也导出来

然后我们需要在本地的JDK环境中导入该根证书到JDK环境中的证书中;

我本地的JDK环境路劲D:\Development_Environment\java\jdk\jre\lib\security

然后运行命令将刚才导出的根证书导入到该路劲的cacert证书文件中;

我们首先要cd到jdk路劲

1
cd D:\Development_Environment\java\jdk\jre\bin

然后将刚才导出的根证书保存到D盘下,通过以下命令导入

1
keytool keytool -import -keystore    D:\Development_Environment\java\jdk\jre\lib\security\cacerts -storepass changeit -keypass changeit -alias CA -file d:\ADroot.cer

输入Y受信任

然后我们就可以通过

接着就是看看ADDS环境了

换进准备好,我们就可以上代码了;

我们设置好证书路劲,及LDAP验证信息,及需要注册的用户名

账户注册成功

上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com.ixmsoft.oa.util;   
   
import java.util.Properties;   
   
import javax.naming.*;   
import javax.naming.ldap.*;   
import javax.naming.directory.*;   
   
/**  
 * @author Keven Chen  
 * @version $Revision 1.0 $  
 *   
 */  
public class AddAdUser {   
    private static final String SUN_JNDI_PROVIDER = "com.sun.jndi.ldap.LdapCtxFactory";   
   
    public static void main(String[] args) throws Exception {   
        String keystore = "D:\\Development_Environment\\java\\jdk\\jre\\lib\\security\\cacerts";   
        System.setProperty("javax.net.ssl.trustStore", keystore);   
   
        Properties env = new Properties();   
   
        env.put(Context.INITIAL_CONTEXT_FACTORY, SUN_JNDI_PROVIDER);// java.naming.factory.initial   
        env.put(Context.PROVIDER_URL, "ldap://192.168.5.20:636");// java.naming.provider.url   
        env.put(Context.SECURITY_AUTHENTICATION, "simple");// java.naming.security.authentication   
        env.put(Context.SECURITY_PRINCIPAL,   
                "cn=Administrator,cn=Users,dc=ixmsoft,dc=com");// java.naming.security.principal   
        env.put(Context.SECURITY_CREDENTIALS, "123");// java.naming.security.credentials   
        env.put(Context.SECURITY_PROTOCOL, "ssl");   
   
        String userName = "CN=gaowenlong,OU=IXM Adm,OU=IMXSOFT Users,DC=ixmsoft,DC=com";   
        String groupName = "CN=Domain Admins,CN=Users,DC=ixmsoft,DC=com";   
   
        LdapContext ctx = new InitialLdapContext(env, null);   
   
        // Create attributes to be associated with the new user   
        Attributes attrs = new BasicAttributes(true);   
   
        // These are the mandatory attributes for a user object   
        // Note that Win2K3 will automagically create a random   
        // samAccountName if it is not present. (Win2K does not)   
        attrs.put("objectClass""user");   
        attrs.put("sAMAccountName""gaowenlong");   
        attrs.put("cn""gaowenlong");   
   
        // These are some optional (but useful) attributes   
        attrs.put("sn""gaowenlong");   
        attrs.put("displayName""gaowenlong");   
        attrs.put("description""gaowenlong");   
        attrs.put("userPrincipalName""gaowenlong@ixmsoft.com");   
        attrs.put("mail""gaowenlong@ixmsoft.com");   
        attrs.put("telephoneNumber""1234568999");   
   
        // some useful constants from lmaccess.h   
        int UF_ACCOUNTDISABLE = 0x0002;  //禁用账户 
        int UF_PASSWD_NOTREQD = 0x0020;   //用户不能修改密码
        int UF_PASSWD_CANT_CHANGE = 0x0040;   
        int UF_NORMAL_ACCOUNT = 0x0200;   //正常用户
        int UF_DONT_EXPIRE_PASSWD = 0x10000;   //密码永不过期
        int UF_PASSWORD_EXPIRED = 0x800000;   //密码已经过期
   
        // Note that you need to create the user object before you can   
        // set the password. Therefore as the user is created with no   
        // password, user AccountControl must be set to the following   
        // otherwise the Win2K3 password filter will return error 53   
        // unwilling to perform.   
   
        attrs.put("userAccountControl", Integer.toString(UF_NORMAL_ACCOUNT   
                + UF_PASSWD_NOTREQD + UF_PASSWORD_EXPIRED + UF_ACCOUNTDISABLE));   
   
        // Create the context   
        Context result = ctx.createSubcontext(userName, attrs);   
        System.out.println("Created disabled account for: " + userName);   
   
        ModificationItem[] mods = new ModificationItem[2];   
   
        // Replace the "unicdodePwd" attribute with a new value   
        // Password must be both Unicode and a quoted string   
        String newQuotedPassword = "\"Password2000\"";   
        byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");   
   
        mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,   
                new BasicAttribute("unicodePwd", newUnicodePassword));   
        mods[1] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,   
                new BasicAttribute("userAccountControl", Integer   
                        .toString(UF_NORMAL_ACCOUNT + UF_PASSWORD_EXPIRED)));   
   
        // Perform the update   
        ctx.modifyAttributes(userName, mods);   
        System.out.println("Set password & updated userccountControl");   
        // now add the user to a group.   
   
        try {   
            ModificationItem member[] = new ModificationItem[1];   
            member[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE,   
                    new BasicAttribute("member", userName));   
   
            ctx.modifyAttributes(groupName, member);   
            System.out.println("Added user to group: " + groupName);   
   
        catch (NamingException e) {   
            System.err.println("Problem adding user to group: " + e);   
        }   
        // Could have put tls.close() prior to the group modification   
        // but it seems to screw up the connection or context ?   
   
        ctx.close();   
   
        System.out.println("Successfully created User: " + userName);   
   
    }   
   
}

我们查看

查看账户属性

然后查看属性

我们将java文件上传到附件中,如果加在eclipse中有报错,请根据错误提示,右击导入ldap相关的包即可,

本文转自 高文龙 51CTO博客,原文链接:http://blog.51cto.com/gaowenlong/1969585,如需转载请自行联系原作者

JAVA通过SSL证书创建MS AD账户及设置密码相关推荐

  1. java 忽略SSL证书

    ** java 忽略SSL证书 ** 代码如下:(网上借鉴了很多大神的写法,都不能实现,最终使用以下代码亲测可行,侵联删) ```java import org.apache.http.Header; ...

  2. Self-Signed SSL证书创建和使用

    一. 创建 Self-Signed SSL Certificate(自签名证书) 一般可用于个人测试使用和非域名https访问,通常CA机构不支持颁发IP证书,只有个别OV机构支持公网IP证书,但只能 ...

  3. java生成ssl证书和部署

    自签名SSL证书的生成 自签证书虽然提示:不安全.但还是有很多的好处,所以下面先说说自签证书的生成,主要使用Java JDK下的:keytool.exe 2:安装完后,根据实际的路径找到keytool ...

  4. Java管理SSL证书

    SSL证书结构 根证书的生成分为三个部分: 生成根证书的公钥和私钥 构建证书的原始证书,包括公钥.加密算法.生效时间.过期时间等信息. 用根证书私钥对原始证书进行签名,生成合法的根证书. 根证书安装, ...

  5. java存款输入密码类,创建一个银行账户类,包括账号、用户姓名、密码和余额属性,实现开户、查询余额、取款、存款功能。...

    用类与对象创建一个银行账户类.银行账户类包括账号.用户姓名.密码和余额属性,银行账户类的功能包括: 开户 查询余额 取款 存款 功能实现思路: 开户方法 Account(),创建账户的账号.密码.姓名 ...

  6. 使用java进行SSL证书的签名与签验

    一.签名与签验的含义 签名:客户端使用私钥对字符串加密,得到一个加密后的字符串 签验(签名验证):服务端使用公钥对字符串加密,验证加密后的字符串是否和客户端签名后一样 二.创建私钥.证书等文件 在li ...

  7. Java生成SSL证书

    1. 背景 2. 演示环境 3. 命令 4. 创建证书 5. 查看证书 5.1. 显示详细 5.2. 编码打印 6. 导入导出证书 6.1. 导出 6.2. 导入 7. 修改密码 7.1. 修改密钥库 ...

  8. java无视ssl证书构建post/get请求【伸手党福利】

    首先上其他人写的工具类(看原理) java忽略证书验证(兼容http,https)进行get/post请求–使用(org.apache.httpcomponents httpclient客户端) ht ...

  9. Java爬虫https网页内容报错SSLHandshakeException信任(忽略)所有SSL证书

    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building f ...

最新文章

  1. 一个模型击溃12种AI造假,各种GAN与Deepfake都阵亡
  2. 聊聊storm的direct grouping
  3. mybatis-plus根据多个字段排序_Mybatis Plus学习笔记(逻辑删除/动态填充/常用插件)...
  4. 工业级光纤收发器的选用方法
  5. 十六、Python操作excel(.xlsx)封装类MyPyExce
  6. PyQt5学习笔记01----第一个窗口
  7. 收藏 | 北大华为鹏城联合首次提出视觉 Transformer 后量化算法!
  8. linux,想说爱你真的很不容易!
  9. 创建线程的3种方式,线程池的参数详解
  10. 进程的初步认识(程序与进程、并发、单道程序设计、多道程序设计、CPU、MMU)
  11. 用.iso文件从硬盘安装redhatlinux7.3(转)
  12. FPGA的基本设计流程
  13. C UDR 的内存分配
  14. Java程序:停车场计费
  15. 多卡聚合智能融合通信设备在智慧房车上的应用
  16. 【历史上的今天】7 月 20 日:人类登上月球;数据仓库之父诞生;Mac OS X Lion 发布
  17. 如何取消共享计算机管理员权限设置密码,Win7旗舰版系统共享文件夹设置密码如何设置...
  18. 学习笔记-公有云安全
  19. 丰田工机安全plc编程软件pcwin safe 14而且还是中文版的
  20. 2022张宇考研基础30讲 第十二讲 二重积分

热门文章

  1. MATLAB课程表分配问题,求助matlab大神,学校的课程安排太骚了,我们压根就不用学matlab...
  2. php获取表单内的值,PHP获取表单里各项值总结
  3. 当前完整路径_详解关键路径法,这可能是你找得到最详细的了
  4. memcached的java客户端_Memcached Java客户端
  5. python隐式等待_selenium中隐式等待和显示等待的区别
  6. python 函数进度条怎么_刷新你对进度条的认识,用python写出不一样的进度条
  7. 用python做简单的地理聚类分析案例_用Python做一个简单的翻译工具
  8. php poi,GitHub - satthi/poi-php: poi-php
  9. idea cloud bootstrap是啥_application.yml与bootstrap.yml的区别
  10. mysql数据库唯一性_在MySQL数据库中添加唯一性约束,范围可能吗?