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行目は、LDAPExtendedRequestrequestValueは文字列でなければならないと主張しています。ただし、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のldaptor0.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 に答える