miércoles, enero 16, 2008

Usar certificados de cliente de la FNMT en una Aplicación Web

Mucho tiempo ha pasado desde la última entrada, pero entre que hemos estado muy ocupados y la pereza que da ponerse de nuevo a escribir, pues, han pasado tres meses (o más). Sin embargo, un nuevo reto se me planteó y tras sudar sangre para resolverlo lo comparto con vosotros. El tema de este post es: ¿Cómo usar certificados de la FNMT (Fábrica Nacional de Moneda y Timbre) en nuestra web?

Existe poquísima información al respecto en Internet, muchos posts de gente, mucha historieta pero nada concreto. Voy a intentar, por lo tanto, dar las instrucciones para configurar un servidor de internet (en mi caso IIS, aunque la configuración es similar para el resto) para poder pedir al usuario que utilice un certificado emitido por la FNMT.

Paso I: La Seguridad
Si no tenemos una conexión https con SSL, GAME OVER, fin de la partida. Es requisito indispensable comunicarnos con el cliente mediante una conexión cifrada para poder interactuar con los certificados. Pero, ¿cómo lo hacemos para conseguir un certificado?. En desarrollo podemos seguir los siguientes pasos (en producción necesitareis un certificado emitido por una CA Root reconocida):

Existen muchos sitios en internet donde se describe este proceso, os pongo esta url donde explican como generar nuestro propio certificado con OpenSSL:
http://www.locualo.net/programacion/activar-ssl-iis-certificado-digital-prueba/00000079.aspx

Paso II: La Teoría
Vamos a ver un poco de la teoría para saber cómo funciona el tema de los certificados. Una vez que sepamos como funciona, entenderemos los pasos a dar. El circuito de los certificados es el siguiente:

1. El cliente accede a la url https://.... (para la cual es necesario un certificado de cliente)
2. El servidor envía su certificado al cliente para establecer el canal seguro. El cliente debe confiar en la entidad que ha generado ese certificado y comprobar que es válido. En caso de no confiar aparecerá un mensaje en el explorador indicándonoslo (la mayoría de la gente no lo lee).
3. Una vez que el cliente ha confiado en el servidor, se establece el canal seguro.
4. El servidor tiene configurado que para el recurso que intenta ver el cliente es necesario que presente un certificado de cliente, emitido por una entidad certificadora en la que él confíe y además que está en la lista de los certificados admitidos para el recurso en cuestión.
5. El explorador del cliente recibe estas condiciones del servidor y muestra una ventana con los certificados instalados que cumplan los requisitos del servidor.
6. El usuario elige su certificado y éste es mandado al servidor.
7. El servidor comprueba la lista de revocación de certificados de la entidad que emitió el certificado para ver si sigue siendo válido.
8. En caso que el certificado sea válido, podremos acceder al recurso y en la sesión tendremos guardado el certificado para usarlo.

En la siguiente imagen os muestro el flujo:
















Paso III: La Confianza
Como habéis podido observar, la clave del asunto es la confianza entre los diferentes elementos (cliente y servidor). Vamos a ver cómo configurar nuestro servidor para: 1) requerir el certificado del cliente y 2)confiar en la fnmt para que acepte sus certificados.

Para requerir el certificado del cliente iremos al "Administrador de Servicios de IIS", buscaremos el recurso, sitio web o directorio virtual que necesitará certificado y pulsamos en "Propiedades" del menú contextual. En la pestaña "Seguridad de Directorios" pulsamos sobre el botón "Modificar" de la parte inferior. Nos aparecerá la siguiente pantalla:























Marcaremos la opción "Requerir Canal Seguro" y "Requerir Certificados de Cliente". Pulsamos sobre Aceptar y hemos terminado. Ahora el IIS espera un certificado del cliente para acceder al recurso, sin embargo, todavía no le hemos dicho que debe confiar en la FNMT como entidad certificadora.

Para confiar en la FNMT, tendremos que abrir una consola mmc (Ejecutar--> mmc), Archivo-->Agregar o Quitar Complemento. En la pantalla que aparece pulsaremos de nuevo sobre Agregar y seleccionaremos el complemento "Certificados":

















Pulsamos sobre "Agregar", seleccionamos la opción "Mi Cuenta de usuario" y cerramos la pantalla de agregar complementos. En la consola mmc, expandimos "Entidades emisoras raíz de confianza-->Certificados" y buscamos a la FNMT:

















