python-ldap连接Active Directory遇ldap.STRONG_AUTH_REQUIRED错误:更强认证实现方案问询
嘿,我之前也踩过AD这个认证的坑!这个错误的核心是你的公司AD不允许明文绑定,必须启用加密(SSL/TLS)或者开启连接完整性校验。下面给你两种最常用的解决方法,附完整代码示例:
方法1:直接使用LDAPS加密连接(端口636)
这是最直接的方式,AD默认会开启636端口用于LDAPS加密连接。代码里需要先设置TLS相关选项,然后用ldaps://开头的URL连接:
import ldap # 配置LDAP服务器地址和端口 AD_SERVER = "ldaps://your-ad-domain.com:636" LDAP_LOGIN = "your-domain\\ldap-login" LDAP_PASSWORD = "your-ldap-password" # 设置TLS选项(如果公司AD用的是自签名证书,暂时关闭证书验证,生产环境建议开启) ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) # 生产环境建议指定CA证书路径,比如: # ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, "/path/to/company-ca.crt") try: # 初始化连接 conn = ldap.initialize(AD_SERVER) # 绑定认证 conn.simple_bind_s(LDAP_LOGIN, LDAP_PASSWORD) print("绑定成功!") # 这里可以执行你的搜索操作,比如: # base_dn = "OU=Users,DC=your-domain,DC=com" # search_filter = "(sAMAccountName=username)" # attrs = ["cn", "mail"] # result = conn.search_s(base_dn, ldap.SCOPE_SUBTREE, search_filter, attrs) # 关闭连接 conn.unbind_s() except ldap.LDAPError as e: print(f"绑定失败: {e}")
方法2:使用StartTLS升级加密连接(端口389)
如果你的AD服务器允许389端口的StartTLS升级,这种方式会先建立明文连接,再通过StartTLS命令升级为加密连接,适合不想改端口的场景:
import ldap AD_SERVER = "ldap://your-ad-domain.com:389" LDAP_LOGIN = "your-domain\\ldap-login" LDAP_PASSWORD = "your-ldap-password" # 同样配置TLS选项 ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) # 生产环境指定CA证书 # ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, "/path/to/company-ca.crt") try: conn = ldap.initialize(AD_SERVER) # 启用StartTLS升级连接 conn.start_tls_s() # 现在绑定认证 conn.simple_bind_s(LDAP_LOGIN, LDAP_PASSWORD) print("绑定成功!") # 执行搜索操作... conn.unbind_s() except ldap.LDAPError as e: print(f"绑定失败: {e}")
额外说明
- 关于证书验证:生产环境一定要关闭
OPT_X_TLS_NEVER,换成指定公司的CA证书路径,避免中间人攻击。 - 如果你的环境需要用Kerberos/SASL认证(比如域内机器的单点登录),也可以用
conn.sasl_bind_s('', ldap.sasl.gssapi()),不过这种方式需要提前配置Kerberos环境,适合域内服务使用。
内容的提问来源于stack exchange,提问作者chrisaramar
相关产品推荐
相关产品推荐

