python:通过 kerberos 绑定到 ldaps 端口

python: binding via kerberos to the ldaps port

我可以使用 ldap 端口和 SASL(使用 gssapi 执行 kerberos)连接到 Active Directory 服务器,如下所示:

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 端口所需的某些咒语?

谢谢。

我想我找到了自己问题的答案。

如果你查看这个 link: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/989e0748-0953-455d-9d37-d08dfbf3998b

您找到以下文字:

While Active Directory permits SASL binds to be performed on an SSL/TLS-protected connection, it does not permit the use of SASL-layer encryption/integrity verification mechanisms on such a connection.

所以我认为我的问题的答案是因为 python-ldap 模块进行 encryption/integrity 验证,而不仅仅是身份验证,你不能做 SASL 和 SSL/TLS同时。所以你不能在 "ldap" 端口上也做一个 start-tls,你也不能连接到 "ldaps" (SSL) 端口和使用 SASL。