En caso que no esté, tendremos que importarlo. Lo primero será conseguir la definición del certificado de la FNMT. La podéis conseguir desde aquí:

http://www.cert.fnmt.es/content/pages_std/certificados/FNMTClase2CA.cer

Guardamos el fichero .cer en nuestro servidor y en la consola mmc pulsamos con el botón derecho sobre "Certificados" y elegimos "Todas las tareas-->Importar". Saltará un asistente para importar un certificado, seleccionaremos el fichero que nos acabamos de descargar y siguiente hasta el final.

Una vez importado, veremos las propiedades del certificado y habilitaremos la opción "Autenticación del Cliente". De esta forma habilitamos a los certificados de la FNMT para que sirvan como certificados de cliente.

Con esto hemos dado nuestra confianza a la FNMT como CA Root, sin embargo, todavía no funciona porque tenemos que incluir a la FNMT como entidad válida para nuestro recurso, en la CTL (Certificate Trusted List). Para ello, volvemos a la consola del IIS y nos vamos a las propiedades del sitio web en el que esté el recurso del certificado. Seleccionamos la pestaña "Seguridad de Directorios" y pulsamos sobre el botón "Modificar" de la parte inferior. Aparecerá la pantalla siguiente:























En la parte inferior tenemos la lista de certificados de confianza, pulsamos sobre "Modificar" y en la lista que aparece, pulsamos sobre "Agregar desde el almacén" e incluimos el de la FNMT. Pulsamos "Siguiente" hasta el final y ya tenemos todo hecho.

Paso IV: Final
Ya tenemos nuestro entorno habilitado para utilizar certificados de cliente. En producción tendremos que tener un certificado emitido por una entidad reconocida, pero el resto es igual.

Espero que os haya aclarado las ideas y os haya servido.

45 comentarios:

Batou dijo...

Ante todo muchas gracias por el artículo ,ya era hora que alguien intentara plantearlo, parece que todo lo relacionado con la FNMT es Top Secret. Tengo algunas dudas:
1. Para que tu ejemplo funcione ¿no es necesario haber establecido la conexión con el servidor de la FNMT?.
2. Si es así, ¿cómo realizas la conexión: vía LDAP o vía OCSP?

Vanga un saludo y muchas gracias de antemano.

Manuel Cardenas Thorlund dijo...

Muchas gracias por leer mi artículo, es de agradecer.
En cuanto a tus preguntas,te respondo:

1. Para obtener acceso a las listas de revocación de certificados es necesario conectarse al servidor de la FNMT. El problema está en que la FNMT cobra por este servicio (por lo que tengo entendido bastante). Sin embargo podemos funcionar sin tener acceso a las listas de revocación, validando la fecha del certificado (entorno menos seguro pero más barato).

2. Lo primero que hemos de tener en cuenta es que al obtener el certificado del cliente tenemos acceso a una parte de la información del mismo (dni y nombre). En caso de querer más datos, tendrás que entrar en la página de "ceres" para ver la forma de conectarte con ellos. En ese tema no te puedo ayudar.

Estoy preparando otro artículo que lo publicaré en cuanto tenga un ratillo sobre cómo firmar peticiones SOAP utilizando el certificado de la FNMT con ASP.NET y C#.

Anónimo dijo...

Hola, el artículo es muy completo y claro, pero yo tengo un problema. Tengo un certificado de servidor web que he instalado siguiendo tu articulo, pero al intentar acceder a la página que requiere canal seguro me sale el error "No se pudo encontrar el servidor o error DNS Internet Explorer". ¿He hecho algo mal con el certificado o es otro tipo de problema? Gracias

Juan Manuel dijo...

Hola!

He instalado los dos certificados de la FNMT(el de servidor como comentas) y el de cliente (el mío). Me está fallando (eso creo) la comprobación de la revocación del certificado de cliente por la imposibilidad de descargarse la CLR y el IIS me muestra un mensaje del tipo "Se revocó el certificado de cliente o no se pudo determinar el estado de revocación. El certificado de cliente Secure Sockets Layer (SSL) sirve para identificarle como usuario válido del recurso.".
¿Habría forma de evitar que el IIS vaya a comprobar la revocación del certificado contra la CLR? En el primero de los comentarios comentas algo de que podemos funcionar sin tener acceso a las listas de revocación.

