20110628

Cómo usar el DNI electrónico para iniciar sesión en Mac OS X

En entradas anteriores ya hemos hablado de las posibilidades que ofrecen las últimas versiones (por el momento en pruebas) del software OpenSC y OpenDNIe para usar el DNI electrónico en Mac OS X.
Este sistema operativo dispone, desde la versión 10.4, de soporte para utilizar tarjetas inteligentes como medio de autenticación de los usuarios. Es decir, la posibilidad de "enlazar" una cuenta de usuario del sistema con una tarjeta inteligente que cumpla unos requisitos mínimos, a saber:
  • La tarjeta debe ser capaz de firmar utilizando una clave pública
  • La tarjeta debe ser compatible con alguno de los módulos de acceso a tarjeta inteligente (tokend) instalados en el sistema

Por definición y diseño, la tarjeta del DNI electrónico cumple con el primer requisito y, por otra parte, en las últimas versiones de OpenDNIe/OpenSC se ha mejorado bastante el módulo tokend de OpenSC en su integración con el DNIe, hasta el punto de que ya es posible acceder a los certificados de autenticación y firma, y por tanto se puede utilizar para el acceso al sistema.
A continuación explicaremos los pasos a seguir para configurar localmente un usuario de acceso a un sistema Mac OS X.

Requisitos:
  • Mac OS X 10.6.x (aunque se indica dónde mirar cómo configurar versiones anteriores)
  • Lector de DNI electrónico
  • DNI electrónico de la persona cuyo usuario se va a configurar
  • OpenDNIe/OpenSC instalado, bien compilado por nosotros mismos, bien descargando una versión compilada (se puede usar la mía o una de las últimas versiones de prueba SVN oficiales). En este caso hemos utilizado la versión SVN 400 obtenida el 22 de Junio de 2011.
Instrucciones:

Una vez tengamos el sistema operativo con OpenDNIe instalado, y tengamos elegida la cuenta de usuario que se quiera asociar a un DNI electrónico concreto, seguimos estos pasos para identificar el DNI electrónico:
  • Abrimos una sesión de terminal local
  • Conectamos el lector de DNI electrónico al Mac
  • Insertamos el DNI electrónico en el lector (!ojo! ver Nota 2 más abajo sobre desbloqueo del DNIe en acceso a llaveros)
  • Escribimos el siguiente comando para obtener las cadenas asociadas a los certificados del DNI electrónico:
sc_auth hash
Esto producirá un listado similar al siguiente:
8D4KJH56445B2G32J23J5JHGD7872JH83456C5A9 KprivAutenticacion
5B4LK34MLK0957387CBXVGHD8276309FKJ6F51A2 KprivFirmaDigital
CCBXVGHD8276309FKJ6F51AH7CB749300C8B0080 com.apple.systemdefault
812A762A5817CBXVGHD8276309FKJ6F51A11205A com.apple.kerberos.kdc
C9CBXVGHD8276309FKJ6F51ADSD9873SDKJB0080 com.apple.systemdefault
812A762A58CBXVGHD8276309FKJ6F51ACC11205A com.apple.kerberos.kdc
  • Tomamos nota de la cadena asociada a KprivAutenticación, que es el certificado de autenticación del DNI electrónico (en este ejemplo sería 8D4KJH56445B2G32J23J5JHGD7872JH83456C5A9).
  • Asociamos la cadena al nombre corto (login) del usuario del Mac que queremos que se identifique con el DNI electrónico (en este ejemplo se llama usuariodni), usando el siguiente comando (¡ojo! se requieren permisos de administrador local):
sudo sc_auth accept -u usuariodni -h 8D4KJH56445B2G32J23J5JHGD7872JH83456C5A9

Aclaración: usuariodni es un nombre de ejemplo. Hay que cambiarlo por el nombre corto (login) del usuario del Mac que queramos que utilice ese DNIe para identificarse.

Si queremos comprobar que se ha registrado bien la cadena con el login del usuario, podemos usar un comando como
sc_auth list -u usuariodni
que debería devolvernos, al menos, la cadena que habíamos registrado asociada al DNIe.

Ahora, estando en la ventana de inicio de sesión de Mac OS X

Si se conecta el lector de DNI, y se inserta la tarjeta, cambiará a esta otra forma:

Ahora, para iniciar sesión, se deberá introducir el PIN del DNI electrónico. La primera vez que el usuario lo haga, aparecerá una ventana como la siguiente:


Esta es una limitación del sistema operativo, que utiliza las credenciales de autenticación para bloquear y desbloquear el llavero de certificados por defecto del usuario.

Si eligiéramos la opción de "Actualizar la contraseña del llavero", el sistema utilizará la clave pública del DNIe para sustituir la anterior contraseña que utilizaba el usuario. Esto plantea dos problemas:
  • Si el usuario accediera sin utilizar el DNIe y usando su contraseña antigua, no tendría acceso al llavero.
  • Si cambiasen los certificados del DNIe (por renovación o por extravío de la tarjeta, por ejemplo), también se perdería el acceso al llavero.
