PHP中使用openLDAP连接AD,如何确定TLS/SSL协议版本?
如何在PHP中查询LDAP连接使用的TLS/SSL协议版本?
我来分享几个在PHP + OpenLDAP环境下查询LDAPS连接所用TLS/SSL协议版本的实用方法,亲测有效:
方法一:用PHP的ldap_get_option()直接获取
PHP的LDAP扩展提供了ldap_get_option()函数,可以读取连接的各种参数,其中就包括TLS协议版本。不过要注意,这个功能需要你的OpenLDAP版本在2.4及以上,PHP LDAP扩展编译时也得支持对应的选项。
直接上代码示例:
// 建立LDAPS连接 $ldapConn = ldap_connect("ldaps://server:636"); if (!$ldapConn) { die("LDAP连接失败"); } // 先完成绑定(部分TLS协商会在绑定阶段完成,所以绑定后获取更准确) $bindSuccess = ldap_bind($ldapConn, "你的AD账号@域名", "你的密码"); if (!$bindSuccess) { die("LDAP绑定失败: " . ldap_error($ldapConn)); } // 获取TLS协议版本的数值 $tlsVersionNum = null; if (ldap_get_option($ldapConn, LDAP_OPT_X_TLS_PROTOCOL_VERSION, $tlsVersionNum)) { // 把数值映射成易读的版本名称 $versionMap = [ 0 => "SSLv3", 1 => "TLSv1", 2 => "TLSv1.1", 3 => "TLSv1.2", 4 => "TLSv1.3" ]; echo "当前使用的TLS/SSL协议版本: " . ($versionMap[$tlsVersionNum] ?? "未知版本 ($tlsVersionNum)"); } else { echo "无法获取TLS协议版本: " . ldap_error($ldapConn); } // 记得关闭连接 ldap_unbind($ldapConn);
如果你的PHP环境里没有定义LDAP_OPT_X_TLS_PROTOCOL_VERSION这个常量,可以直接用它的数值(比如3对应TLSv1.2,4对应TLSv1.3)来替代。
方法二:通过OpenLDAP调试日志查看细节
如果第一种方法行不通(比如老版本的OpenLDAP不支持该选项),可以开启OpenLDAP的调试日志,查看连接过程中的TLS协商细节。
只需要在建立连接前设置环境变量开启调试:
// 设置最高级别的调试日志(255),会输出所有TLS相关信息 putenv("LDAPTLS_DEBUG_LEVEL=255"); // 正常建立连接并绑定 $ldapConn = ldap_connect("ldaps://server:636"); ldap_bind($ldapConn, "你的AD账号@域名", "你的密码"); // 关闭连接 ldap_unbind($ldapConn);
运行这段代码后,调试信息会输出到PHP的错误日志或者服务器的标准输出(取决于你的服务器配置)。在日志里你能找到类似这样的关键行:
TLS: using protocol TLSv1.2
TLS: negotiated protocol TLSv1.3
方法三:用openssl s_client命令辅助验证
如果你只是想快速确认服务器支持的TLS版本,或者验证PHP连接的版本,可以在服务器终端执行openssl s_client命令手动测试:
# 测试TLSv1.2 openssl s_client -connect server:636 -tls1_2 # 测试TLSv1.3 openssl s_client -connect server:636 -tls1_3
如果命令能成功建立连接,说明服务器支持该版本;OpenLDAP默认会协商使用双方都支持的最高版本,所以PHP连接大概率会用这个版本。
几个注意点
- LDAPS连接的TLS协商有些是在连接建立时完成的,有些是在绑定阶段,所以绑定后获取版本更可靠。
- 确保你的PHP LDAP扩展是基于OpenLDAP编译的,Windows平台如果用的是ADSI库,这些方法可能不适用。
内容的提问来源于stack exchange,提问作者Dip
相关产品推荐
相关产品推荐

