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路劲

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

输入Y受信任

然后我们就可以通过

接着就是看看ADDS环境了

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

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

账户注册成功

上代码:

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

我们查看

查看账户属性

然后查看属性

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

时间: 2024-10-13 19:20:10

JAVA通过SSL证书创建MS AD账户及设置密码的相关文章

java将SSL证书导入系统密钥库

之前安装JIRA和Confluence,配置了SSL证书之后遇到应用程序链接的问题: SSL证书不被信任,导致JIRA和Confluence无法关联. 尝试过很多办法无果之后打算放弃. 最终还是放弃了...... 你以为这篇博客已经结束了? 其实它并没有,我只是想凑个字数,让文章看起来饱满一些. 因为解决的办法我已经找到了,而且很简单. ———————————下面开始敲黑板,划重点————————————— 1.登录服务器,将InstallCert.java下载到本地,并通过java进行编译:

Nginx自签ssl证书创建及配置方法

场景: Nginx使用自签ssl证书实现https连接. 方法: 第一步:使用OpenSSL创建证书 #建立服务器私钥(过程需要输入密码,请记住这个密码)生成RSA密钥 >openssl genrsa -des3 -out server.key 1024 #生成一个证书请求     >openssl req -new -key server.key -out server.csr #需要依次输入国家,地区,组织,email.最重要的是有一个common name,可以写你的名字或者域名.如果为

JAVA中SSL证书认证通讯

SSL通讯服务端 /******************************************************************** * 项目名称    :rochoc   <p> * 包名称      :rochoc.net.security <p> * 文件名称    :SSLServer   <p> * 编写者     :luoc    <p> * 编写日期    :2005-6-30    <p> * 程序功能(类

java访问SSL 证书使用https不可访问 报错的情况

错误详情: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.s

JAVA通过SSL修改MS AD账户密码

我们上一篇文章介绍了JAVA通过SSL创建MS AD账户及设置密码,今天我们主要介绍JAVA通过SSL修改MS AD账户密码,关于证书介绍,我们上一篇已经介绍了,所以直接进入重点,上代码 我们准备修改上一篇介绍时创建的gaowenlong这个账户: 我们设置修改密码的账户 上代码 package com.ixmsoft.oa.util; import java.io.IOException; import java.io.UnsupportedEncodingException; import 

Confluence 6 通过 SSL 或 HTTPS 运行 - 创建或请求一个 SSL 证书

在启用 HTTPS 之前,你需要一个有效的证书,如果你已经有了一个有效的证书,你可以直接跳过这个步骤,进入 step 2. 你可以创建一个自签名的证书,或者从信任的 Certificate Authority 中获得一个证书. 如果你的项目小组计划使用 Confluence 服务器移动 app.你需要你的证书是从信任的证书签发机构签发的.你不能使用自签名的证书或者从一个不信任的机构获得的证书,或者自由 CA. 选项 1: 创建一个自签名证书 当你需要进行加密,但是你并不需要对网站的的请求校验的话

配置SSL证书之后,Bitnami Redmine创建问题时保存报错问题解决方案

问题:系统环境在安装了ssl证书之后,页面链接会用于加密HTTP协议,也就是HTTPS.那么在使用Bitnami Redmine创建问题时保存就会报错,当把URL中的"http"改成"https"之后,又能正常访问,但是很麻烦,有没有什么办法可以使得我不要每次都去修改http就能实现自动正常跳转的方法吗? 解决方案:这个问题是因为安装了SSL证书导致的,https请求会跳转成http请求,所以需要配置一下apache的配置文件即可. 步骤: 1.打开Bitnami

创建ssl 证书

openssl req -new -newkey rsa:4096 -nodes -sha256  -keyout myserver.key -out server.csr 创建所需的key 和csr 文件 然后按照提示添加相应的内容 Country Name (2?letter code):HK State or Province Name (eg. City):Hong Kong Locality Name (eg. Company):SMARTBUYGLASSES OPTICAL LIMI

用XCA(X Certificate and key management)可视化程序管理SSL 证书(3)--创建自定义的凭证管理中心(Certificate Authority)

在第"用XCA(X Certificate and key management)可视化程序管理SSL 证书(2)---创建证书请求"章节中,我们介绍了如何用XCA创建SSL证书请求(Certificate Request),在一章节中,同时提到了如何对证书请求,用我们自己的创建的凭证管理中心(Certificate Authority)进行签名:但是在做这一步之前,我们首先需要知道如何创建一个属于咱们自己的凭证管理中心(Certificate Authority). 步骤很简单,具体