我正在尝试使用 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/