使用 PHP 5.6 和 openldap 2.4.40 在 EL7 系统上工作。
我可以使用 ldapsearch 查询远程 ldaps 服务器:
ldapsearch -H ldaps://ldap.example.com -D "CN=serviceaccount,OU=Services,DC=example,DC=com" -x -w "sapass" -LLL -b "DC=example,DC=com " cn="编码器"
这将返回用户 acoder 的预期数据。
转向 PHP,我尝试使用相同的凭据绑定到同一台服务器并在上面传递(sapass)。
// server settings
$srvc_id = 'serviceaccount';
$srvc_pass = "somepass";
$ldap_host = "ldaps://ldap.example.com";
$srvc_dn = "CN=$srvc_id,OU=Services,DC=example,DC=com";
$user_filter = "(uid=$form_user)";
$ldap_conn = ldap_connect($ldap_host);
if ($ldap_conn)
{
echo "<p>Connected to \$ldap_host $ldap_host at line ";
$r = ldap_bind($ldap_conn, $srvc_dn, $srvc_pass);
if (!$r)
{
echo "<p>failed to bind with service account credentials.";
} else {
echo "<p>binded OK.";
}
}
如果我暂时将其添加到/etc/openldap/ldap.conf
,则脚本有效:
TLS_REQCERT never
一旦我将其注释掉,脚本就会失败并显示“无法联系 LDAP 服务器”。
如果我添加TLS_CACERTDIR /etc/openldap/certs
到ldap.conf
,则从命令行调用脚本时可以正常工作。
TLS_CACERTDIR /etc/openldap/certs
# TLS_REQCERT never ### only use for testing ###
似乎 httpd 没有读取必要的证书,因此无法与远程 LDAP 服务器通信。
我看过的 PHP/LDAP 设置教程使用 EL6,我正在运行 EL7。