Gracias y un saludo.

Manuel Cardenas Thorlund dijo...

Buenas, para evitar que IIS compruebe la lista de revocaciones podemos deshabilitar la opción en la metabase de IIS. Para ello deberás modificar la propiedad CertCheckMode y ponerle el valor a 1 (por defecto es 0).

La metabase de IIS se encuentra en el directorio Windows/System32/inetsrv/Metabase.xml y tendrás que buscar el sitio web donde tienes colocado lo del certificado /LM/W3SVC/x donde x irá variando por cada sitio web que tengas definido.

Espero que te sirva de ayuda.

Juan Manuel dijo...

Hola!

Gracias por la ayuda, pero ¿Podrías indicarme con más detalle como deshabilitar la opción en la metabase de IIS?

Gracias y un saludo.

Manuel Cardenas Thorlund dijo...

Buenas Juan Manuel,
abres el fichero metabase.xml de windows/system32/inetsrv con el wordpad (por ejemplo). Tienes que buscar algo parecido a esto:

IIsWebServer Location ="/LM/W3SVC/1"
AppPoolId="DefaultAppPool"
DefaultDoc="Default.htm,Default.asp,index.htm,iisstart.htm,Default.aspx"
ServerAutoStart="TRUE"
ServerBindings=":80:"
ServerComment="Sitio Web predeterminado"
ServerSize="1"

IIsWebServer

(le he quitado las marcas <> para que me acepte el comentario) donde el location variará por cada sitio web que tengas en el servidor. Busca aquel en el que tienes las páginas del certificado. Introduce el nuevo parámetro CertCheckMode debajo del último parámetro, en este caso es ServerSize. Guarda el fichero, reinicia el servidor. Es posible que tarde un rato en aplicarse los cambios.

También se pueden modificar los parámetros de la metabase mediante scripting, pero no sé muy bien como se hace, tendrás que mirarlo en google.

Espero haberte sido de ayuda.

Juan Manuel dijo...

Hola Manuel.

Muchas gracias por tu ayuda. Ahora si me deja realizar una petición con un certificado sin necesidad de obtener la CLR.

Gracias!

Anónimo dijo...

¿como modifico la metabase del IIS en un IIS 5.1?

Redacción dijo...

vale, ya se como actualizar el parametro en IIS5:

abrimos una consola (cmd) y nos vamos a la carpeta /Inetpub/adminscript>

y ejecutamos el siguiente script:
cscript adsutil.vbs SET w3svc/1/CertCheckMode 1

Kiquenet dijo...

Gran artículo señor.

Ha publicado su artículo sobre cómo firmar peticiones SOAP utilizando el certificado de la FNMT con ASP.NET y C# ?

Estaba buscando información también sobre el uso de los certificados de cliente de DNI electrónico y ASP.NET.

Saludos y gracias.

Manuel Cardenas Thorlund dijo...

Buenas kique,
gracias por leer el artículo. El post sobre cómo firmar llamadas SOAP utilizando certificados digitales lo puedes encontrar en el enlace http://nidea-soluciones.blogspot.com/2008/03/firmar-una-llamada-soap-con-c-y-aspnet.html.

Espero que te guste.

Kiquenet dijo...

Señor,

cuando dice...

1. El cliente accede a la url https://.... (para la cual es necesario un certificado de cliente)

Realmente se refiere a un certificado de servidor no de cliente, no?

Es decir, para acceder a una url de tipo https:// se requiere que haya un certificado de servidor para configurar SSL ??

Saludos y gracias.

Manuel Cardenas Thorlund dijo...

correcto, efectivamente es una errata, para poder establecer un canal https con SSL es necesario un certificado de servidor. Es requisito indispensable estar en un canal seguro para poder enviar el certificado de cliente.

Kiquenet dijo...

Gracias, ya me queda claro que el certificado de servidor (https-SSL) es imprescindible para tener certificados de cliente.

En IIS de WinXP, me aparecía deshabilitado el botón Modificar, entiendo que primero hay que generar el certificado de servidor y configurarlo en IIS; y posteriormente realizar laconfiguración de los certificados de cliente.

Para el certificado de servidor he visto dos opciones:

- Utilizar un certificado de servidor existente de cualquier entidad emisora de certificados

