# LDAP, LDAPS y certificados

Fecha de referencia: 1 de abril de 2026.

Esta guia explica como configurar y diagnosticar la autenticacion LDAP de la intranet, con foco en `LDAPS`, certificados y errores de confianza TLS.

## Configuracion que usa el nucleo

La intranet trabaja con estas constantes:

- `LDAP_SERVER`
- `LDAP_DOMAIN`
- `LDAP_BASE_DN`
- `LDAP_ADMIN_DN`
- `LDAP_ADMIN_PASS`

Codigo relacionado:

- [`../instalacion/lib.php`](../instalacion/lib.php)
- [`../common/auth.php`](../common/auth.php)
- [`../common/config.php`](../common/config.php)

Tanto el instalador como el login:

- fuerzan LDAP v3
- desactivan referrals
- aplican timeouts de red y operacion cuando estan disponibles

## LDAP frente a LDAPS

### LDAP

- ejemplo: `ldap://dc01.midominio.local:389`
- no cifra el canal por si mismo
- util para laboratorio o pruebas aisladas

### LDAPS

- ejemplo: `ldaps://dc01.midominio.local:636`
- cifra la conexion desde el inicio
- exige que el servidor Linux confie en la CA que firma el certificado del DC

Recomendacion:

- desarrollo: LDAP o LDAPS segun lo que te desbloquee antes
- preproduccion y produccion: priorizar LDAPS

## Formato correcto de `LDAP_SERVER`

El codigo espera una URL completa. Ejemplos validos:

```text
ldap://dc01.midominio.local:389
ldaps://dc01.midominio.local:636
```

Evita usar IPs con `LDAPS` salvo que el certificado las cubra expresamente.

## Datos que necesitas antes de configurar

- FQDN del controlador de dominio
- puerto
- dominio corto
- base DN
- bind DN tecnico
- password del bind
- CA del dominio si vas a usar LDAPS

Ejemplo:

```text
Servidor: ldaps://dc01.midominio.local:636
Dominio: midominio
Base DN: DC=midominio,DC=local
Bind DN: CN=tecnico,CN=Users,DC=midominio,DC=local
```

## Como prueba LDAP el instalador

La funcion `ldap_test()`:

1. valida la URL
2. prueba conectividad TCP al host y puerto
3. abre conexion con `ldap_connect`
4. intenta `bind`
5. hace una busqueda minima sobre la base DN

Esto ayuda a separar:

- errores de red
- errores de credenciales
- errores de certificado
- errores de base DN o permisos

## Instalar la CA para LDAPS en Ubuntu

Via estandar:

```bash
sudo cp mi-ca.crt /usr/local/share/ca-certificates/intranet-ldaps-ca.crt
sudo update-ca-certificates
```

El instalador intenta hacer esto automaticamente. Si no tiene permisos:

- deja el certificado preparado en una ruta temporal
- y te permite completar el paso de forma manual

Formatos aceptados por el instalador:

- `.crt`
- `.cer`
- `.pem`

Internamente:

- valida el fichero como X.509
- lo exporta a PEM si hace falta

## Comprobaciones utiles en Ubuntu

### Verificar el puerto

```bash
nc -vz dc01.midominio.local 636
```

o:

```bash
openssl s_client -connect dc01.midominio.local:636 -showcerts
```

### Verificar la CA del sistema

```bash
ls -l /usr/local/share/ca-certificates/
sudo update-ca-certificates
```

### Verificar modulo LDAP en PHP

```bash
php -m | grep ldap
```

## Valores tipicos

### Active Directory con LDAPS

```text
LDAP_SERVER=ldaps://dc01.midominio.local:636
LDAP_DOMAIN=midominio
LDAP_BASE_DN=DC=midominio,DC=local
LDAP_ADMIN_DN=CN=tecnico,CN=Users,DC=midominio,DC=local
```

### Active Directory con LDAP

```text
LDAP_SERVER=ldap://dc01.midominio.local:389
LDAP_DOMAIN=midominio
LDAP_BASE_DN=DC=midominio,DC=local
LDAP_ADMIN_DN=CN=tecnico,CN=Users,DC=midominio,DC=local
```

## Errores tipicos

### No se pudo abrir host:puerto

Suele indicar:

- fallo de red
- DNS mal resuelto
- puerto incorrecto
- firewall

### Bind fallido

Suele indicar:

- credenciales incorrectas
- bind DN incorrecto
- problema TLS si es LDAPS

### Error de certificado o confianza

Suele indicar:

- CA no instalada
- cadena incompleta
- uso de IP en vez de FQDN

### Busqueda en base DN fallida

Suele indicar:

- base DN mal escrita
- permisos insuficientes del usuario tecnico

## Pruebas manuales recomendadas

Si tienes `ldap-utils`:

```bash
sudo apt install -y ldap-utils
```

Prueba con:

```bash
ldapsearch -x -H ldaps://dc01.midominio.local:636 \
  -D "CN=tecnico,CN=Users,DC=midominio,DC=local" \
  -W \
  -b "DC=midominio,DC=local" \
  "(objectClass=*)"
```

Si falla fuera de la intranet, el problema no esta en la aplicacion.

## Buenas practicas

- usar un usuario tecnico dedicado
- no usar cuentas personales de administrador
- limitar permisos a lo necesario
- usar FQDN para LDAPS
- guardar secretos del nucleo fuera del repo
- usar `/etc/intranet/intranet-config.php` como ruta recomendada para override sensible

La ruta `/etc/csif/intranet-config.php` se mantiene como fallback legacy.

## Relacion con otras guias

- [entorno-ubuntu-24-mariadb-php84.md](./entorno-ubuntu-24-mariadb-php84.md)
- [instalacion-intranet-en-ubuntu.md](./instalacion-intranet-en-ubuntu.md)
- [core-update-y-paso-a-preproduccion.md](./core-update-y-paso-a-preproduccion.md)
