PHP无法连接LDAP Oracle Directory Server Enterprise Edition


PHP cannot connect to LDAP Oracle Directory Server Enterprise Edition

已经玩了好几天了,不能让php绑定到Oracle的DSEE上的ldap。

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...";
        }
    }
}

我得到错误:

Message: ldap_bind() [function. s]LDAP -bind]: cannot bind to server: Can't contact LDAP server

把我的头发都扯出来了。我就是没法让它绑定。

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

start_tls()ldaps是互斥的,这意味着您不能在ssl端口(标准636)上发出start_tls(),也不能在未加密的端口(标准389)上启动ldapsstart_tls()命令在连接启动之后在未加密的端口上启动一个安全连接,因此您可以在绑定发生之前发出该连接以使其加密。另一组常用端口是3268(未加密)和3269 (ssl),它们可能在您的服务器中启用。

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

是记录到您的web服务器错误日志,这取决于您的日志级别,或stout(从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);

.

你也可以看看使用PHP安全绑定到活动目录的问题,我在CentOS 5中成功地使用了它,但在Ubuntu中出现了问题。如果您的服务器有一个开放的未加密端口,那么最好对它执行一个未加密的测试绑定,以排除任何连接问题。

要检查端口是否打开,您可以检查telnet是否连接到它,例如:

telnet my.server.com 3268

如果端口是打开的,那么您应该可以使用它进行绑定。

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

您可以通过发出

来忽略windows中的有效性
putenv('LDAPTLS_REQCERT=never');
PHP代码中的

。在*nix中,您需要编辑/etc/ldap.conf以包含

TLS_REQCERT never

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

亲切的问候,卢多维奇

要使用SSL连接,请尝试

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

这将自动连接端口636,这是默认的ldaps端口。根据您的服务器安装和配置,可能只允许连接端口389(不使用加密或使用TLS),也可能只允许连接端口636(使用ssl加密)。尽管您的服务器可能会公开其他端口。一般来说,你需要知道要连接哪个端口以及服务器需要哪种加密方式(不加密,SSL或TLS)

LDAP服务器的证书是否经过有效CA的签名?也许您的客户端只是拒绝证书!