Por lo tanto, probablemente sea más útil continuar con el inicio de sesión y seguir utilizando la contraseña antigua para desbloquear el llavero.

Nota muy importante: Según me indican en los comentarios, salvo que se haya activado la opción de actualizar la contraseña del llavero, no iniciar el ordenador con el DNIe insertado porque el sistema intentará enviar como PIN la contraseña del usuario (el del llavero de sesión)... y bloqueará el DNIe al tercer intento.

Esto es: primero se arranca el Mac; y luego -y únicamente luego-, cuando aparezca la ventana de petición de login, se introduce el DNIe en el lector


En el caso de sistemas operativos más antiguos, es necesario hacer más cambios tal y como se indica en el siguiente documento de soporte de Apple: http://support.apple.com/kb/TA24244. El texto es para Mac OS X 10.4, pero también es válido para la versión 10.5, donde la mayoría de los cambios de configuración ya no son necesarios.

En ese mismo documento se indica un procedimiento por el que asociar atributos de cuentas de un directorio (LDAP, etc.) con atributos de la tarjeta para la validación en sistemas centralizados.

Nota 2: Tras haber instalado OpenSC y tokend, con la versión de OpenDNIe/OpenSC que se ha probado, la primera vez que se inserta el DNIe, aunque aparece en Acceso a llaveros y el sistema detecta la tarjeta, los certificados de firma y autenticación no se ven en Acceso a llaveros y, si se lanza el comando sc_auth hash, aparece un mensaje de error como el siguiente:
security: SecKeychainSearchCopyNext: CSSMERR_DL_MISSING_VALUE
security: SecKeychainSearchCopyNext: CSSMERR_DL_MISSING_VALUE

Para corregirlo, basta con ir a acceso a llaveros, elegir el DNI electrónico, y pulsar en el candado
Tras introducir el PIN del DNI electrónico, si cerramos Acceso a llaveros y volvemos a abrirlo, aparecerán los certificados y claves en acceso a llaveros, y el comando sc_auth hash funcionará correctamente. Parece ser que esto sólo hay que hacerlo la primera vez que insertemos un DNI electrónico, para cada DNIe que queramos usar.
Es decir, si tenemos tres DNIe distintos para tres personas, será necesario desbloquear cada uno de ellos al menos una vez desde acceso a llaveros, antes de poder utilizarlo con sc_auth.