- Generar un Certificado de Servidor con Servicios de Certificate Server de Microsoft (esto me suena achino)

Y añadiría además la forma que indica en su artículo (locualo.net, emitir nuestro propio certificado, usando para ello OpenSSL...)

Saludos y gracias.

Kiquenet dijo...

Hola,

sigo con este tema, y para generar un certificado de servidor (https-ssl) de prueba cómo lo puedo
hacer de la mejor forma posible ??

He visto en documentación que al menos existen tres formas -no sé si válidas o no-

- Comando makecert:

http://msdn.microsoft.com/es-es/library/ms751408.aspx
makecert -sr LocalMachine -ss My -n CN=ServiceModelSamples-HTTPS-Server -sky
exchange -sk ServiceModelSamples-HTTPS-Key


- Utilizar OpenSSL:
http://www.locualo.net/programacion/activar-ssl-iis-certificado-digital-prueba/00000079.aspx

- Utilizar Servicios de Microsoft Certificate Server (Microsoft Certificate
Services). Creo que sólo es para W2003,y yo desarrollo con WinXP SP3, y el
IIS del XP.
http://support.microsoft.com/kb/315588/en-us/

Otro asunto por curiosidad:
- Si me pasan un fichero .cert cómo puedo generar el certificado de servidor?

Saludos y gracias.

Manuel Cardenas Thorlund dijo...

Hola kique,
te comento, para poder montar un entorno de pruebas necesitas un windows server porque el tema de los certificados de servidor sólo funciona con Windows Server 2003, no vas a poder montarlo con Windows XP. El windows xp te servirá como cliente.

Para generar el certificado de servidor puedes seguir el tutorial de openSSL que está puesto en el artículo.

Kiquenet dijo...

Hola,

algún compañero me ha dicho que con XP si se podía, estoy confuso.

He generado el certificado de prueba con openssl y lo he configurado como certificado de Servidor.

Después hice lo de la CTL (Habilitar y Nueva CTL de IIS). Agregué desde el almacen uno que ponía FNMT Clase 2 CA, que estaba en Entidades emisoras de confianza.

Hice iisreset, y al conectarme a la página a través de https:// me aparecía este error:

HTTP 403.7 - Forbidden: Client certificate required

Yo no tengo ningún certificado de la FNMT a mi nombre...en Opciones -> Contenido -> Certificados del IExplorer, en la pestaña Personal no me aparece ningún certificado de la FNMT, pero FNMT Clase 2 CA sale en otras pestañas como Otras Personas y Entidades emisoras raíz de confianza.

Saludos y gracias por las aclaraciones.

Manuel Cardenas Thorlund dijo...

Hola kique,
lo del Windows XP no estoy seguro, si te funciona estupendo. Yo todas las pruebas las tengo hechas con Server.

Con respecto al error, ¿tienes marcada la opción "Requerir certificados de cliente" que pongo en el paso III del artículo? Si la tienes marcada, siempre te va a pedir un certificado de cliente (de la pestaña Personal). En caso de no tenerlo, no te deja pasar. Obtener un certificado de usuario de la FNMT es fácil y gratis, sólo tienes que rellenar una solicitud online y personarte en una de las dependencias oficiales.

Kiquenet dijo...

Si está marcada esa opción.
Pero yo tenía otra idea, he visto en otras webs que utilizan https con FNMT, que al conectarse a la página, les aparecía un cuadro de diálogo en IExplorer para seleccionar un certificado de una lista, y ahí si le aparecía el certificado personal de la FNMT que el usuario podía elegir.

Por eso tengo esa confusión, que no aparezca ningún cuadro de diálogo para elegir, aunque luego la lista no muestre ningún certificado, pero si que salga ese cuadro de diálogo.

Saludos y gracias por todas las aportaciones.

Manuel Cardenas Thorlund dijo...

Buenas kique,
en principio te debería salir la ventana (no se si en el caso que no tengas ninguno no te aparece). Si has seguido los pasos del post, sobre todo lo del tema de la confianza (tu explorador debe confiar también en el certificado del servidor) debería funcionar.

Kiquenet dijo...

Hola,

cuando comentas "(tu explorador debe confiar también en el certificado del servidor)", qué significa realmente ?

Tengo que instalar de alguna forma a través del IE (que apareza en la pestaña Personal de Opciones -> Contenido -> Certificados), el certificado de servidor que hemos generado con openssl (ver el enlace de locualo) ??

