PHP无法连接到LDAP Oracle Directory Server Enterprise Edition

时间:2011-05-04 19:41:01

标签: php oracle ldap

已经玩了好几天了,无法让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...";
        }

    }
}

我收到错误:

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

在这个上撕掉我的头发。我只是无法得到绑定的东西。

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

4 个答案:

答案 0 :(得分:3)

start_tls()ldaps是互斥的,这意味着您无法在ssl端口(标准636)上发出start_tls(),或在未加密的端口上发起ldaps(标准389) )。 start_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);
在尝试绑定之前

您还可以查看我在CentOS 5中成功使用的Problems with secure bind to Active Directory using PHP中的代码,但在Ubuntu中遇到了问题。如果您的服务器有一个打开的未加密端口,最好对它进行未加密的测试绑定,以排除任何连接问题。

要检查端口是否已打开,您可以检查telnet是否连接到它,E.G:

telnet my.server.com 3268

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

*编辑:如果认为ssl证书无效,则连接将失败,如果是这种情况,将调试级别设置为7将宣布此操作。要解决这个特定问题,您需要忽略有效性:

您可以通过发出

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

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

TLS_REQCERT never

答案 1 :(得分:0)

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

亲切的问候,

朱利

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

LDAP服务器的证书是否由有效CA签名?也许你的客户只是拒绝证书!