PHP-LDAP搜索偶尔通过TLS / SSL工作

时间:2018-12-05 14:05:18

标签: php linux apache ldap

下面的代码在我的LDAP服务器中执行所有OrganizationalUnits的查找,但是40%的时间都无法执行LDAP搜索。

我仅有的线索是下面的两个Apache日志条目。我不是PHP向导,但是假设第二条错误消息是由于连接失败而留下一个空的$sr变量引起的。

我在连接过程中已经运行tcpdump,而PHP 正在连接到服务器,但是在失败期间通信很少,只有大约1/2个数据包转移而不是成功连接。

这似乎仅在TLS / SSL上发生(从putenv到最后一次努力)。如果我使用纯文本格式,则每次搜索都可以完美进行。是什么导致它“有时”不起作用?有什么办法找到更多信息吗?

更新:我只是注意到,当不使用LDAPS / TLS时,此代码在100%的时间内有效,因此肯定与SSL / TLS相关。

<?php
   putenv('TLS_REQCERT=never');
   print "<html><head><title>ldap test</title></head><body>";

   $ldapconn = ldap_connect("ldaps://my.ldap.com") or die("Could not connect to LDAP server.");
   ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);

   if ($ldapconn)
   {
      $basedn = "dc=my,dc=ldap,dc=com";
      $attributes = array("ou","cn");
      $sr = ldap_search ($ldapconn, $basedn, "(ObjectClass=OrganizationalUnit)", $attributes);
      $info = ldap_get_entries($ldapconn, $sr);
   }

   if ($info["count"] > 0)
   {
      for ($i=0; $i < $info["count"]; $i++)
      {
         $ou = $info[$i]["ou"][0];
         print "<br><input type='radio' name='ldap_ou' value='$ou'>$ou<br>";
      }
   }

   print "</body></html>";

?>

Apache错误:

PHP Warning:  ldap_search(): Search: Can't contact LDAP server in /var/www/test.php on line 14
PHP Warning:  ldap_get_entries() expects parameter 2 to be resource, boolean given in /var/www/test.php on line 15

更新2 (调试失败信息):

...
ldap_prepare_socket: 18
ldap_connect_to_host: Trying 10.14.13.92:636
ldap_pvt_connect: fd: 18 tm: -1 async: 0
TLS: peer cert untrusted or revoked (0x42)
TLS: can't connect: (unknown error code).
ldap_err2string
....

1 个答案:

答案 0 :(得分:-1)

我遇到了同样的问题。 LDAP服务器需要TLS,因此我们必须使用ldaps连接到服务器。 ldap_connect ldap_bind 每次都有效。但是跟随 ldap_search 偶尔失败,并显示无法联系LDAP服务器(-1)错误。

在LDAP端,我可以在ldap服务器上看到一个有效的绑定请求,但仅此而已-.-

我在php7.2上使用CentOS,有人遇到相同的问题或解决方案吗?


好的,我改用http://php.net/manual/en/function.ldap-start-tls.php,它为我解决了这个问题。