ldap_bind()挂起/冻结

时间:2015-01-06 02:05:23

标签: php openldap

所以我把问题简化为一个简单的PHP脚本

test.php

<?php 
  ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7); //for logging
  if($con = ldap_connect( 'ldaps:domain.com', 636 )){
    $bind_return = ldap_bind($con, 'username', 'super_secret_password');
  }
?>

当我转到localhost\test.php时,浏览器会指示它正在等待响应,并且会挂在那里......永远(更确切地说,直到我停止它,有时一小时后,但你得到了理念)。使用xdebug,我能够精确定位ldap_bind()电话的挂起。当我尝试跳过或进入ldap_bind()代码行时,我的xdebug会挂起并变得无法响应。

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);的记录输出为:

ldap_create
ldap_url_parse_ext(domain.com)
ldap_bind_s
ldap_simple_bind_s
ldap_sasl_bind_s
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP domain.com:636
ldap_new_socket: 15
ldap_prepare_socket: 15
ldap_connect_to_host: Trying domain.com:636
ldap_pvt_connect: fd: 15 tm: -1 async: 0

之后什么都没有。我不知道该怎么做,谷歌也不善良。

ldap_connect()成功,返回类似于(resource) resource id='2' type='ldap link'max_execution_time不会中断脚本的执行。如果我在有问题的代码行之前添加while(true){}之类的内容,那么max_execution_time将会触发,我会看到错误。所以ldap_bind()甚至会以某种方式阻止php环境超时。将代码包装在try / catch块中无助于缓解挂起。

我试过了:

1)多次重启服务器

2)重新安装php5,php-ldap,libapache2-mod-php5和apache2

3)搜索互联网

有趣的是ldap_bind()几周前工作得很好,它在我的制作网站上仍能很好地运作,但我现在已经试图解决这个问题很长一段时间了。点燃我的电脑。任何帮助表示赞赏。

更新:

所以我安装了ldap-utils并运行了ldapsearch -H ldaps://domain.com,它就挂了。我使用调试选项ldapsearch -d 1 -H ldaps://domain.com运行它,输出为:

ldap_url_parse_ext(ldaps://domain.com/)
ldap_create
ldap_url_parse_ext(ldaps://domain.com:636/??base)
ldap_pvt_sasl_getmech
ldap_search
put_filter: "(objectclass=*)"
put_filter: simple
put_simple_filter: "objectclass=*"
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP domain.com:636
ldap_new_socket: 3
ldap_prepare_socket: 3
ldap_connect_to_host: Trying domain.com:636
ldap_pvt_connect: fd: 3 tm: -1 async: 0
^^^^It hangs right here^^^^

似乎很熟悉,不是吗?在整个命令上运行一个strace会产生一个很长的跟踪,但此时会挂起

write(3, "\26\3\0\0p\1\0\0l\3\3T\254/\31\24\200\25 \247\221\7\251\240\271\35\"\272\203V \305"..., 117) = 117
read(3,  

同样,它在这里挂起,光标在&#34; read(3,&#34;

之后闪烁

我遇到this bug report的openldap与我自己的问题完全相同,直到读取命令的悬挂。然而,似乎没有关于解决方案的讨论,因为openldap指向了gnuTLS。

2 个答案:

答案 0 :(得分:1)

这听起来像是环保的东西。这可能是防火墙更改,网络路由更改,SSL证书过期,LDAP服务器中的更改等。

我会执行一系列处理ISO堆栈的诊断协议。

从telnet到远程服务器上的端口636开始。如果可行,请下载openldap然后尝试一下。看看你是否可以手动连接。如果可行,则在生产中运行调试版本(从命令行),并查看ldap_pvt_connect之后的下一步。另外,尝试使用命令行版本,您可以对事物进行更有限的控制,并且您没有混合使用的Web服务器。

答案 1 :(得分:0)

我在这里遇到了同样的问题,这个问题归结为防火墙。 slapd守护程序在与Web服务器相同的服务器上运行,因此我需要在调用ldap_connect()时指定“localhost”而不是“domain.com”,或者在内核过滤器表中添加适当的规则以专门允许连接从自己的IP地址到服务器。