PHP无法连接到LDAP Oracle Directory Server企业版

问题描述:

一直在玩这个好几天,无法让PHP绑定到Oracle的DSEE上的ldap。PHP无法连接到LDAP Oracle Directory Server企业版

function test(){ 


    // LDAP variables 
    $ldaphost = "xxx.xxxxx.com";   
    $ldapport = 636; 
    $ldaprdn = 'cn=xyxyxyxy,ou=Accounts,dc=xxx,dc=xxxxx,dc=com'; 
    $ldappass = 'vcvcvcvcvc'; 

    ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7); // isn't helping 

    // Connecting to LDAP 
    $ldapconn = ldap_connect($ldaphost, $ldapport) 
       or die("Could not connect to $ldaphost"); 

    if ($ldapconn) { 

     // binding to ldap server 
     $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass); 

     // verify binding 
     if ($ldapbind) { 
      echo "LDAP bind successful..."; 
     } else { 
      echo "LDAP bind failed..."; 
     } 

    } 
} 

我得到的错误:

消息:的ldap_bind()[function.ldap绑定]:无法绑定到服务器:无法联系LDAP服务器

撕裂我的头发在这一个。我只是不能把事情绑定。

已经尝试了直接telnet到端口636上的主机,并没有被任何防火墙阻止。特别是我没有从屏幕上或日志中的'LDAP_OPT_DEBUG_LEVEL'获得任何额外的调试信息。

+0

我想象的问题是与dn,确保它是正确的(它可能会尝试联系不同的服务比你的期望)。 – Resorath 2011-05-04 19:54:52

+0

嗯。这就是服务器管理员给我使用的dn。 – phirschybar 2011-05-05 01:14:55

+0

通过telnet连接时,它与php脚本运行在同一台服务器上吗?另外,使用'$ ldaphost ='ldaps://xxx.xxx.com'; $ ldapconn = ldap_connect($ ldaphost);'(当使用主机名的URL标识符时''port'参数不在'ldap_connect()'中使用),正如Stefan Gehrig所说。如果你成功建立连接,也许你需要在'ldap_connect()'后面调用ldap_start_tls()' – 2011-05-09 13:58:23

start_tls()ldaps是相互排斥的,这意味着你不能在SSL端口(标准636)上发出start_tls(),或unecrypted端口(标准389)上发起ldaps。在连接启动后,start_tls()命令会在未加密的端口上启动安全连接,因此您会在绑定发生之前发出此命令以使其加密。另一组公共端口是3268(未加密)和3269(ssl),可能在您的服务器中启用。

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

被记录到Web服务器错误日志,这取决于你的日志级别,或粗壮(从PHP CLI)。要在这里获得更多信息,请检查您的Web服务器日志级别设置,或者直接从命令行运行php脚本。

要成功使用ssl端口,您需要指定ldaps://前缀,而在未加密的端口上,这不是必需的(前缀为ldap://)。

看你的代码,这可能是一个协议版本问题,因为PHP默认使用第2版。为了解决这个问题,你可以发出:

ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION,3); 
ldap_set_option($conn, LDAP_OPT_REFERRALS,0); 

您尝试绑定之前。

您也可以看看​​中的代码,我在CentOS 5中成功使用该代码,但在Ubuntu中遇到问题。如果您的服务器有一个开放的未加密端口,最好对其进行未加密的测试绑定,以排除任何连接问题。

要检查该端口是开放的,你可以检查的telnet连接它,E.G:

telnet my.server.com 3268 

如果端口是开放的,那么你应该能够用它来绑定。

*编辑:如果SSL证书被认为无效,连接将失败,如果是这种情况,将调试级别设置为7将宣布这一点。为了解决这个特定的问题,你需要忽略的有效性:

您可以通过在你的PHP代码发行

putenv('LDAPTLS_REQCERT=never'); 

忽略Windows中的有效性。在*您需要编辑/etc/ldap.conf中用尼克斯包含

TLS_REQCERT never 
+0

我试图设置LDAP_OPT_PROTOCOL_VERSION和LDAP_OPT_REFERRALS没有运气。过去也尝试过你的每一个建议,并且仍然有问题。 – phirschybar 2011-05-13 08:50:47

+0

你的telnet测试结果如何?你在做什么操作系统? debuglevel 7的输出是什么? – 2011-05-13 14:05:15

+0

该ssl建议钉住了它。谢谢。 – phirschybar 2011-05-16 02:32:28

端口636是支持SSL的端口,需要启用SSL的连接。 您应该尝试连接端口389,或更改您的代码以包含安全层(更复杂)。

亲切的问候,

朱利

要使用SSL连接,你应该尝试

$ldapconn = ldap_connect('ldaps://'.$ldaphost); 

这将在端口636是默认ldaps -port自动连接。根据您的服务器安装和配置,可能只允许在端口389上进行连接(不使用加密或使用TLS),或者仅在使用SSL加密的端口636上进行连接。尽管您的服务器可能会公开其他端口。因此,一般来说,您需要知道要连接到哪个端口以及服务器需要哪种加密方法(无加密,SSL或TLS)。

+0

根据LDAP管理员,我们必须使用SSL和端口636.我尝试使用你建议的前缀无济于事。 – phirschybar 2011-05-05 20:49:40

用一个有效的CA签署的LDAP服务器的证书?也许你的客户拒绝证书!