LDAP ve PHP

5 Cevap php

Ben PHP ile (LDAPS kullanarak) güvenli bir LDAP sunucusuna bağlanmak için çalışıyorum, ama ben onunla sorunlar yaşıyorum. Ben şu hatayı alıyorum

Warning: ldap_bind() [function.ldap-bind]: Unable to bind to server: Can't contact LDAP server in /var/www/test.php on line 16

Ben LDAPS olmadan bağlanmaya çalıştığınızda çalışır, ama ben hassas bilgileri ile ilgili olacak çünkü ben ldaps kullanmanız gerekmektedir.

Ben aşağıdaki kodu kullanıyorum

<?php
// basic sequence with LDAP is connect, bind, search, interpret search
// result, close connection

echo "<h3>LDAP query test</h3>";
echo "Connecting ...";
$ds=ldap_connect("ldaps://server");  // must be a valid LDAP server!




print $ds;

if ($ds) { 
    echo "<br><br>Binding ..."; 
    $r=ldap_bind($ds);     // this is an "anonymous" bind, typically
                           // read-only access
    echo "Bind result is " . $r . "<br />";

    echo "Searching for (sn=S*) ...";
    // Search surname entry
    $sr=ldap_search($ds, "ou=people,o=server.ca,o=server", "uid=username*");  
    echo "Search result is " . $sr . "<br />";

    echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "<br />";

    echo "Getting entries ...<p>";
    $info = ldap_get_entries($ds, $sr);
    echo "Data for " . $info["count"] . " items returned:<p>";

print_r($info);
//    for ($i=0; $i<$info["count"]; $i++) {
//        echo "dn is: " . $info[$i]["dn"] . "<br />";
//        echo "first cn entry is: " . $info[$i]["cn"][0] . "<br />";
//        echo "first email entry is: " . $info[$i]["mail"][0] . "<br /><hr />";
//    }

    echo "Closing connection";
    ldap_close($ds);

} else {
    echo "<h4>Unable to connect to LDAP server</h4>";
}
?>

5 Cevap

LDAP sunucusu kimlik doğrulaması olamazdı eğer uyarı farklı bir olurdu gibi sorun, gerçek bağlama işlemi (geçersiz kimlik bilgileri) ile ilgili değildir. Ama Paul Dixon ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3) gerekli olmalıdır kullanımı belirtildiği gibi - Ben bu sorunların nedeni olduğunu düşünmüyorum bile.

  • Hangi LDAP sunucusu türü bağlanıyorsunuz? OpenLDAP, Active Directory veya başka bir şey?
  • Bilgisayar PHP program çalıştıran işletim sistemi nedir?
  • Eğer LDAP sunucusunda kendinden imzalı SSL sertifikası kullanılarak ve makine PHP programını çalıştırarak güvenilen verilen sertifika için sertifika otoritedir mı?
  • LDAP sunucusu Hangi port üzerinde çalışır? 636 LDAPS için "resmi" noktası olacaktır. Belki sunucu adresi açıkça noktası ekleyebilirsiniz: ldaps://<<server>>:636.

ext/ldap, SSL / TLS güvenli bağlantı ile bazı sorunları var. Eklemek için deneyebilirsiniz

TLS_REQCERT never

için ldap.conf (/etc/ldap.conf veya /etc/ldap/ldap.conf * nix tabanlı sistemlerde) veya Windows makineleri yukarıdaki içeriğe sahip bir ldap.conf oluşturmak için C:\OpenLDAP\sysconf\ldap.conf (zor kodlu uzantısı içine olduğu gibi yolu tam bir maç olması gerekir).

Bu yeni PHP sürümleri ile bazı sunucularda SSL / TLS kullanarak bir sorun gibi görünüyor. Değil emin niçin. Sen benim mesaja bakabilirsiniz: Problems with secure bind to Active Directory using PHP