Saludos y muchíiiiiiisimas gracias !!!

Unknown dijo...

Un articulo estupendo al igual que los comentarios :) únicamente felicitarte, ya que me ha sido de muchísima utilidad.

Manuel Cardenas Thorlund dijo...

Hola kique,
lo que tiene que probar es a obtener un certificado de la FNMT para poder probar y en sus propiedades marcarlo como apto para autenticación.

Si teniendo un certificado de cliente instalado en el contenedor personal no te sale la ventana de certificados, no sé muy bien qué más puede ser.

Lo siento.

Kiquenet dijo...

Hola Manuel,

no me expliqué bien, yo tengo el certificado de FNMT Clase 2 CA, pero entiendo que es de la entidad emisora de confianza (autoridad de certificación AC). No tengo instalado en mi equipo ninguno personal de la FNMT, por eso es correcto que salga el error 403.

Sin embargo, no aparece ese cuadro de diálogo (Elegir un certificado digital. El sitio web que desea ver solicita una identificación. Elija un certificado). Tendría que aparecer vacío de certificados, pero aparecer.

Esto lo he visto en la web del ministerioi de fomento: http://www.fomento.es/MFOM/LANG_CASTELLANO/OFICINA_VIRTUAL/MARINA_MERCANTE/TITULACIONES/GESTION_EXAMENES_RECREO/ en el enlace Tramitación electrónica.

La primera vez aparece el cuadro de diálogo, las siguientes veces no (habría que cerrar la ventana -no pestañas- del IE y volver a abrir otra nueva). Yo quería saber porqué en mi caso no sale.

De todas formas, mi siguiente paso es conseguir un certificado de la FNMT personal, para seguir probando.

Saludos y gracias por todo.

Kiquenet dijo...

Hola,

la ventana de elección de certificado

http://www.megaupload.com/?d=8JDHT0UV
http://www.megaupload.com/?d=A9P6PU1W

me comentan que puede ser porque el certificado de servidor debe tener una CA reconocida (eso creo).

En mi caso no había conseguido que apareciera hasta hoy mismo. Configuré el IIS 5.0 un certificado de servidor de ipsCA, y agregué la CA raíz en el almacen de certificados del equipo (debe ser para todos los propósitos).

Si alguien puede aportar más información técnica al respecto se lo agradecería.



Por si sirve de algo para solución de error (para IIS 5.0 de Windows XP sp3)

Solución a error: HTTP 403.13 - Forbidden: Client certificate revoked

The page requires a valid client certificate

The page you are trying to view requires the use of a valid client certificate. Your client certificate was revoked, or the revocation status could not be determined. The certificate is used for authenticating you as a valid user of the resource.

HTTP 403.13 - Forbidden: Client certificate revoked

La razón de este error es que el estado de la revocación no puede ser determinado ("the revocation status could not be determined"). Se debe a que la comprobación de la lista CRL (certificate revocation list) no está configurada en el servidor web.

La solución más simpe a esto (en desarrollo) es deshabilitar la comprobación CRL.

Se puede utilizar una herramienta para modificar la Metabase de IIS (por ejemplo IIS Metabase Explorer) o el comando adsutil, o si no están instaladas estas herramientas se puede utilizar un script VBScript de esta forma:

Crear un fichero VBScript con el siguiente código:

Set oWeb = GetObject("IIS://localhost/W3SVC")
oWeb.CertCheckMode = 1
oWeb.SetInfo
Set oWeb = Nothing

Guardar el fichero como .vbs, por ejemplo c:\turnoffcrlcheck.vbs. Ejecutar el script en la línea de comandos, por ejemplo: cscript.exe turnoffcrlcheck.vbs. No es necesario reiniciar IIS.

Como se cita anteriormente, también podemos utilizar alguna herramienta para modificar la Metabase de IIS (teniendo en cuenta que son diferentes entre versiones de IIS: 5.0, 6.0, 7.0-7.5) como Metabase Editor (MetaEdit).



Referencias:
http://support.microsoft.com/kb/248058
http://geekswithblogs.net/TimH/archive/2006/06/12/81553.aspx
MetaEdit 2.2 para IIS 5.0: http://support.microsoft.com/kb/232068/es
Adsutil: http://support.microsoft.com/kb/240225/

