python 和 ldap 通过 TLS 的问题
Problems with python and ldap through TLS
首先我为我的英语感到抱歉。
我正在尝试向 LDAPS 服务器查询一些数据,但遇到了一些问题。
我有两个 Samba4 DC 控制器在同一个域中工作。我在不同的子域上有两个 DC,例如:
- dc.domain.com
- dc2.domain.com
并且我有这个 python 脚本来向那个 ldap 服务器查询一些数据:
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import ldap, ldapurl, subprocess, sys, shlex, os
GrupoLDAP = "Domain Users" #Grupo a recuperar
CACert = '/etc/ssl/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','_PassWd_')
base = '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)
print res
在我将两台服务器加入同一个 dns 条目以允许冗余之前,此脚本运行良好。现在两台服务器都在 domain.com.
上工作
问题似乎是 ldaps 的基础 DN,因为如果我将基础更改为:
base = 'OU=Users,DC=domain,DC=com'
或者我使用 ldap 而不是 ldaps,那么它工作得很好。问题是我需要在没有任何 OU 的情况下查询服务器的根目录。
我可以使用标准的 ldap 通道,但我想使用安全通道来获取数据。
我得到的错误是:
{'info': '00002020: Operation unavailable without authentication', 'desc': 'Operations error'}
当然,我正在使用身份验证,并且我已经更新了两台服务器上的证书以将 CN 更改为 "domain.com",并且似乎与 Owncloud 和 Prosody(使用 Saslauth)完美配合,但是python 失败。
有人知道会发生什么吗?
谢谢!!
我终于找到了解决问题的方法。我已将此行添加到 python 脚本中:
ldap.set_option(ldap.OPT_REFERRALS, 0)
现在运行完美。
您好!!
首先我为我的英语感到抱歉。
我正在尝试向 LDAPS 服务器查询一些数据,但遇到了一些问题。
我有两个 Samba4 DC 控制器在同一个域中工作。我在不同的子域上有两个 DC,例如:
- dc.domain.com
- dc2.domain.com
并且我有这个 python 脚本来向那个 ldap 服务器查询一些数据:
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import ldap, ldapurl, subprocess, sys, shlex, os
GrupoLDAP = "Domain Users" #Grupo a recuperar
CACert = '/etc/ssl/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','_PassWd_')
base = '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)
print res
在我将两台服务器加入同一个 dns 条目以允许冗余之前,此脚本运行良好。现在两台服务器都在 domain.com.
上工作问题似乎是 ldaps 的基础 DN,因为如果我将基础更改为:
base = 'OU=Users,DC=domain,DC=com'
或者我使用 ldap 而不是 ldaps,那么它工作得很好。问题是我需要在没有任何 OU 的情况下查询服务器的根目录。
我可以使用标准的 ldap 通道,但我想使用安全通道来获取数据。
我得到的错误是:
{'info': '00002020: Operation unavailable without authentication', 'desc': 'Operations error'}
当然,我正在使用身份验证,并且我已经更新了两台服务器上的证书以将 CN 更改为 "domain.com",并且似乎与 Owncloud 和 Prosody(使用 Saslauth)完美配合,但是python 失败。
有人知道会发生什么吗?
谢谢!!
我终于找到了解决问题的方法。我已将此行添加到 python 脚本中:
ldap.set_option(ldap.OPT_REFERRALS, 0)
现在运行完美。
您好!!