2009-06-26 109 views
15

Estoy intentando conectarme a un servidor LDAP seguro (usando LDAP) a través de PHP, pero estoy teniendo problemas con él. Me sale el siguiente errorError de conexión LDAP y PHP

Advertencia: ldap_bind() [function.ldap-bind]: No se puede enlazar al servidor: no se puede contactar con el servidor LDAP en /var/www/test.php en la línea 16

Funciono cuando trato de conectar sin LDAP, pero es necesario que use LDAP porque voy a tratar con información confidencial.

estoy usando el siguiente código

<?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 preguntar lo obvio, pero ¿es "ldaps: // server" un servidor LDAP válido? Eso no parece un URI válido para mí ... –

+1

Es un servidor válido. No escribí el nombre real del servidor allí por razones de seguridad –

+0

¿Está esto en IIS o apache? –

Respuesta

0

Creo que sólo necesita fijar la versión del protocolo LDAP sea 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

lo siento, esto no funcionó. Nunca lanzó su mensaje de error, ni se unió porpor completo –

0

intenta habilitar "enlaces anónimos" en su LDAP-Servidor o use un enlace correcto (nombre de usuario/contraseña).

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

7

El problema no está relacionado con el proceso de encuadernación real (credenciales no son válidas) como la advertencia sería uno diferente si el servidor LDAP no pudo autenticar sus credenciales. Pero como Paul Dixon notó que el uso de ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3) debería ser requerido, aunque no creo que esta sea la causa de sus problemas.

  • ¿A qué tipo de servidor LDAP se está conectando? OpenLDAP, Active Directory o algo más?
  • ¿Cuál es el sistema operativo de la computadora que ejecuta su programa PHP?
  • ¿Está utilizando un certificado SSL autofirmado en el servidor LDAP y es la autoridad de certificación para el certificado dado que confía la máquina que ejecuta su programa PHP?
  • ¿En qué puerto se ejecuta el servidor LDAP? 636 sería el puerto "oficial" para LDAPS. Quizás pueda agregar el puerto explícitamente a la dirección del servidor: ldaps://<<server>>:636.

ext/ldap tiene algunos problemas con las conexiones seguras de SSL/TLS. Puede intentar agregar

TLS_REQCERT never 

a los ldap.conf (/etc/ldap.conf o /etc/ldap/ldap.conf sobre * sistemas basados ​​en Unix) o para máquinas Windows crear un ldap.conf con el contenido anterior en C:\OpenLDAP\sysconf\ldap.conf (la ruta debe ser una coincidencia exacta ya que es difícil -codificado en la extensión).

+0

Gracias, TLS_REQCERT hizo el truco para mí. –

+0

Esta opción también se puede establecer a través de las opciones de inicialización de LDAP (en python de todos modos, ldap.set_option (ldap.OPT_X_TLS_REQUIRE_CERT, ldap).OPT_X_TLS_NEVER)) –

+1

IMO, este es un muy mal consejo para algo más que simple depuración. Establecer TLS_REQCERT para nunca deshabilitará todas las comprobaciones de certificados TLS. Esto derrota el propósito total de usar TLS en primer lugar. Con esta opción configurada, no hay garantía de que la conexión sea segura. –

2

Parece que hay un problema al usar SSL/TLS en algunos servidores con versiones PHP recientes. No estoy seguro por qué. Se puede hacer referencia a mi mensaje en: Problems with secure bind to Active Directory using PHP

Una de las causas más probables, es la causa de Stefan. Para asegurarse de que este es realmente el caso, puede utilizar:

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7); 

antes de su ldap_connect. Esto imprimirá un mensaje de error más sensato para el registro (por lo general, el certificado ssl no es válido, ref.Stefan Gehrig)

2

Aunque viejo, me he encontrado con el mismo problema y quería proporcionar algo de información para futuros lectores.

Parte del problema eran las bibliotecas obsoleta de OpenSSL, 0.9.6 vs 1.0.0 (que funcionó).

Después de actualizar OpenSSL en el servidor, se observó que PHP perdió soporte para OpenSSL.

Puede comprobar soporte para módulos con lo siguiente desde la línea de comandos:

php -m 

O

echo phpinfo(INFO_MODULES); 

desde el navegador.

Además, ha habido un montón de problemas con el soporte de SSL para LDAP al usar las librerías LDAP de OCI8/Oracle en mi experiencia profesional. En las plataformas Debian, los paquetes Libldap-2.4.2-dev funcionan mejor.

Además, debe consultar los registros de conexión en el servidor LDAP. Casi puedo garantizar que verá un error al referirse a SSLv3 y le faltará una CA para el certificado.

Por defecto, PHP busca el archivo CA en sistemas UNIX en, asegúrese de que es legible por el invocador PHP (usuario a través de CLI, el usuario de Apache, etc ..):

/etc/pki/CA 

Esto no es necesariamente un problema de PHP, pero un problema de configuración con Secure LDAP. Consulte esto PHP bug report y este OpenLDAP thread.

El hilo de OpenLDAP anterior tiene un fragmento de una configuración de OpenLDAP que funciona como referencia.

Algunas otras cosas para comprobar son sus definiciones de servicios en/etc/services. Asegúrate de que tienes el siguiente:

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

En UNIX "hombre ldap.conf" = ... /usr/local/etc/openldap/ldap.conf SINOPSIS ...

Escribir TLS_REQCERT Nunca en /usr/local/etc/openldap/ldap.conf y establecer ldap_set_option ($ ds, LDAP_OPT_PROTOCOL_VERSION, 3)

Este trabajo en mi proyecto de Nginx + PHP-FPM: nginx/1.6.0 php55 -5.5.15 php55-ldap-5.5.15 openldap-c lient-2.4.39_1

Cuestiones relacionadas