Kiquenet dijo...

Hola de nuevo,

gracias por todos los comentarios que han sido de muchísima utilidad.

Al parecer la aplicación que tenemos configurada, con mucho esfuerzo, en desarrollo para utilizar certificados de cliente de DNIe, va a ser pasada a Preproducción, y me han surgido una serie de dudas. En desarrollo tenemos Windows 2003 como servidor, IIS 6.0.

- Para utilizar certificados de cliente, ¿ es obligatorio que el sitio web sea (sí o sí) https-SSL ? Por las pruebas que hemos hecho parece que si, si no requerimos SSL no pide el certificado de DNIe al cliente, pero quería confirmarlo.

- Para el error 403.13 se comentaba que en desarrollo la solución es deshabilitar la comprobación CRL. Pero si estamos en un entorno de producción o preproducción, ¿cuál sería la solución óptima?, ¿cómo sep uede configurar el IIS para realizar la comprobación de la lista CRL.

- Y por último, ¿qué permisos mínimos requeriría un usuario del AppPool de la aplicación web? Intuyo que necesita permisos para acceder a la lista de CRL, a la metabase de IIS... pero cómo puedo establecer esos permisos, alguna referencia útil me vendría bien, estoy algo perdido en esos temas.

Saludos y muchísimas gracias.

Manuel Cardenas Thorlund dijo...

Buenas kiquenet,
para lo primero, sí, https es imprescindible.
Para lo segundo, aquí en España, para poder acceder a la lista de revocación hay que hablar con CERES, la empresa que lleva los certificados FNMT y pagar para que te den ese servicio. La otra opción, es (como se hace en desarrollo) desactivar la comprobación.
La tercera pregunta no la entiendo muy bien. En principio, no necesitas permisos para nada, solamente configurar bien el certificado raiz en el servidor y ya está.

Kiquenet dijo...

Muchas gracias, Manuel.

No utilizamos FNMT en este caso, pero me interesa saber para el caso general cómo configurar el IIS para realizar la comprobación de la lista CRL.

Para FNMT hay que tratar con CERES, para otros tipos de certificados no sé.

Lo que no comprendo bien es el concepto de lista de revocación (CRL); ¿será una lista de certificados, que de alguna forma habrá que instalar o configurar en el IIS?.

Me refería por ejemplo si utilizo el usuario Network Service para el AppPool o cualquier otro usuario del dominio o de la máquina que tenga permisos mínimos.

Saludos y muchas gracias.

Kiquenet dijo...

Para aclarar mejor mi pregunta,

The CertCheckMode property enables or disables Certificate Revocation List (CRL) checking. When CertCheckMode is set to a value greater than 0 (CertCheckMode>0), the CRL does not search for certificates that have been revoked. When CertCheckMode is equal to 0 (CertCheckMode=0), the CRL searches for certificates that have been revoked.


La frase clave, "...the CRL searches for certificates that have been revoked."

Lo que quisiera saber es cómo la CRL "busca" certificados que han sido revocados. ¿Cómo es ese proceso?,¿cómo se configura el w2003 para ello?, etcétera.

Espero que así quede más claro mi duda, y muchas gracias.

Saludos.

Manuel Cardenas Thorlund dijo...

Buenas kiquenet,
la lista de certificados revocados la lleva el que emite los certificados. Al incluir en los certificados de confianza del servidor el certificado raiz de la entidad emisora, se incluye la información de la lista de revocación. Cuando el servidor solicita un certificado de cliente, mira en su lista de entidades de confianza y, si encuentra el certificado de la entidad, intenta contactar con ella para interrogarle sobre el certificado en cuestión.

Kiquenet dijo...

Hola, muchas gracias por las aclaraciones.

Mis dudas van en relación a lo que comentas: "...mira en su lista de entidades de confianza y, si encuentra el certificado de la entidad, intenta contactar con ella para interrogarle sobre el certificado en cuestión."

¿Cómo "contacta" con la entidad de certificación?

¿alguna referencia explicando todo el proceso?

¿Qué protocolo utiliza ?

¿Hay que abrir puertos en el firewall-router si estamos en una red interna ??

Creo que para los certificados de DNIe no se conecta a la entidad.

