Este team redactor ha estado horas investigando la respuesta a tus búsquedas, te brindamos la resolución así que nuestro deseo es serte de mucha apoyo.
Solución:
Puede ignorar la validez en Windows emitiendo
putenv('LDAPTLS_REQCERT=never');
en su código php. En * nix necesitas editar tu /etc/ldap.conf
contener
TLS_REQCERT never
Otra cosa a tener en cuenta es que requiere la versión 3 (la versión 2 es la predeterminada de php):
//$hostnameSSL example would be "ldaps://just.example.com:636" , just make sure it has ldaps://
$con = ldap_connect($hostnameSSL);
ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
Para tener una mejor idea de lo que está pasando, puede habilitar el registro de depuración haciendo lo siguiente:
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
Esto se puede hacer antes de la ldap_connect
tiene lugar
Mi solución/solución alternativa es usar
/etc/ldap/ldap.conf:
#TLS_CACERT /etc/ssl/certs/ca.crt
TLS_REQCERT never
Si tiene una idea mejor, publique otra respuesta.
El escenario específico presentado en la pregunta, con un certificado caducado que no se puede cambiar, parece requerir la desactivación de la validación del certificado en el cliente LDAP.
Sin embargosospecho que mucha gente, como yo, accede a esta página por otras causas raíz de recibir errores TLS LDAP opacos, donde deshabilitar la validación de certificados TLS no es una respuesta adecuada.
En mi caso, usando la extensión de autenticación LDAP para Mediawiki en un servidor Ubuntu 18.04 LTS y autenticando contra Active Directory en un servidor Windows Server 2012, la autenticación dejó de funcionar en enero/febrero de 2020. El certificado del servidor y el certificado de CA todavía estaban ambos válidos y openssl s_client -verify 2 -connect
desde el servidor Mediawiki pasó muy bien.
Eventualmente me di cuenta de que el algoritmo de firma en el certificado SSL servido por AD/LDAP era SHA1, que recordé sufrió recientemente del primer elegido conocido:prefix explotación de colisión. Esto me llevó a investigar el registro de cambios de los paquetes que se habían actualizado recientemente en el sistema, que arrojó “Marcar SHA1 como inseguro para la firma de certificados” en el registro de cambios de gnutls28 alrededor del 8 de enero de 2020. (La cadena de dependencias del php-ldap El paquete en Ubuntu 18.04 va a php7.2-ldap -> libldap-2.4-2 -> libgnutls30, cuyo paquete fuente es gnutls28).
Seguí algunas instrucciones para actualizar la CA de Windows para usar SHA256 y luego seguí selectivamente las instrucciones para renovar el certificado AD/LDAP, instalé el nuevo certificado CA en mi servidor Mediawiki, ¡y el problema se resolvió! Brevemente, estos pasos incluyeron:
- En un Admin PowerShell en el servidor AD, ejecute
certutil -setreg cacspCNGHashAlgorithm SHA256
- En la MMC de la autoridad de certificación, haga clic con el botón derecho en CA -> Todas las tareas -> Renovar certificado de CA
- En un MMC en blanco, agregue el complemento para Certificados; seleccione Equipo local
- En Personal -> Certificados, busque la entrada actual utilizada por LDAPS (tipo de plantilla de autenticación Kerberos) -> Todas las tareas -> Opciones avanzadas -> Renovar este certificado con la misma clave
- En la misma ventana, abra el nuevo certificado CA -> Detalles -> Copiar a archivo -> no privado key -> X.509 codificado en base64
- Copie el archivo resultante en /usr/share/ca-certificates/ en el servidor Mediawiki, luego ejecute
sudo dpkg-reconfigure ca-certificates
y seleccione el nuevo certificado de CA para su inclusión.
PD Para propósitos de SEO, según el modo que estaba usando, los mensajes de error incluían:
ldap_start_tls(): Unable to start TLS: Connect error in /var/www/mediawiki/extensions/LdapAuthentication/LdapAuthenticationPlugin.php
en el registro de errores HTTPldap_start_tls(): Unable to start TLS: Can't contact LDAP server in [...]
Failed to start TLS.
en el registro de depuración de Mediawiki (al usarwgLDAPEncryptionType
=ssl
es decir, puerto LDAP encriptado, 636)Failed to bind as CN=foobar,CN=Users,DC=myOrgName,DC=local
en el registro de depuración de Mediwiki (al usarwgLDAPEncryptionType
=tls
es decir, STARTTLS en el puerto LDAP sin cifrar, 389)
Si conservas alguna desconfianza o capacidad de limar nuestro división te evocamos ejecutar una explicación y con placer lo estudiaremos.