JAVA通过SSL证书创建MS AD账户及设置密码
近期由于工作需要整理一下自動化的東西,因為公司去年上線了OA,所以公司的入職系統(tǒng)會提交用戶的信息到IT部門,最早的做法是入職到了,IT部門收集用戶信息在AD中創(chuàng)建對應的用戶信息,所以為了提高管理員的工作效率,所以準備實施自動創(chuàng)建AD賬戶,當OA流程到IT人員審批節(jié)點后,IT人員審批后根據(jù)人員信息自動創(chuàng)建AD賬戶,所以整理了一些JAVA創(chuàng)建AD人員信息的信息,但是我們需要注意點的是,對于JAVA語言操作MS AD的一些普通操作是不需要SSL的,但是對于用戶密碼的重置操作必須使用SSL,當然之前看網(wǎng)上有說可以跳過的,但是沒有試驗成功,所以還是按照標準的配置來通過SSL對用戶的AD密碼進行操作,廢話不多說了,今天我們主要介紹使用JAVA通過SSL方式創(chuàng)建MS AD賬戶,因為要對創(chuàng)建的用戶設(shè)置密碼,所以需要使用SSL證書,既然需要SSL證書,目的就是為了讓JAVA信任LDAP,所以我們需要從AD中導出受信任的證書,然后導入到JAVA運行環(huán)境中的JRE下的cacert證書文件中。我們既然說到了OA,其實OA中就可以通過系統(tǒng)自帶的功能進行證書申請及證書導入,這樣比較簡單;當然如果沒有OA環(huán)境的,我們可以通過JAVA運行環(huán)境中的JDK中的keytool進行證書導入工作,我們下面都會介紹到;
我們首先使用OA中的功能進行證書導入;我們OA中的證書路勁在/OAFS/WEAVER/jdk1.8.0_101/jre/lib/security/cacerts
確認OA環(huán)境中的JDK路勁后,我們接下來就是證書申請及導入了;
我們訪問OA的地址,然后路勁增加/integration/ldapcert.jsp路勁訪問即可;如果沒有后面的JAVA文件可以找OA供應商要;或者在附件下載;
我們首先下載附件中的文件,下載后,附件中有三個文件;classbean、
我們首先進入classbean文件夾內(nèi)的內(nèi)容拷貝到對應的OA服務器的對應目錄;
ecology\classbean\weaver\ldap
2.然后將解壓文件中的文件夾integration文件中的以下文件拷貝到OA的對應的服務器目錄下:
ecology\integration
3.因為解壓后有三個文件夾,第三個文件夾src為源碼,我們就不用管了
按照以上方法走完后,我們就可以通過以下鏈接來配置了
http://192.168.6.101/integration/ldapcert.jsp
訪問后,我們再LDAP IP輸入環(huán)境的AD DC服務器地址,系統(tǒng)會默認填寫LDAP端口636,及證書路勁,這些信息系統(tǒng)會自動補全;我們需要手動設(shè)置證書密碼,一般我們都會設(shè)置成changeit,設(shè)置好這些信息后,我們導入證書,會提示下面的導入信息;
導入完成
然后我們需要在證書路勁下載證書到本地的JRE環(huán)境進行測試了
接著我們看看第二種方式的證書申請;
我們需要從DC上導入域的根證書
mmc---增加---證書---計算機---個人---選擇根證書----導出
不需要導出私鑰
使用默認的DRE編碼
保存
我們按照同樣的方式,將另外一張也導出來
然后我們需要在本地的JDK環(huán)境中導入該根證書到JDK環(huán)境中的證書中;
我本地的JDK環(huán)境路勁D:\Development_Environment\java\jdk\jre\lib\security
然后運行命令將剛才導出的根證書導入到該路勁的cacert證書文件中;
我們首先要cd到j(luò)dk路勁
| 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環(huán)境了
換進準備好,我們就可以上代碼了;
我們設(shè)置好證書路勁,及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;???//密碼已經(jīng)過期 ??? ????????//?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中有報錯,請根據(jù)錯誤提示,右擊導入ldap相關(guān)的包即可,
本文轉(zhuǎn)自 高文龍 51CTO博客,原文鏈接:http://blog.51cto.com/gaowenlong/1969585,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的JAVA通过SSL证书创建MS AD账户及设置密码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。