我目前正在尝试为用Golang编写的OpenLDAP客户端实现SASL/EXTERNAL auth。

换句话说,我要加载以下数据:

ldapsearch -Y EXTERNAL -H ldapi:// -s base -b 'olcDatabase={1}mdb,cn=config' olcSyncRepl

我正在使用https://github.com/go-ldap/ldap库。不幸的是,该库仅支持简单例份验证。我很高兴实现SASL/EXTERNAL,但无法识别协议(protocol)的工作原理?例如,存在https://ldap.com/ldapv3-wire-protocol-reference-bind/ CRAM-MD5身份验证过程。

我想得到SASL/EXTERNAL的相同解释。

我已成功连接到unix套接字(ldapi://)。但是我不明白需要哪种程序以编程方式发送以完成身份验证。

最佳答案

我找到了解决方案。

首先,您需要连接到unix套接字。通常,套接字位于/var/run/slapd/ldapi路径上。

然后,您需要进行两个更改的简单绑定(bind):

  • 用户名应为空
  • 需要指定您要使用sasl身份验证的

  • pkt := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationBindRequest, nil, "Bind Request")
    pkt.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, 3, "Version"))
    pkt.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, "", "User Name"))
    
    saslAuth := ber.Encode(ber.ClassContext, ber.TypeConstructed, 3, "", "authentication")
    saslAuth.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, "EXTERNAL", "SASL Mech"))
    saslAuth.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, "", "SASL Cred"))
    
    pkt.AppendChild(saslAuth)
    
    

    这是PR https://github.com/go-ldap/ldap/pull/232

    关于go - 如何在Golang上通过IPC为OpenLDAP客户端实现SASL/EXTERNAL?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58272670/

    10-11 18:17