使用ldap3连接LDAP服务器遇SSL握手失败及地址无效问题排查
问题解答
1. 你的代码没有真正关闭证书名称校验
你创建了SSL上下文但未传递给Server对象,且仅关闭check_hostname不足以完全关闭证书校验,必须同时设置verify_mode为ssl.CERT_NONE。正确代码如下:
import ssl from ldap3 import Server context = ssl.create_default_context() context.check_hostname = False context.verify_mode = ssl.CERT_NONE # 必须添加该行以关闭证书校验 ldap_server = Server( host=LDAP_server_IP, port=636, use_ssl=True, get_info=ALL, ssl_context=context ) # 需将ssl_context传入Server对象
2. 错误的其他可能原因
- SSL/TLS版本不兼容:Python默认SSL上下文会禁用SSLv3、TLS 1.0等旧协议,若负载均衡或后端LDAP服务器仅支持这些弱版本,会触发握手失败。可尝试指定允许的协议版本:
# 根据实际情况调整,比如允许TLS 1.0/1.1 context.options |= ssl.OP_NO_TLSv1_3 | ssl.OP_NO_TLSv1_2 - 负载均衡配置异常:负载均衡可能未正确配置LDAPS端口转发,或后端LDAP服务器健康检查失败导致无可用节点,触发"invalid server address"错误。需检查负载均衡的后端状态与流量转发规则。
- 证书信任问题:若服务器使用自签证书,即使关闭名称校验,证书不在Python默认CA信任列表中仍会握手失败。可将证书导入信任池,或在上下文中加载证书:
context.load_verify_locations('/path/to/server_cert.pem') - 网络/防火墙限制:端口636可能被本地防火墙、网关或云安全组拦截,导致无法建立连接。可通过
telnet LDAP_server_IP 636测试端口是否可达。 - LDAP库参数问题:
get_info=ALL会尝试获取服务器全部信息,部分LDAP服务器不支持该操作,可能导致连接失败。可尝试改为get_info=NONE简化连接流程。
内容的提问来源于stack exchange,提问作者E. Jaep
相关产品推荐
相关产品推荐

