En una ocasión, un cliente nos solicitó que activásemos una validación de usuarios mediante certificados para una parte de un sitio web del cliente. Concretamente, el cliente deseaba utilizar los certificados de la Fabrica Nacional de Moneda y Timbre (FNMT).

Pues bien, la configuración es relativamente sencilla. Primero de todo, debemos obtener los certificados de la FNMT (o la CA en cuestión), ya sea un único .crt o un .pem

Seguidamente, en la configuración de nuestro VirtualHost para HTTPS, añadiremos una configuración similar a esta:

SSLVerifyClient none

SSLCACertificateFile /var/www/vhosts/midominio.es/public_html/certificados_fmnt/certificados_buenos_fmnt.pem

SSLSessionCacheTimeout 600

SSLOptions +StdEnvVars

<Location /ubicacion/web/usuario/>

SSLVerifyClient require

SSLVerifyDepth 5

</Location>

<Location /ubicacion/web/backend/>

SSLVerifyClient require

SSLVerifyDepth 5

</Location>

<Location /ubicacion/web/registro/>

SSLVerifyClient require

SSLVerifyDepth 5

</Location>

 

Procedo a explicar. Primeramente, añadimos la CA a nuestro virtualhost, para que Apache pueda contrastar la validez de los certificados con ella. Seguidamente, con SSLVerifyClient none, indicamos a Apache que establezca la validación en None para evitar que se valide todo el sitio web.  Después, hemos activado la validación SSL por cliente en tres ubicaciones diferentes (con Location) a través de la directiva SSLVerifyClient require, por lo que el resto de la web será libre para todo el mundo, pero cuando algún usuario intente acceder a alguna de dichas ubicaciones, se solicitará el certificado.

Como añadido, en caso de que delante de Apache tengamos un Proxy reverso como Nginx, será necesario que Nginx sepa que debe pasar en las cabeceras el certificado a Apache, de lo contrario no funcionará.

Para ello, con añadir la siguiente directiva en la configuración de Nginx, no debería haber problema.

proxy_set_header X-SSL-CERT $ssl_client_cert;

 


10 comentarios

Jorge · 03/09/2020 a las 10:56 am

Hola, estoy intentando hacer exactamenter lo que se dice en este post. Una aplicación que sea posible loguearse con dertificado del DNIe. En apache2 configuro los parámetros que aparecen pero si pongo el parámetro SSLCACertificateFile, no me pide seleccionar certificado del lector y directamente aparece el mensaje de certificado NO válido.
Si quito ese parámetro, SI me aparece la ventana para seleccionar el certificado; pero tampoco lo acepta.

El .pem o .crt de la FNMT no se de donde descargarlo. Me he descargado de la web oficial de la FNMT el .cer pero no consigo validar el certificado.

Gracias

    Daniel · 03/09/2020 a las 12:00 pm

    Buenas Jorge,

    Los Certificados de la FNMT los puedes descargar en https://www.sede.fnmt.gob.es/descargas/certificados-raiz-de-la-fnmt

    En mi caso yo descargué todos los que necesitaba y los uní en un PEM.

    Así mismo, recuerda configurar un con las partes de tu web donde debe realizarse validación, en caso de que no toda ella requiera validarse.

    Un saludo.

alfredo Sanz · 07/06/2021 a las 5:17 pm

Hola,
Lo intento pero no lo consigo.
¿Podrías explicar un poquito más cómo haces para generar el fichero .pem?

1 Saludo

    Daniel · 22/06/2021 a las 10:02 am

    Hola Alfredo,
    Dependiendo de que tipo de certificado partas, tendrás que convertirlo a formato PEM. En el caso de FMNT, los certificados vienen en formato «DER», por lo que bastaría con convertir los certificados que te interesen de «DER» a «PEM» y concatenarlos en un único fichero con extensión «PEM». Respecto al comando para convertir los certificados, en esta entrada explico los más comunes, y en concreto en el último ejemplo explico como convertir de «DER» a «PEM»
    https://tutorialeslinux.com/linux/diferentes-formatos-de-certificado-y-comandos-para-convertir-entre-ellos-openssl/

    Un saludo:

mussol · 08/04/2022 a las 12:52 pm

hola!

son necesarios todos los certificados de la pàgina que comentas?

https://www.sede.fnmt.gob.es/descargas/certificados-raiz-de-la-fnmt

hay 22 en total y supongo que bastan los que permitan validar las conexiones de apache.

sabes cuales son los imprescindibles?

    Daniel · 08/04/2022 a las 1:34 pm

    Hola!

    En principio con el certificado raíz «AC Raíz FNMT-RCM» debería ser suficiente.

    Un saludo.

Carlos · 06/01/2023 a las 12:28 am

Hola Daniel, entiendo que para que funcione correctamente, los certificados de servidor deben estar expedidos por la misma entidad que ha expedido el certificado SSLCACertificateFile.

Es decir, el SSLCertificateFile y el SSLCertificateKeyFile, en este caso en particular, deberían ser de la FNMT.

¿Es así, o me estoy perdiendo algo?

Me detecta el certificado y aparece la ventana para que lo seleccione, pero seguidamente me sale el error ERR_BAD_SSL_CLIENT_AUTH_CERT

    Daniel · 16/02/2023 a las 3:00 pm

    Buenos días,

    No, tu VHOST estará protegido con un certificado independiente que imagino no estará emitido por la FNMT, por lo que el SSLCertificateFile y SSLCertificateKeyFile que configuras en el Vhost en 443 son independientes a la validación por certificado que estás intentando configurar.

    Los que si tienen que ser emitidos por la FMNT son los certificados de cliente que tengas en tu navegador, puesto que hemos configurado que Apache valide contra la CA declarada en SSLCACertificateFile (FMNT)

Ramiro · 23/01/2023 a las 10:20 am

Me aferré a esta página con la ilusión y confianza de haber encontrado la solución al problema de petición de certificado de cliente por localización, pero no funciona. Es como si Nginx es como si anulara todas las directivas que pongo en apache.
No se si podrías echarme un cable para que funcionase en la actualidad.

    Daniel · 16/02/2023 a las 3:01 pm

    Si tienes NGINX delante como proxy inverso, configura la opción:
    proxy_set_header X-SSL-CERT $ssl_client_cert;

    Un saludo.

Responder a Daniel Cancelar la respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *