4

我正在尝试使用 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?代码片段?

非常感谢

再见

4

2 回答 2

2

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

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

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

于 2011-07-20T15:19:23.520 回答
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()
于 2014-07-30T17:32:18.567 回答