JAVA通過SSL認證建立MS AD賬戶及設定密碼

來源:互聯網
上載者:User

標籤: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賬戶及設定密碼

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.