python - 如何将 startTLS 与 ldaptor 一起使用?

标签 python ldap twisted starttls

我正在尝试使用 ldaptor 通过 startTLS 连接到 LDAP 服务器。在互联网上搜索并亲自尝试,我得到了这段代码:

from ldaptor.protocols.ldap import ldapclient, ldapsyntax, ldapconnector, distinguishedname
[...]
def main(base, serviceLocationOverrides):
    c=ldapconnector.LDAPClientCreator(reactor, ldapclient.LDAPClient)
    d = c.connect(base, serviceLocationOverrides)
    d.addCallbacks(lambda proto: proto.startTLS(), error)
    [...]
    d.addErrback(error)
    d.addBoth(lambda dummy: reactor.stop())
    reactor.run()

但代码退出时出现 AssertionError:

[Failure instance: Traceback: <type 'exceptions.AssertionError'>: 
/usr/lib/python2.7/dist-packages/twisted/internet/base.py:1167:mainLoop
/usr/lib/python2.7/dist-packages/twisted/internet/base.py:789:runUntilCurrent
/usr/lib/python2.7/dist-packages/twisted/internet/defer.py:361:callback
/usr/lib/python2.7/dist-packages/twisted/internet/defer.py:455:_startRunCallbacks
--- <exception caught here> ---
/usr/lib/python2.7/dist-packages/twisted/internet/defer.py:542:_runCallbacks
/usr/lib/pymodules/python2.7/ldaptor/protocols/ldap/ldapclient.py:239:_startTLS
/usr/lib/pymodules/python2.7/ldaptor/protocols/pureldap.py:1278:__init__
/usr/lib/pymodules/python2.7/ldaptor/protocols/pureldap.py:1144:__init__
]

我已尝试在 ldaptor 代码中查找有罪的断言,但似乎一切正常。 有没有人用ldaptorClient startTLS成功了? 代码片段?

非常感谢

再见

最佳答案

我很确定您的问题是我不久前遇到的问题。在 ldaptor/protocols/pureldap.py 中,第 1144 行断言 LDAPExtendedRequest 请求值必须是一个字符串。但根据 RFC 2251,该值是可选的,特别是不应出现在 startTLS 请求中。

所以你的做法是正确的;这只是 ldaptor 中的一个主要错误。据我所知,作者只使用没有 TLS 的简单绑定(bind)进行了测试。您需要在 pureldap.py 中注释掉该行。如果您部署它时期望用户下载或轻松安装 ldaptor,那么您需要在您自己的代码中创建 LDAPExtendedRequest 类的固定副本,并在运行时将其子化。

多年来我不得不使用 ldaptor 维护一个项目,我强烈建议您尽可能切换到 python-ldap。由于它包装了 OpenLDAP 库,因此构建起来要困难得多,尤其是在完全支持 SSL/SASL 的情况下。但这是非常值得的,因为 ldaptor 的问题比您遇到的问题多得多。

关于python - 如何将 startTLS 与 ldaptor 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6634206/

相关文章:

Python Scapy 递归 DNS 查询

python - 模板中的django url添加参数的正确方法

java - 如何从 LDAP 查询多个用户

python - Twisted:为什么将延迟回调传递给延迟线程会使线程突然阻塞?

python - Pandas - 在 applymap 期间获取每个元素的行和列名称

python - 使用 solr 和 haystack 进行高级搜索?

空白(空)属性的 LDAP 过滤器

PHP_LDAP : Test that Organizational Unit exist?

python - twisted的twistd工具解析命令行参数

python - Twisted 简单 HTTP 代理(续)