標籤:java通過ssl認證建立ms ad賬戶及設定密碼
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
650) this.width=650;" title="image" style="background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M01/07/A9/wKiom1nNB96B1WqcAABNCDOO2ng479.png" height="48" />
確認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,設定好這些資訊後,我們匯入認證,會提示下面的匯入資訊;
650) this.width=650;" title="image" style="background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M00/07/A9/wKiom1nNB96j6lj5AADrdAHlCT0347.png" height="355" />
匯入完成
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M01/A6/5A/wKioL1nNB6Czt3AdAAEjq-sWAtc175.png" height="382" />
然後我們需要在認證路勁下載認證到本地的JRE環境進行測試了
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M01/07/A9/wKiom1nNB-GDeWv4AABNCDOO2ng590.png" height="48" />
接著我們看看第二種方式的認證申請;
我們需要從DC上匯入域的根憑證
mmc---增加---認證---電腦---個人---選擇根憑證----匯出
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M00/A6/5A/wKioL1nNB6KDks8vAAFIOiGj-JQ257.png" height="283" />
不需要匯出私密金鑰
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M01/A6/5A/wKioL1nNB6PBvWiYAAEfVVDpSoA196.png" height="417" />
使用預設的DRE編碼
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M00/07/A9/wKiom1nNB-TTOy2gAAFVXRiAWQk879.png" height="415" />
儲存
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M00/A6/5A/wKioL1nNB6WhTzheAAIesQ4od_g157.png" height="298" />
我們按照同樣的方式,將另外一張也匯出來
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M00/A6/5A/wKioL1nNB6ewBI_5AAEopJf5lz0154.png" height="248" />
然後我們需要在本地的JDK環境中匯入該根憑證到JDK環境中的認證中;
我本地的JDK環境路勁D:\Development_Environment\java\jdk\jre\lib\security
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M01/07/A9/wKiom1nNB-mgmQaPAAE2CXxWn5s711.png" height="315" />
然後運行命令將剛才匯出的根憑證匯入到該路勁的cacert認證檔案中;
我們首先要cd到jdk路勁
cd D:\Development_Environment\java\jdk\jre\bin
然後將剛才匯出的根憑證儲存到D盤下,通過以下命令匯入
keytool keytool -import -keystore D:\Development_Environment\java\jdk\jre\lib\security\cacerts -storepass changeit -keypass changeit -alias CA -file d:\ADroot.cer
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M01/A6/5A/wKioL1nNB6iRDbafAAA4pmqNybE681.png" height="28" />
輸入Y受信任
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M02/A6/5A/wKioL1nNB6qD06yjAADfTXmiAfo642.png" height="251" />
然後我們就可以通過
接著就是看看ADDS環境了
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M00/07/A9/wKiom1nNB-vS5rPiAADJ6upPvC0643.png" height="339" />
換進準備好,我們就可以上代碼了;
我們設定好認證路勁,及LDAP驗證資訊,及需要註冊的使用者名稱
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M00/A6/5A/wKioL1nNB6vhjb9sAAHcZUZWhj8601.png" height="337" />
賬戶註冊成功
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M01/07/A9/wKiom1nNB_Czo0waAALzfIWWeQg975.png" height="484" />
上代碼:
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", "[email protected]"); attrs.put("mail", "[email protected]"); 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); } }
我們查看
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M00/07/A9/wKiom1nNB_DxXuTOAAEWZTcDld8373.png" height="346" />
查看賬戶屬性
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M01/A6/5B/wKioL1nNB7CAsUqWAAG1sh4jTeE169.png" height="484" />
然後查看屬性
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M01/07/A9/wKiom1nNB_Lz74csAAHwlp4kf2Y877.png" height="484" />
650) this.width=650;" title="image" style="margin:0px;background-image:none;" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M00/07/A9/wKiom1nNB_WSXs5_AAHfi_yZQrY828.png" height="484" />
我們將java檔案上傳到附件中,如果加在eclipse中有報錯,請根據錯誤提示,右擊匯入ldap相關的包即可,
本文出自 “高文龍” 部落格,謝絕轉載!
JAVA通過SSL認證建立MS AD賬戶及設定密碼