Para la FNMT, según comentabas en los comentarios, es necesario conectarse (¿alguna referencia explicando todo el proceso?) al servidor de la FNMT, para poder acceder a la lista de revocación, y hay que pagar para que te den ese servicio (tratar con CERES).

Saludos y muchas gracias.

Manuel Cardenas Thorlund dijo...

Hola kiquenet,
siento no serte de ayuda porque no sé cómo funciona internamente el proceso. Habría que mirar en el firewall qué protocolo y qué puerto se están intentando abrir cuando en el servidor se intenta autenticar un certificado.

Con respecto a lo de CERES, lo único que puedo hacer es remitirte a su página web.

Kiquenet dijo...

Gracias por toda la ayuda.

Por si le sirve a alguien:

Nota: La lista de certificados revocados la lleva el que emite los certificados. Al incluir en los certificados de confianza del servidor el certificado raíz de la entidad emisora, se incluye la información de la lista de revocación.
Cuando el servidor solicita un certificado de cliente, mira en su lista de entidades de confianza y, si encuentra el certificado de la entidad, intenta contactar con ella para interrogarle sobre el certificado en cuestión.

Aparecía este mensaje de error en local, con Windows XP e IIS 5.1, pues se incluía también un certificado de la FNMT, y no podía realizar la comprobación de la revocación, por no estar configurada en el servidor web.
Para la validación de un certificado de la FNMT es necesario conectarse (sigo buscando alguna referencia explicando todo el proceso) al servidor de la FNMT, para poder acceder a la lista de revocación, y hay que pagar para que te den ese servicio (se debe tratar con CERES). Por eso comentaban que en desarrollo deshabilitaban esta comprobación.

Para los certificados de DNIE sólo se puede comprobar el estado de revocación del certificado a través del protocolo OCSP (comunicando con los servidores ocsp de la Policia, que es lo que hace el WebService de ipsCA, una empresa externa). No existe la posibilidad de validar directamente el estado del certificado contra una CRL.

