【问题标题】:python and ldap via SSL通过 SSL 的 python 和 ldap
【发布时间】:2015-03-27 08:31:50
【问题描述】:

我尝试使用运行良好的 python 查询 Active Directory 服务器。但现在我不想通过网络发送未加密的凭据,所以我想使用 LDAP。 是否有捷径可寻?到目前为止,我发现我必须添加这个选项:

l.set_option(ldap.OPT_X_TLS_CACERTFILE,'/path/to/my/Ca.pem')

但我实际上不想获得 CA 证书或正确的证书并验证它。当然,从安全角度来看,我应该验证我的通信伙伴是正确的,但我不在乎我的内部网络,只是希望这更容易处理。 如果我只是将 LDAP URL 从 ldap 更改为 ldaps,我会收到此错误:

Traceback (most recent call last):
  File "./ldap-to-sql.py", line 21, in <module>
    bind = l.simple_bind_s(USERNAME, PASS)
  File "/usr/local/lib/python2.7/site-packages/ldap/ldapobject.py", line 214, in simple_bind_s
    msgid = self.simple_bind(who,cred,serverctrls,clientctrls)
  File "/usr/local/lib/python2.7/site-packages/ldap/ldapobject.py", line 208, in simple_bind
    return self._ldap_call(self._l.simple_bind,who,cred,RequestControlTuples(serverctrls),RequestControlTuples(clientctrls))
  File "/usr/local/lib/python2.7/site-packages/ldap/ldapobject.py", line 106, in _ldap_call
    result = func(*args,**kwargs)
ldap.SERVER_DOWN: {'info': 'SSLHandshake() failed: misc. bad certificate (-9825)', 'desc': "Can't contact LDAP server"}

【问题讨论】:

    标签: python ssl ldap ldap-query ldapconnection


    【解决方案1】:

    我正在使用 Samba4 DC 和 python ldap 模块进行一些测试,并且我已经完成了这个示例:

    #!/usr/bin/env python2
    # -*- coding: utf-8 -*-
    
    import ldap, ldapurl, subprocess, sys, shlex, os
    
    GrupoLDAP = "Domain Users" #Grupo a recuperar
    CACert = '/etc/cert/ca.cert.pem' #Certificado CA
    
    ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, CACert)
    ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_HARD)
    
    proto = 'ldaps' #Protocolo
    server = 'domain.com' #Dirección del servidor (mismo nombre del Certificado)
    port = 636 #Puerto seguro para ldaps
    
    try:
        url = ldapurl.LDAPUrl(urlscheme=proto, hostport="%s:%s" % (server, str(port))).initializeUrl()
        ldap_obj = ldap.initialize(url)
        ldap_obj.simple_bind_s('user@domain.com','PassWord')
    
        base = 'OU=Users,DC=domain,DC=com' #Ruta y UO del grupo
    
        scope = ldap.SCOPE_SUBTREE
    
        query = '(&(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'
    
        res_attrs = ['sAMAccountName', 'cn']
        #res_attrs = ['*']
        res = ldap_obj.search_s(base, scope, query, res_attrs)
    except ldap.LDAPError as Error:
        print "Ha ocurrido un error al conectar o realizar la query al servidor LDAP:\n\n%s" % Error
        sys.exit(1)
    

    证书需要CN中的FQDN并由CA证书签名以避免Certs错误。一直在工作,直到我向同一个 FQDN 添加了第二个 DC,但如果你只有一个 DC,它应该可以工作。 我不知道它在 Windows LDAP 上是如何工作的,但似乎很相似。

    你好!!

    【讨论】:

      【解决方案2】:

      2 年前,嗯....好吧,可能为时已晚。

      但是,请尝试以下代码。适用于 python/ldap/active directory/TLS。

      import ldap
      ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_ALLOW)
      l = ldap.initialize("ldaps://ad.xxx.yyy:636")
      l.set_option(ldap.OPT_REFERRALS, 0)
      l.simple_bind_s("xxx\username", 'pw')
      l.search_s('DC=AD,DC=XXX,DC=YYY', ldap.SCOPE_SUBTREE, '(samaccountname=username)', ['displayname'])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        • 1970-01-01
        • 1970-01-01
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多