【问题标题】:not able to access organisation's LDAP server through python-ldap无法通过 python-ldap 访问组织的 LDAP 服务器
【发布时间】:2020-12-01 19:32:43
【问题描述】:

实际的要求是我必须为我的组织的内部 Web 应用程序实现 LDAP 身份验证,该应用程序是在 Django 上构建的,但目前还不能这样做。

因此,我决定检查是否能够使用 python-ldap 模块建立连接。

我拥有的 ldap 服务器的详细信息:

server1 = dc3.something-software.com

server2 = dc5.something-software.com

还有python 代码:

def main(server="ldap://dc5.something-software.com", who='', cred=""):
    try:
        l = ldap.initialize(server)
        l.simple_bind_s(who, cred)
        if l:
            print("Successfully connected")
            l.search_s("cn=someone@something-software.com,dc=something-software,dc=com",
                       ldap.SCOPE_SUBTREE)
    except Exception as e:
        print(e)
    return True

这给了我以下输出

Successfully connected
{'msgtype': 101, 'msgid': 2, 'result': 1, 'desc': 'Operations error', 'ctrls': [], 'info': '000004DC: LdapErr: DSID-0C0907C2, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v2580'}

暗示我实际上能够连接到我的 ldap 但不能做任何其他事情?

我正在使用 Windows 操作系统,我已经尝试了其他类似问题的建议答案,尽管它们主要针对 *NIX 操作系统解决。

谢谢。

【问题讨论】:

  • 您是否验证了连接性? LDAP 明文通常是 TCP 端口 389,SSL 通常是 TCP 端口 636。有一个 win32 构建的 nmap(例如 nmap -P0 -p389 something.dc5.example.com),或使用 telnet(例如 telnet something.dc5.example. com 389) 以验证您实际上能够到达那里。
  • 它说既不是telnet 也不是nmap 被识别/未安装
  • 那么你需要安装其中一个。或者,如果您想走 python 路线,请使用 telnetlib 之类的东西。如果您无法在网络级别连接到主机,则从开发人员的角度来看,没有太多需要解决的问题。如果端口是开放的,那么深入了解应用程序为什么说它无法连接是一条可行的路径。
  • socket.gaierror: [Errno 11001] getaddrinfo failed 是我收到的错误
  • 主机名查找失败——您可以在 Windows (nslookup something.dc5.something-software.com) 上使用 nslookup 来验证该失败。如果您知道,可以尝试直接使用 IP。

标签: python-3.x ldap starttls python-ldap


【解决方案1】:

根据您上面最新评论中的证书错误,目录服务器的 SSL 证书不受信任。两种解决方案——一是忽略证书问题,二是建立信任。忽略证书错误很容易,但安全性较低(即我可以让自己成为一个证明我是 yourhost.example.com 的证书……如果你不检查证书的有效性,你会很乐意与我的假 yourhost.example 通信。 com)。建立信任需要更多的努力,并且可能会产生持续的维护。检查签名服务器上的到期日期......您可能需要偶尔更新 CA 公钥(一些组织只需制作 100 年到期的 CA 证书以避免这种情况,但有些组织会每年或每五年更新他们的 CA 密钥)。无论哪种方式,您都希望在开始 tls 协商之前添加一行 (con.start_tls_s)。

要忽略证书错误,请添加:

con.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_ALLOW)

要与用于签署目录服务器密钥的 CA 建立信任,您需要获取用于签署证书的公钥。有时您可以直接询问维护目录服务器的人员——我在发送给人们的 URL 上有我的压缩副本。但是,如果他们没有,还有其他方法可以获取证书。 OpenSSL client 是一个不错的选择。获得用于签署目录服务器证书的公钥后,使用

con.set_option(ldap.OPT_X_TLS_CACERTFILE, '/path/to/CAFile.pem')

一旦你做了这两件事之一,你应该能够成功启动 TLS 会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多