En resumen, para validar un certificado vía OCSP es preciso atacar a un OCSP Responder que tenga información disponible sobre el estado de validez de los certificados expedidos por una determinada CA (Certificate authority). Dicho protocolo OCSP (http://tools.ietf.org/html/rfc2560) es un estándar de red muy difundido para la consulta del estado de los certificados.

Otro mecanismo de validación son las CRL (Certificate Revocation List), pero al contener información sensible, posiblemente sujeta a la ley de protección de datos personales, no se suelen publicar. Por eso, el ministerio pone a disposición del ciudadano, gratuitamente, un OCSP Responder con información sobre la plataforma de certificados del DNI electrónico, que existe bajo la URL "http://ocsp.ctpa.mityc.es".


Por tanto, el DNIe sólo permite la consulta de estado de certificado a través del protocolo OCSP (Online Certificate Status Protocol). Esto es así para mantener privadas las listas de revocación de certificados (CRLs). Sólo las autoridades permitidas por la DGP pueden acceder a tales listas para dar servicio de AV (Autoridad de Validación) del DNIe mediante OCSP.

Sugerimos que se consulte la librería BouncyCastle (http://www.bouncycastle.org/csharp/), en su versión C#, ya que incluye el tratamiento de consultas y respuestas OCSP, si bien no el protocolo de transporte. Sobre esta librería es relativamente sencillo implementar la capa de transporte de las consultas (en la mayoría de las AVs es HTTP o HTTPs).

Si alguien tiene un código de ejemplo para cliente OCSP para validar certificados de DNIe se lo agradecería.

Saludos y gracias.

Manuel Cardenas Thorlund dijo...

Gracias por tu comentario kiquenet, muy completo.

Anónimo dijo...

En la siguiente dirección encontraréis el código java para validar el DNIe usando OCSP.

https://zonatic.usatudni.es/es/aprendizaje/aprende-sobre-el-dnie/58-desarrolla-con-el-dni-electronico/210-validacion-de-certificados.html

UnIngles dijo...

Es cierto que el CRL de FNMT se debía de acceder mediante el protocolo de LDAP con URL ldap://ldapape.cert.fnmt.es/ o usando el protocolo de OCSP con el URL http://ocspap.cert.fnmt.es/ocspap/OcspResponder.

Los probé a los dos y a mí me falla la validación con mi certificado resultando en un mensaje de certificado desconocido - unknown.

Creo que es por razón que soy comunitario con NIE y no ciudadano con DNI - pero bueno esto solo es mi teoría.

La Junta de Andalucía pone a la disposición de sus ciudadanos el CRL de FNMT mediante el URL ldap://crl.juntadeandalucia.es:1705 – este no lo he probado, pero creo que me sucedería el mismo resultado.

El CRL escrito como parte del certificado digital FNMT claramente no existe. Se puede sencillamente comprobar con una petición de DNS.

Es una porquería de certificado. Podría ser diez veces más útil con un CRL correcto y en un buen estado de operación, pero no lo es, por política, aunque lo pagamos nosotros.

Bueno, para los que quieran experimentar, usando el paquete Open Source de OpenSSL:

Convertir tu certificado FNMT desde formato .cer a formato .pem:

openssl x509 -inform der -in certificado.cer -out certificado.pem

Bajarse el certificado raíz de FNMT desde:

http://www.cert.fnmt.es/content/pages_std/certificados/FNMTClase2CA.cer

(Después conviértelo a formato .pem)

Comprobar vuestro certificado FNMT sin CRL:

openssl verify -CAfile fnmtclase2ca.pem tucertificado.pem

(Debe de dar OK)

Comprobar vuestro certificado FNMT con CRL:

openssl verify -CAfile fnmtclase2ca.pem -crl_check tucertificado.pem

(Fallara por razón del CRL)

Revisar certificado:

openssl x509 -in tucertificado.pem -text -noout

Verificar revocación de certificado con protocolo OSCP:

openssl ocsp -issuer fnmtclase2ca.pem -cert tucertificado.pem -url http://ocsp.dnielectronico.es/ -resp_text –respout resp.der

(Podéis usar cualquier URL de OCSP que queréis comprobar)

Si podéis dar con un método de comprobar el estado de revocación a un certificado FNMT sería muy útil. Os deseo suerte.

UnIngles dijo...

Ademas este enlace peude que sea utíl

https://zonatic.usatudni.es/es/aprendizaje/aprende-sobre-el-dnie/58-desarrolla-con-el-dni-electronico/216-crl-y-ocsp.html

eLogin dijo...

elogin.es - Incorpora en tu web el acceso mediante login con DNI electrónico y certificados digitales de FNMT, de manera rápida y sencilla a través de su API. Da igual la tecnología de servidor que utilices, elogin se adapta todo tipo de web y tecnología. Evita la contratación de costosos servidores, engorrosas configuraciones y certificados SSL.
eLogin lo hace por ti.

Unknown dijo...

Hola,

Tengo un problema en un Server 2008 R2 al configurar la entidad certificadora tal y como dice el artículo. Efectivamente me aparece dicho certificado y en las propiedades le marco la autenticación cliente. El problema es que pasado un tiempo (unos días), la configuración vuelve a sus valores por defecto, dejándome los clientes si poderse autenticar con sus certificados FNMT ¿qué puede estar pasando?

Manuel Cardenas Thorlund dijo...

Buenas Nono,
tenemos un proyecto en el que nos hemos encontrado de vez en cuando con ese problema y, en nuestro caso, ha sido debido, bien a actualizaciones del sistema operativo o a reinicios del servidor. Parece ser que se vuelve a una configuración incial. En nuestro caso, cada vez que ha pasado (te hablo de dos o tres veces al año), hemos vuelto a reconfigurarlo.

Unknown dijo...

Gracias Manuel,

En nuestro caso nos está pasando a diario. Yo ya había detectado que al reiniciar ocurría. Preguntaré al cliente si está reiniciando el servidor diariamente.

Gracias de nuevo por la información.

Manuel Cardenas Thorlund dijo...

He escrito un pequeño artículo en el que explico como desactivar la CRL en IIS para los certificados de la FNTM.

Podéis verlo en la dirección http://www.nidea-soluciones.com/index.php/desactivar-la-comprobacion-de-la-lista-de-revocacion-de-certificados-de-la-fnmt-en-iis/

Ahí es donde voy a seguir escribiendo los artículos.

Unknown dijo...

oi,
Um grande artigo de fato e uma análise muito detalhada, realista e soberba, desta questão, muito agradável escrever-se, Obrigado.
Certificados de servidor

Manuel Cardenas Thorlund dijo...

Muito obrigado Carolina pro seu comentario. Mude de endereço e pode me seguir no seguinte:

Meu site