我可以使用ldap端口和SASL(使用gssapi做kerberos)连接到活动目录服务器,如下所示。
import ldap, ldap.sasl, sys
server = 'ldap://server.domain.tld'
sasl_auth = ldap.sasl.sasl({} ,'GSSAPI')
conn = ldap.initialize(server, trace_level=0)
conn.set_option(ldap.OPT_REFERRALS,0) # for AD servers, don't chase referrals via anonymous bind
conn.protocol_version = ldap.VERSION3 # Set protocol version to LDAPv3 to enable SASL bind!
conn.sasl_interactive_bind_s("", sasl_auth)
所有这些都能正常工作 (为了简洁起见,没有进行错误检查。)但是如果我想通过将服务器字符串改为SSL端口来连接。
server = 'ldaps://server.domain.tld'
绑定成功了,但我的连接被报告为关闭,当我试图做下一步的时候,比如:
print('Result of Who Am I? ext. op:',repr(conn.whoami_s()))
我得到的结果是:
ldap.SERVER_DOWN: {'desc': "Can't contact LDAP server", 'errno': 5, 'info': 'Input/output error'}
即使绑定没有引发任何异常。 "ldap:/"工作。 "ldaps:/"不工作。
这是否只能通过常规端口+TLS工作,还是我在做kerberos时漏掉了ldaps端口所需的某些部分的咒语?
谢谢。
我想我找到了自己问题的答案。
如果你检查一下这个链接。https:/docs.microsoft.comen-usopenspecswindows_protocolsms-adts989e0748-0953-455d-9d37-d08dfbf3998b。
你发现以下文字。
虽然活动目录允许在SSLTLS保护的连接上执行SASL绑定,但它不允许在这样的连接上使用SASL层加密完整性验证机制。
所以我想我的问题的答案是,因为python-ldap模块做的是加密完整性验证,而不是单纯的验证,所以你不能同时做SASL和SSLTLS。 所以你不能在 "ldap "端口上同时做start-tls,也不能连接到 "ldaps"(SSL)端口并使用SASL。