java代码通过ldaps连接AD域,实现写数据到AD域

  1. 业务系统与AD域集成

在测试业务系统与AD域集成时,测试发现使用389端口连接AD域,可以连接上,但是无法创建账号到域。使用389端口创建账号的具体报错如下:

javax.naming.OperationNotSupportedException: [LDAP: error code 53 – 0000001F: SvcErr: DSID-031A124C, problem 5003 (WILL_NOT_PERFORM), data 0

网上查了些资料,说是使用ssl加密方式才能实现写数据到域。以下是使用ldaps连接AD域的java实现方法

  1. 使用ldaps同步AD域的java方法

public static InitialLdapContext sslInit() throws NamingException{
		String userName = "CN=系统同步账号,OU=service account,OU=101,OU=test,DC=test,DC=com,DC=cn"; //SSL 连接的GUID
		String password = "**********";
		String Url = "ldaps://testad01.test.com.cn:636";
		String user = userName;
		Properties env = new Properties();
		env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
		env.put(Context.SECURITY_AUTHENTICATION, "simple");
		env.put(Context.SECURITY_PRINCIPAL, user);
		env.put(Context.SECURITY_CREDENTIALS, password);
		env.put(Context.PROVIDER_URL,Url);
		env.put(Context.AUTHORITATIVE, "true");
		String keystore ="/usr/lib/jvm/java-8-openjdk-arm64/jre/lib/security/cacerts"; //证书的安装目录,两个证书都安装了,可以使用不同别名
		System.setProperty("javax.net.ssl.trustStore",keystore);
		env.put(Context.SECURITY_PROTOCOL, "ssl");
		return new InitialLdapContext(env,null);
	}
  1. ldaps连接与ldap连接的区别

在测试AD域中,创建的系统同步账号的登录名是adsys。

配置ldap的方式,使用adsys账号就可以实现连接:java.naming.security.principal=adsys@test.com.cn,

ldaps的方式,只能用”CN=系统同步账号,OU=service account,OU=101,OU=test,DC=test,DC=com,DC=cn”; 而不能直接使用adsys登录账号,这点与389端口方式不同。