13 comentarios:

  1. Un aviso importante:

    Salvo que hayáis activado la opción de "Actualizar la contraseña del llavero, NO ARRANCAR EL ORDENADOR CON EL DNI insertado: MacOSX intentará enviar como PIN el password del usuario (el del llavero de sesion)... y bloqueará el DNIe al tercer intento

    Esto es: primero se arranca el Mac; y luego -y únicamente luego-, cuando aparezca la ventana de petición de login, se introduce el DNIe en el lector

    Avisados estáis

    Juan Antonio

    PS: enhorabuena por el tutorial. Por lo visto, está causando furor :-)

    ResponderEliminar
  2. @Jonsy Gaviota:

    He actualizado la entrada indicando claramente lo que mencionas.

    Me alegro de que a la gente le resulte útil ;-)

    ResponderEliminar
  3. Hola
    Lo he intentado siguiendo todos los pasos. Lo único que obtengo con el comando 'sc_auth hash' es este doble mensaje de error

    security: SecKeychainSearchCopyNext: CSSMERR_DL_MISSING_VALUE
    security: SecKeychainSearchCopyNext: CSSMERR_DL_MISSING_VALUE

    (sistema 10.6.8)

    Por lo demás el DNIe funciona sin problema (y el proceso de instalación es mucho más fácil que el «oficial»).

    Gracias.

    ResponderEliminar
  4. @Jeremias

    Hola
    ese mensaje de error indica que no se puede obtener la información que se esperaba por el tokend que se esté usando. ¿No tendrías instalada alguna versión anterior de software para el DNIe o para lectores de tarjetas inteligentes?
    Comprueba en /Sistema/Librería/Security/tokend/ lo que hay instalado. Yo tengo
    BELPIC.tokend
    CAC.tokend
    CANG.tokend
    JPKI.tokend
    OpenSC.tokend
    PIV.tokend

    Si tuvieras alguno más, igual está interfiriendo.

    También hay que tener cuidado porque el acceso a la tarjeta del DNIe es bastante exclusivo y no le sienta bien que accedan varios a la vez. Si estás configurando lo del acceso al sistema, procura no tener firefox funcionando a la vez, porque podría bloquear el acceso.

    Por último, he visto a veces que la cosa se pone "tonta" a veces si andas abriendo y cerrando programas que lo usen (como Firefox o el cambio de PIN), metiendo y sacando la tarjeta, etc.
    Puedes intentar a hacerlo así:
    - Inicio del sistema (sin el lector ni la tarjeta conectados)
    - Conecta el lector (sin la tarjeta)
    - Inserta la tarjeta
    - Abre terminal y lanza sc_auth (normalmente tarda unos segundos desde que la insertas hasta que accede a ella)

    Una forma de comprobar que tokend está funcionando correctamente es que abras el acceso a llaveros y compruebes que aparece el DNI electrónico en la lista. Si además lo eliges, tienen que aparecer tus claves públicas y tus claves privada de autenticación y firma, así como el certificado de la autgorida de certificación del DNIe (AC DNIE).

    Tengo pendiente publicar otra entrada donde explico una forma fiable de añadir los certificados raíz de policía (DNIe) y FNMT a la raíz del sistema para que esté disponible para todos los usuarios del Mac.

    ResponderEliminar
  5. Acabo de probar en una máquina virtual, y creo que he conseguido reproducir el problema del error

    security: SecKeychainSearchCopyNext: CSSMERR_DL_MISSING_VALUE

    Parece ser que hay que desbloquear, al menos una vez, el DNI electrónico para que el sistema "vea" los certificados y claves públicas (aparte del certificado AC DNI). Si no, aparece ese error y los certificados no se ven con sc_auth ni en Acceso a llaveros. Edito la entrada explicando cómo arreglarlo.

    ResponderEliminar
  6. Pues parece que se resiste. El Acceso a Llaveros no desbloquea el DNI, aunque se ven los certificados. Al abrirse el cuadro de diálogo para meter el PIN aparece nuestro amigo el spinning wait cursor; admite el PIN, pero nada más.

    ResponderEliminar
  7. @Jeremias

    Aunque no cambie el estado del candado en Acceso a llaveros, OpenSC debería haber ofrecido acceso al sistema a la lista de contenidos del DNIe. Prueba a cerrar Acceso a llaveros y volver a abrirlo, y mira si ahora te salen en el listado todos los certificados.
    La interfaz de Acceso a llaveros no se refresca automáticamente (salvo que retires la tarjeta del lector), y lo más seguro es cerrar la aplicación y volver a abrirla entera para que cambie el estado.

    En resumen:
    - Inserta DNIe
    - Abre Acceso a llaveros
    - Comprueba si salen los certificados, claves privadas, etc. en la lista del DNI electrónico
    - Si no es así, pulsa en el candado e introduce tu PIN
    - Cierra Acceso a llaveros
    - Vuelve a abrirlo, y ahora deberían salir

    Si, por fin, se ven los certificados en Acceso a llaveros, pruea a usar sc_auth. Ahora debería funcionar.

    ResponderEliminar
  8. Nada, que no quiere funcionar. He probado en Snow Leopard y en Lion (los logins que muestras creo que no existen en SL) y no se produce el cambio a petición de PIN. Por lo demás, el paquete de OpenSC funcionando con Lion y FF5.

    ResponderEliminar
  9. @Jeremias

    Todas las capturas y pruebas las he hecho con Snow Leopard (10.6.8) en dos ordenadores distintos.

    Respecto a lo que dices de los logins, UsuarioDNI es un usuario que creé especialmente para hacer las capturas y pruebas. En tu caso tendrás que sustituirlo por el usuario que quieras en tu Mac que use el DNIe.

    Así, si tienes un usuario llamado, digamos, "Jeremías Ortiz" y con nombre corto (login) "jeremiasort", deberás hacer los pasos que indico sustituyendo "usuariodni" por "jeremiasort".

    Por ejemplo:

    sudo sc_auth accept -u jeremiasort -h 8DxxxxxxxxxA9

    ResponderEliminar
  10. Lo que me ha extrañado de los logins es la opción 'cambiar contraseña' que sólo la he visto en Lion, no sabía que se puede hacer en Snow..
    Lo del usuario lo hice bien, y aparentemente el Terminal aceptó el comando. ¿Hay alguna manera de verificarlo?
    Gracias otra vez.

    ResponderEliminar
  11. @Jeremias

    En Leopard/Snow Leopard, la opción de cambiar contraseña aparece sólo si se ha definido una contraseña maestra para el ordenador (en las preferencias del sistema->Seguridad->Filevault).

    Una forma de comprobar si se ha registrado correctamente, puedes usar también sc_auth list -u usuario, poniendo el login del usuario que quieres comprobar.

    Usando el ejemplo anterior:
    sc_auth list -u jeremiasort

    Esto debería devolver todas las cadenas de clave registradas para ese usuario, y podrás comprobar si coincide con la del DNIe o si hay algún error.

    ResponderEliminar
  12. Pues nada, que acabo de cambiar al Lion público y sigue sin funcionar. Hechas todas las comprobaciones, todo OK, el lector conectado directamente al USB del iMac, se ilumina el piloto del lector, pero al insertar el DNI no cambia de contraseña a PIN. Por cierto, la pantalla de login está totalmente renovada.

    De todas formas, muchas gracias y por aquí seguiré (y por Macuarium) para ir haciendo pruebas.

    ResponderEliminar
  13. Hoy estoy actualizando a Lion yo también. A ver si el fin de semana hago la prueba y te cuento si a mí me funciona.

    ResponderEliminar