Daha muhtemel nedenlerinden biri, Stefan gelen nedenidir. Bu gerçekten böyle olduğundan emin olmak için, siz de kullanabilirsiniz:

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

Lütfen ldap_connect önce. Bu oturum için daha aklı başında hata mesajı basacaktır (genellikle SSL sertifika geçerli değil, ref. Stefan Gehrig)

Eski olmasına rağmen, ben aynı sorunu karşılaştı ve gelecek okuyucular için bazı fikir sağlamak istedim.

Sorunun bir parçası out-of-date OpenSSL kütüphaneleri, 0.9.6 (çalıştı) 1.0.0 vs. Oldu

Sunucuda OpenSSL'yi güncelledikten sonra, PHP OpenSSL desteği kayıp olduğu kaydedildi.

Siz komut satırından aşağıdaki modüller için destek kontrol edebilirsiniz:

php -m 

Veya

echo phpinfo(INFO_MODULES);

Tarayıcıdan.

Ayrıca, benim mesleki deneyim OCI8/Oracle LDAP kütüphanelerini kullanarak LDAP SSL desteği ile ilgili sorunlar bir çok olmuştur. Debian platformlarda, Libldap-2.4.2-dev paketleri iyi çalışır.

Ayrıca, LDAP sunucusundaki bağlantı günlükleri bakmak gerekir. Neredeyse bir hata SSLv3 atıfta ve sertifika için bir CA eksik göreceksiniz garanti edemez.

(. CLI ile kullanıcı, Apache kullanıcı, vb) Varsayılan olarak, PHP UNIX sistemleri üzerinde CA dosyasını arar, emin PHP invoker tarafından okunabilir yapmak:

/etc/pki/CA

Bu mutlaka bir PHP sorun, ama Secure LDAP ile bir yapılandırma sorunu değildir. Bu PHP bug report ve bu OpenLDAP thread bakın.

OpenLDAP parçacığı üzerinde başvuru için bir çalışma OpenLDAP config bir pasajı vardır.

Kontrol etmek için bazı diğer şeyler etc / services / daki hizmet tanımları olduğunu. Emin olun şu var:

ldaps           636/tcp                         # LDAP over SSL
ldaps           636/udp

Ben sadece 3 olmak için ldap protokolü sürümünü ayarlamak gerektiğini düşünüyorum

echo "<h3>LDAP query test</h3>";
echo "Connecting ...";

$ldap_server = 'ldaps://server';
$ldap_port = '636';

$ds = ldap_connect($ldap_server, $ldap_port);

if ($ds) 
{
    //add this
    if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) 
    {
        fatal_error("Failed to set LDAP Protocol version to 3, TLS not supported.");
    }
    echo "<br><br>Binding ..."; 
    $r=ldap_bind($ds);     // this is an "anonymous" bind, typically
                       // read-only access
    echo "Bind result is " . $r . "<br />";

    echo "Searching for (sn=S*) ...";
    // Search surname entry
    $sr=ldap_search($ds, "ou=people,o=server.ca,o=server", "uid=username*");  
    echo "Search result is " . $sr . "<br />";

    echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "<br />";

    echo "Getting entries ...<p>";
    $info = ldap_get_entries($ds, $sr);
    echo "Data for " . $info["count"] . " items returned:<p>";

    print_r($info);
    //    for ($i=0; $i<$info["count"]; $i++) {
    //        echo "dn is: " . $info[$i]["dn"] . "<br />";
    //        echo "first cn entry is: " . $info[$i]["cn"][0] . "<br />";
    //        echo "first email entry is: " . $info[$i]["mail"][0] . "<br /><hr />";
    //    }

    echo "Closing connection";
    ldap_close($ds);

} 
else 
{
    echo "<h4>Unable to connect to LDAP server</h4>";
}

LDAP-Server "adsız bağlantılara" etkinleştirmek veya doğru bind (kullanıcı adı / parola) kullanmayı deneyin.

gibi cn=ldapauthuser,ou=accounts,dc=example,dc=com