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

近期由于工作需要整理一下自动化的东西,因为公司去年上线了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

image

确认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,设置好这些信息后,我们导入证书,会提示下面的导入信息;

image

导入完成

image

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

image

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

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

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

image

不需要导出私钥

image

使用默认的DRE编码

image

保存

image

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

image

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

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

image

然后运行命令将刚才导出的根证书导入到该路劲的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

image

输入Y受信任

image

然后我们就可以通过

接着就是看看ADDS环境了

image

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

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

image

账户注册成功

image

上代码:

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);   
   
    }   
   
}

我们查看

image

查看账户属性

image

然后查看属性

image

image

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



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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 实体类规范_实体类的规范

1.Boolean类型1.1.使用Boolean类型,而不是Byte类型1.2.数据库字段名使用is_开头1.3.实体类字段名不使用is开头例子/*** 是否为新消息*/Column(name "is_new_message", nullable false)private Boolean newMessage;2.Enum类型1.使用Convert注解, 并指定coverter类例…

01电话拨号器

实例非常简单,意在体验Android的Intent,用户权限。 Intent 见 http://blog.csdn.net/zengmingen/article/details/49586045 用户权限 见 http://blog.csdn.net/zengmingen/article/details/49586569 --------------------------------------------------…

微信小程序笔记六模块化 —— module.exports

微信小程序中所有 js 文件作用域皆为独立的,每一个 js 文件即为一个模块。模块与模块之间的引用通过 module.exports 或 exports 对外暴露接口。 注意: exports 是 module.exports 的一个引用,因此在模块里边随意更改 exports 的指向会造成未…

java常用的统计_(OJ)Java常用类-统计数字次数

统计数字次数Problem Description命令行输入一个由数字组成的任意字符串,统计出每个数字出现的次数。Input Description1239586838Output Description0 counts:01 counts:12 counts:13 counts:24 counts:05 counts:16 counts:17 counts:08 counts:39 counts:1解题代码import ja…

02发送短信

使用SmsManager发送短信java.lang.Object ↳android.telephony.SmsManagerManages SMS operations such as sending data, text, and pdu SMS messages. Get this object by calling the static method SmsManager.getDefault().管理短信操作,如发送数据&#xff…

Python运行环境与异常处理

Python的命令格式: python [option] ... [-c cmd | -m mod | file | -] [arg] ... 选项描述-J 启动将从Python3中删除或更改某些功能的警告 -B阻止在导入时创建.pyc或.pyo文件-E忽略环境变量-h打印所有可用命令行选项的列表-i在程序执行后进入交互模式-m module以脚…

Java应用一般架构

原文链接:http://www.iteye.com/news/31115 当我们架设一个系统的时候通常需要考虑到如何与其他系统交互,所以我们首先需要知道各种系统之间是如何交互的,使用何种技术实现。 1. 不同系统不同语言之间的交互 现在我们常见的不同系统不同语…

Mac MongoDB未正常关闭导致重启失败

你可以删除掉mongod.lock文件,然后重新启动,如果还是不可以,你可以查看一下进程,然后杀掉: ps -aef | grep mongo sudo kill 1076 再重启数据库即可。

微信企业号让IOS不要识别数字为电话号码的方法

最近在开发一个联系人查看功能时,发现IOS端把 8位,11位的数字识别为了 电话号码。 本来是黑色的样式,变成了蓝色的样式,还添加了下划线。点击一下,还可以拨打电话。 这个问题要改,解决方法很简单&#xf…

powerdns与nginx结合实现以域名和IP方式访问web服务器80端口时分别跳转到不同页面...

1.powerdns设置 2.内部网站介绍 web服务器采用nginx,内网dns采用powerdns. 想实现的功能如下 通过ip访问时跳转到A页面,通过域名访问时,让其跳转到B页面。两种方式的端口均为80. 页面A对应的nginx配置 server { listen 80; …

Installation error code: -103签名不一致错误

调用Android系统的PackageInstallerActivity进行app安装时,报Installation error code: -103 错误。 原因是:签名问题。 可能是 1、正安装的应用没用签名 2、正安装的应用与已安装的应用包相同,但签名不同。 解决方法: 1、给…

java代码块是对象吗_面向对象(Java中普通代码块,构造代码块,静态代码块区别及代码示例)...

//静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。//如果类中包含多个静态代码块,那么将按照&quo…

Android adb命令选择设备操作

当开了多个模拟器时,安装app需要指定虚拟机,否则会提示:error: more than one device and emulator 1、先adb devices 查看设备列表 List of devices attached emulator-5554 device emulator-5556 device 2、使用命令 adb -s emulat…

java 视图解析器_SpringMVC——视图和视图解析器

请求处理方法执行完成后,最终返回一个 ModelAndView对象。对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象,它包含了逻辑名和模型对象的视图Spring MVC 借助视图解…

Android app 应用签名

为什么要签名? 这个要从Android的系统设计来解释。 ---Android系统中的每个应用都是一个用户,应用的包名(清单文件中 package的值)就是用户名。 当一个已安装的应用A和一个正要安装的应用B,它们的包名相同&#xff…

[.Net线程处理系列]专题五:线程同步——事件构造

引言: 其实这部分内容应该是属于专题四,因为这篇也是讲关于线程同步的,但是由于考虑到用户的阅读习惯问题,因为文章太长了,很多人不是很愿意看包括我也是这样的,同时也有和我说可以把代码弄成折叠的&#x…

java redis set list_RedisTemplate的各种操作(set、hash、list、string)_lichuangcsdn的博客-CSDN博客...

注入以下RedisTemplateAutowiredprivate RedisTemplate redisTemplate;1、保存和读取Set:代码示例:SetOperations set redisTemplate.opsForSet(); set.add("set1","22"); set.add("set1","33"); set.add(&quo…

闪屏页面(Splash)开发

业余作品--365安全卫士 ------------------------------------------- 闪屏页面(Splash):app刚启动时的页面 作用: 1、展示公司品牌logo 2、应用初始化。如游戏app第一次启动初始化数据 3、检测新版本。 4、检测程序合法性。如 招商银行app在启动…

matlab2016b ubuntu命令行安装 + matconvnet的安装

0. 下载安装包 下载的文件有Matlab 2016b Linux64 Crack.rar,R2016b_glnxa64_dvd2.iso,R2016b_glnxa64_dvd1.iso。 1. 拷贝安装文件并上传服务器 在Windows下用虚拟光驱打开,并将R2016b_glnxa64_dvd1.iso和R2016b_glnxa64_dvd2.iso所有内容复…

科普dip,dp,sp,dpi,ppi,px,Density

一、概念 DPI:DPI是Dots Per Inch的缩写,也就是“每英寸点数”,打印机分辨率。这里所说的“点”,在屏幕上并不是不变的,并不是唯一对应屏幕上的像素点,而是受到分辨率等因素的影响。这个点有可能是1个像素…