我正在尝试使用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? 代码片段?
非常感谢
再见
答案 0 :(得分:2)
我很确定你的问题是我遇到的问题。在ldaptor / protocols / pureldap.py中,第1144行声明LDAPExtendedRequest requestValue必须是字符串。但根据RFC 2251,该值是可选的,特别是不应出现在startTLS请求中。
所以你的方法是正确的;这只是ldaptor中的一个主要错误。据我所知,作者只测试了使用简单绑定而没有TLS。您需要在pureldap.py中注释掉该行。如果您正在部署此用户期望用户下载或轻松安装ldaptor,那么您需要在自己的代码中创建LDAPExtendedRequest类的固定副本,并在运行时将其转发。
我必须使用ldaptor维护一个项目好几年,我强烈建议你尽可能切换到python-ldap。由于它包含了OpenLDAP库,因此构建起来要困难得多,尤其是在完全支持SSL / SASL的情况下。但这非常值得,因为ldaptor比你遇到的问题还要多得多。
答案 1 :(得分:2)
使用https://github.com/twisted/ldaptor中的ldaptor 0.0.54,使用StartTLS时没有问题。
以下是代码:
#! /usr/bin/env python
from twisted.internet import reactor, defer
from ldaptor.protocols.ldap import ldapclient, ldapsyntax, ldapconnector
@defer.inlineCallbacks
def example():
serverip = 'your.server.name.or.ip'
basedn = 'o=Organization'
binddn = 'cn=admin,o=Organization'
bindpw = 'Sekret'
query = '(uid=jetsong)'
c = ldapconnector.LDAPClientCreator(reactor, ldapclient.LDAPClient)
overrides = {basedn: (serverip, 389)}
client = yield c.connect(basedn, overrides=overrides)
client = yield client.startTLS()
yield client.bind(binddn, bindpw)
o = ldapsyntax.LDAPEntry(client, basedn)
results = yield o.search(filterText=query)
for entry in results:
print entry
if __name__ == '__main__':
df = example()
df.addErrback(lambda err: err.printTraceback())
df.addCallback(lambda _: reactor.stop())
reactor.run()