LDAP学习总结

2 篇文章 0 订阅
1 篇文章 0 订阅

由于公司需要做一个基于Ldap的用户认证中心服务,需要将mysql中的用户数据导入到LDAP中,然后基于Ldap做用户的认证。之前完全没有接触过LDAP,所以本文记录学习中碰到的问题。

1.LDAP入门

参考资料:

2.windows server2012 搭建Active Directory

参考资料:

2.1 为什么要搭建AD CA?

因为Ldap是区分两种方式ldap:192.168.1.167:389ldaps:192.168.1.167:636
389端口新建用户是无密码禁用的,636端口能在创建有密码启用的用户
当需要对用户进行修改密码,启用禁用都需要使用636端口,这就需要搭建AD CA并且将证书导入到本地JDK中。

2.2 搭建CA证书注意

要确定勾选企业,选择个人可能导致636端口不能使用,使用telnet测试端口是否通

3.SpringBoot集成ldap

参考资料:

4.遇到的问题汇总

4.1

从window server上下载了证书,然后将证书导入到jdk中,还是报下面的错误。这是由于jdk版本问题导致的,我使用jdk1.8.191导致这个问题,最后换成jdk1.8.161(这个问题搞了好久,没想到jdk版本会有问题)
参考链接:https://stackoverflow.com/questions/51449801/how-to-disable-endpoint-identification-for-java-1-8-181-version

javax.naming.CommunicationException: simple bind failed: 192.168.1.167:636 [Root exception is javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names matching IP address 192.168.1.167 found]
	at com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:219)
	at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2791)
	at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:319)
	at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:192)
	at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:210)
	at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:153)
	at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:83)
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
	at javax.naming.InitialContext.init(InitialContext.java:244)
	at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:154)
	at com.yungu.ldap.SSLTest.ldapConnect(SSLTest.java:31)
	at com.yungu.ldap.SSLTest.main(SSLTest.java:41)

4.2

修改密码

javax.naming.directory.AttributeInUseException: [LDAP: error code 20 - mail attribute has duplicate value.];

修改用户密码应该使用这种方法修改

    /**
     * 修改密码
     *
     * @param dn
     * @param newPassword
     */
    public void updatePassword(Name dn, String newPassword) {
        ModificationItem[] modificationItems = new ModificationItem[1];
        Attribute attr = new BasicAttribute("unicodePwd", buildEncodePwd(newPassword));
        modificationItems[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attr);
        ldapTemplate.modifyAttributes(dn, modificationItems);
    }

4.3

用户密码是unicodePwd属性,且密码必须满足以下三点

    /**
     * 将密码进行UTF-16LE编码
     */
    private byte[] buildEncodePwd(String pwd) {
        //LDAP用户密码必须要用""给括起来,必须使用UTF-16LE编码,必须使用LDAPS:636
        String userPassword = Constants.SPE1 + pwd + Constants.SPE1;
        byte[] encodePwd = null;
        encodePwd = userPassword.getBytes(StandardCharsets.UTF_16LE);
        return encodePwd;
    }

4.4

javax.naming.OperationNotSupportedException: [LDAP: error code 53 - 0000052D: 

这是由于“密码不能满足密码策略的要求”导致,解决方案:

  1. 打开域安全策略-安全设置-账户策略-密码策略-密码必须符合复杂性要求。定义这个策略设置为:已禁用。/ 密码长度最小值:定义这个策略设置为0。
  2. 打开域控制器安全策略-安全设置-账户策略-密码策略-密码必须符合复杂性要求。定义这个策略设置为:已禁用。/ 密码长度最小值:定义这个策略设置为0。
  3. 最后运行刷新组策略命令为:gpupdate /force
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值