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
确认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账户及设置密码相关推荐
- java 忽略SSL证书
** java 忽略SSL证书 ** 代码如下:(网上借鉴了很多大神的写法,都不能实现,最终使用以下代码亲测可行,侵联删) ```java import org.apache.http.Header; ...
- Self-Signed SSL证书创建和使用
一. 创建 Self-Signed SSL Certificate(自签名证书) 一般可用于个人测试使用和非域名https访问,通常CA机构不支持颁发IP证书,只有个别OV机构支持公网IP证书,但只能 ...
- java生成ssl证书和部署
自签名SSL证书的生成 自签证书虽然提示:不安全.但还是有很多的好处,所以下面先说说自签证书的生成,主要使用Java JDK下的:keytool.exe 2:安装完后,根据实际的路径找到keytool ...
- Java管理SSL证书
SSL证书结构 根证书的生成分为三个部分: 生成根证书的公钥和私钥 构建证书的原始证书,包括公钥.加密算法.生效时间.过期时间等信息. 用根证书私钥对原始证书进行签名,生成合法的根证书. 根证书安装, ...
- java存款输入密码类,创建一个银行账户类,包括账号、用户姓名、密码和余额属性,实现开户、查询余额、取款、存款功能。...
用类与对象创建一个银行账户类.银行账户类包括账号.用户姓名.密码和余额属性,银行账户类的功能包括: 开户 查询余额 取款 存款 功能实现思路: 开户方法 Account(),创建账户的账号.密码.姓名 ...
- 使用java进行SSL证书的签名与签验
一.签名与签验的含义 签名:客户端使用私钥对字符串加密,得到一个加密后的字符串 签验(签名验证):服务端使用公钥对字符串加密,验证加密后的字符串是否和客户端签名后一样 二.创建私钥.证书等文件 在li ...
- Java生成SSL证书
1. 背景 2. 演示环境 3. 命令 4. 创建证书 5. 查看证书 5.1. 显示详细 5.2. 编码打印 6. 导入导出证书 6.1. 导出 6.2. 导入 7. 修改密码 7.1. 修改密钥库 ...
- java无视ssl证书构建post/get请求【伸手党福利】
首先上其他人写的工具类(看原理) java忽略证书验证(兼容http,https)进行get/post请求–使用(org.apache.httpcomponents httpclient客户端) ht ...
- Java爬虫https网页内容报错SSLHandshakeException信任(忽略)所有SSL证书
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building f ...
最新文章
- 一个模型击溃12种AI造假,各种GAN与Deepfake都阵亡
- 聊聊storm的direct grouping
- mybatis-plus根据多个字段排序_Mybatis Plus学习笔记(逻辑删除/动态填充/常用插件)...
- 工业级光纤收发器的选用方法
- 十六、Python操作excel(.xlsx)封装类MyPyExce
- PyQt5学习笔记01----第一个窗口
- 收藏 | 北大华为鹏城联合首次提出视觉 Transformer 后量化算法!
- linux,想说爱你真的很不容易!
- 创建线程的3种方式,线程池的参数详解
- 进程的初步认识(程序与进程、并发、单道程序设计、多道程序设计、CPU、MMU)
- 用.iso文件从硬盘安装redhatlinux7.3(转)
- FPGA的基本设计流程
- C UDR 的内存分配
- Java程序:停车场计费
- 多卡聚合智能融合通信设备在智慧房车上的应用
- 【历史上的今天】7 月 20 日:人类登上月球;数据仓库之父诞生;Mac OS X Lion 发布
- 如何取消共享计算机管理员权限设置密码,Win7旗舰版系统共享文件夹设置密码如何设置...
- 学习笔记-公有云安全
- 丰田工机安全plc编程软件pcwin safe 14而且还是中文版的
- 2022张宇考研基础30讲 第十二讲 二重积分
热门文章
- MATLAB课程表分配问题,求助matlab大神,学校的课程安排太骚了,我们压根就不用学matlab...
- php获取表单内的值,PHP获取表单里各项值总结
- 当前完整路径_详解关键路径法,这可能是你找得到最详细的了
- memcached的java客户端_Memcached Java客户端
- python隐式等待_selenium中隐式等待和显示等待的区别
- python 函数进度条怎么_刷新你对进度条的认识,用python写出不一样的进度条
- 用python做简单的地理聚类分析案例_用Python做一个简单的翻译工具
- php poi,GitHub - satthi/poi-php: poi-php
- idea cloud bootstrap是啥_application.yml与bootstrap.yml的区别
- mysql数据库唯一性_在MySQL数据库中添加唯一性约束,范围可能吗?