Estuve peleando un rato con certificados autofirmados (self-signed certificates) para lograr que los clientes se comuniquen con Openldap usando TLS.

Recientemente hice una migración de un Primary Domain Controller, el cual tenía OpenLDAP y algunos clientes configurados sin TLS con ldap://server.domain y otros con SSL con ldaps://server.domain. Habían unos certificados “self-signed” que se presentaban para autenticar a los clientes con SSL todo esto en una versión antigua de openldap.

Sin embargo, OpenLDAP deprecó el uso de ldaps:// (puerto 636) y a partir de su versión 2.0 en el mismo puerto ‘389’ se manejan conexiones con y sin encriptación como lo indica la documentacion oficial, ahora para encriptar la comunicación se usa la configuración StartTLS.

Adicional a estos cambios, la configuración de Openldap ya no se centraliza en el archivo ldap.conf (servidor), sino en preferiblemente en la estructura cn=config que se manipula de una forma particular (un tanto incómoda).

Para utilizar certificados autofirmados y que estos sean accesibles para los clientes debemos:

  1. Generar los certificados autofirmados (self-signed) como indica el HowTo de OpenLDAP TLS o también este buen tutorial en Digital Ocean
  2. Agregar los certificados, key  y el CA en la configuración de cn=config
  3. Configurar los clientes (de ser necesario).
  4. Verificar los permisos de los certificados
  5. Reiniciar Openldap

Agregar los certificados vía cn=config

Genere un archivo add-certs.ldif con el siguiente contenido:

Y ejecute:

Verifique que los paths en el archivo generado concuerdan con la ubicación de sus certificados y que además que el usuario openldap pueda acceder a los mismos (verifique los permisos además de las rutas)

Durante el proceso, obtuve los siguientes errores:

Es muy importante reiniciar o invalidar el caché de nscd tras cada cambio descrito en este documento para evitar problemas. Pueden utilizar:

  • service nscd restart
  • nscd -i groups
  • nscd -i passwd

Si no realizan esto, podrían experimentar el error : Could not connect to any LDAP server as (null) – Can’t contact LDAP server

Una vez se haya invalidado la caché de nscd, espere unos minutos y pruebe nuevamente.

additional info: TLS already started

Error

Solución

O bien usamos la opción -ZZ y ldap://  o utilizamos ldaps:// sin la opción -ZZ pero no ambas juntas:

Otros errores

  • TLS: peer cert untrusted or revoked (0x42)
  • ldap_sasl_bind(SIMPLE): Can’t contact LDAP server (-1)
  • TLS: can’t connect: (unknown error code)
  • connection_read(13): unable to get TLS client DN, error=49 id=5

Estos errores estaban asociados a lo mismo, pueden obtenerse iniciando en modo debug el servidor de openldap:

Error (utilizando el modo debug d -1)

Solución

El certificado no está bien configurado en el servidor / cliente. Verificar:

  • Que el certificado, key y CA están correctamente configurados en cn=config
  • Que el certificado está bien configurado en ldap.conf (cliente y servidor)
  • Que el certificado es válido-> openssl verify -CApath  /etc/ldap/ssl/ servidor.pem
  • Que los permisos al path y certificado sean correctos (cliente y servidor)

Mi implementación luce así:

cn=config

ldap.conf (servidor)

ldap.conf (cliente)