2009-06-26 61 views
15

Sto provando a connettermi a un server LDAP sicuro (utilizzando LDAP) tramite PHP, ma ho problemi con esso. Ottengo il seguente erroreErrore di connessione LDAP e PHP

Attenzione: ldap_bind() [function.ldap-bind]: Impossibile collegarsi al server: Impossibile connettersi al server LDAP in /var/www/test.php on line 16

Io lavoro quando provo a connettermi senza LDAP, ma è necessario che io usi LDAP perché mi occuperò di informazioni sensibili.

Sto usando il seguente codice

<?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>"; 
} 
?> 
+1

Odio chiedere l'ovvio, ma è "ldaps: // server" un server LDAP valido? Questo non mi sembra un URI valido ... –

+1

È un server valido. Non ho scritto il vero servername lì per motivi di sicurezza –

+0

Si tratta di IIS o Apache? –

risposta

0

Penso che è sufficiente impostare la versione del protocollo LDAP da 3

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>"; 
} 
+0

scusa, questo non ha funzionato. Non ha mai gettato il tuo messaggio di errore, né è stato associato in modo impeccabile –

0

tenta di attivare "le associazioni anonime" sul vostro LDAP Server oppure utilizzare un binding corretto (nome utente/password).

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

7

Il problema non è legato al processo reale di rilegatura (credenziali non valide), come l'avvertimento sarebbe uno diverso se il server LDAP non ha potuto autenticare le credenziali. Ma come Paul Dixon dovrebbe essere necessario l'uso di ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3), anche se non penso che questa sia la causa dei tuoi problemi.

  • A quale tipo di server LDAP ci si sta connettendo? OpenLDAP, Active Directory o qualcos'altro?
  • Qual è il sistema operativo del computer che esegue il programma PHP?
  • Si sta utilizzando un certificato SSL autofirmato sul server LDAP ed è l'autorità di certificazione per il certificato dato attendibile dalla macchina che esegue il programma PHP?
  • Su quale porta viene eseguito il server LDAP? 636 sarebbe la porta "ufficiale" per LDAPS. Forse è possibile aggiungere la porta esplicitamente all'indirizzo del server: ldaps://<<server>>:636.

ext/ldap presenta alcuni problemi con le connessioni protette SSL/TLS. È possibile tenta di aggiungere

TLS_REQCERT never 

ai ldap.conf (/etc/ldap.conf o /etc/ldap/ldap.conf sui sistemi * nix-based) o per macchine Windows creare un ldap.conf con il contenuto sopra C:\OpenLDAP\sysconf\ldap.conf (il percorso deve essere una corrispondenza esatta come è difficile -codificato nell'estensione).

+0

Grazie, TLS_REQCERT ha fatto il trucco per me. –

+0

Questa opzione può essere impostata anche tramite le opzioni di inizializzazione LDAP (su python comunque, ldap.set_option (ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)) –

+1

IMO, questo è un pessimo consiglio per qualcosa che va oltre il semplice debug. L'impostazione di TLS_REQCERT non disabiliterà mai il controllo del certificato TLS. Ciò vanifica l'intero scopo dell'utilizzo di TLS in primo luogo. Con questa opzione impostata, non vi è alcuna garanzia che la connessione sia sicura. –

2

Sembra essere un problema utilizzare SSL/TLS su alcuni server con versioni PHP recenti. Non so perché. Puoi fare riferimento al mio post: Problems with secure bind to Active Directory using PHP

Una delle cause più probabili è la causa di Stefan. Per assicurarti che sia davvero così, puoi utilizzare:

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7); 

prima di ldap_connect. Questo stamperà un messaggio di errore più sano da registrare (tipicamente il cert non è valido, ref.Stefan Gehrig)

2

Anche se vecchio, ho riscontrato lo stesso problema e volevo fornire alcune informazioni per i futuri lettori.

Parte del problema era librerie OpenSSL scadute, 0.9.6 vs 1.0.0 (che funzionava).

Dopo aver aggiornato OpenSSL sul server, è stato notato che PHP ha perso il supporto per OpenSSL.

È possibile controllare il supporto per i moduli con la seguente dalla riga di comando:

php -m 

O

echo phpinfo(INFO_MODULES); 

Dal browser.

Inoltre, ci sono stati molti problemi con il supporto SSL per LDAP quando si utilizzano le librerie LDAP OCI8/Oracle nella mia esperienza professionale. Sulle piattaforme Debian, i pacchetti Libldap-2.4.2-dev funzionano meglio.

Inoltre, è necessario esaminare i registri delle connessioni sul server LDAP. Posso quasi garantire che vedrete un errore relativo a SSLv3 e manca una CA per il certificato.

Per impostazione predefinita, PHP cerca il file CA su sistemi UNIX in, assicurarsi che sia leggibile dal invoker PHP (utente tramite CLI, l'utente Apache, ecc ..):

/etc/pki/CA 

Questo non è necessariamente un problema con PHP, ma un problema di configurazione con Secure LDAP. Si prega di vedere questo PHP bug report e questo OpenLDAP thread.

Il thread OpenLDAP sopra ha un frammento di una configurazione OpenLDAP funzionante come riferimento.

Alcune altre cose da controllare sono le definizioni dei servizi in/etc/services. Assicurati di avere il seguente:

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

su UNIX "uomo ldap.conf" = ... SINOSSI /usr/local/etc/openldap/ldap.conf ...

Scrivi TLS_REQCERT mai in /usr/local/etc/openldap/ldap.conf e impostare ldap_set_option ($ DS, LDAP_OPT_PROTOCOL_VERSION, 3)

Questo lavoro nel mio progetto su nginx + PHP-FPM: nginx/1.6.0 php55 -5.5.15 php55-ldap-5.5.15 openldap-c lient-2.4.39_1

Problemi correlati