SSL Mutal – Como usar un certificado como validación

¡Hola a todos!

Se ha presentado un cliente con unas necesidades específicas de seguridad en una página web. Lo que quiere es que el acceso fuera restringido por aquellas personas que tuvieran un certificado válido X.

Para aquellos que no me hayan entendido lo que haremos en este caso es lo que hace la agencia tributaria de España.

Es decir, si quieres ver tus datos de hacienda/personales/etc … tienes que tener un certificado válido con la FNMT y tenerlo configurado en tu navegador (ya que te lo va a solicitar). Si es correcto te permite el acceso a tu área privada y sino fallará.

En realidad lo único que necesitas es tener un certificado y su CA para poder validar que el certificado con el que entras se le permite el acceso.

Os vamos a enseñar como realizar estas funciones con certificados autofirmados y luego os explicaremos como se realizaría si tuviéramos los certificados intermedios.


Lo ideal es empezar en un directorio en concreto, en mi caso usaré «/etc/certificados».

Creando nuestra agencia certificadora (autofirmada)

# Creamos el CRT y la KEY de nuestra CA
openssl req -newkey rsa:2048 -nodes -keyform PEM -keyout selfsigned-ca.key -x509 -days 3650 -outform PEM -out selfsigned-ca.crt

Datos que solicitará, lo podemos rellenar con lo que queramos aunque si pone la información bien mejor 🙂

Country Name (2 letter code) [AU]: 
State or Province Name (full name) [Some-State]: 
Locality Name (eg, city) []: 
Organization Name (eg, company) [Internet Widgits Pty Ltd]: 
Organizational Unit Name (eg, section) []: 
Common Name (e.g. server FQDN or YOUR name) []: 

Con esto generamos 2 ficheros:

  • KEY de nuestra CA (selfsigned-ca.key)
  • CERTIFICADO de nuestra CA (selfsigned-ca.crt)

Creando nuestro certificado y firmándolo

Ahora lo que haremos es generar nuestro CSR para luego poder firmarlo con nuestra CA que hemos creado:

# Generamos una nueva KEY y un CSR
openssl genrsa -out selfsigned.key 2048
openssl req -new -key selfsigned.key -out selfsigned.csr

Con esto generamos 2 nuevos ficheros:

  • KEY de nuestro CSR (selfsigned.key)
  • CSR de nuestro certificado (selfsigned.csr)

Ahora el último paso que nos queda es validar este certificado con la CA que hemos creado anteriormente.

openssl x509 -req -in selfsigned.csr -CA selfsigned-ca.crt -CAkey selfsigned-ca.key -set_serial 100 -days 365 -outform PEM -out selfsigned.crt

Al firmar nos saldrá unos parámetros de confirmación:

Signature ok
subject=C = ES, ST = Madrid, L = Madrid, O = MIWEBENLARED, OU = Internet
Getting CA Private Key

Exportando a p12

Este certificado nos permitirá importarlo en un navegador para tener acceso al área que estamos habilitando.

# Generamos un BUNDLE para importar en nuestro navegador
openssl pkcs12 -export -inkey selfsigned-cli.key -in selfsigned-cli.crt -out selfsigned-cli.p12

Nos pedirá una contraseña y su validación

Enter Export Password:
Verifying - Enter Export Password:

¿Qué hemos conseguido con esto?

Ahora ya tenemos el fichero selfsigned.crt el cual estará validado para 1 año con nuestra CA autofirmada.

Con esto terminaríamos la parte de la configuración como si fuera un certificado normal para nuestra página web, pero lo usaremos como personal para acceder.


Configurando Autenticación Mutal (SSL Mutual)

Actualmente ya tenemos el certificado para poder validarnos, el último punto que nos queda es configurarlo en nuestro servidor Apache.

Es recomendable crear un certificado por cada cosa que necesitemos. Por ejemplo 1 certificado por cada usuario o 1 certificado por cada web.


Configurando Apache

Como ya hemos terminado todos los pasos previos a su creación ahora nos toca dar el siguiente paso y es configurarlo en nuestro servidor web Apache.

Este es un ejemplo de configuración que he realizado:

SSLEngine on
SSLCertificateFile /etc/certificados/crt-valido-mi-dominio.crt
SSLCertificateKeyFile /etc/certificados/key-valida-mi-dominio.key

SSLCACertificateFile /etc/certificados/ca-valida-mi-dominio.ca
SSLCACertificateFile /etc/certificados/ca-autofirmado/selfsigned-ca.crt

SSLVerifyClient require
SSLVerifyDepth 10
  • SSLEngine: Habilita el SSL
  • SSLCertificateFile: Nuestro certificado, generalmente uno que valga para todo internet ya sea letsencrypt (gratis) o una agencia certificadora.
  • SSLCertificateKeyFile: La KEY con la que generamos nuestro certificado.
  • SSLCACertificateFile: Los ficheros intermedios que componen nuestro certificiado. En este caso hemos usado 2, 1 el oficial de nuestro certificado y otro el que vamos a usar para validar nuestro autofirmado.
  • SSLVerifyClient: Lo que nos permite solicitar el acceso, los parámetros lo podemos ver la documentación oficial de Apache.
  • SSLVerifyDepth: El nivel que miraremos para aceptar la validación frente a nuestra CA. Más información en la web oficial de Apache.

Tenéis un enlace en cada uno de los parámetros que envía a la documentación oficial, así podéis ver el ámbito o contexto donde lo podéis aplicar.

Es evidente que si todo ha ido bien vamos a comprobar la configuración y luego reiniciar Apache.

apachectl -t
service apache2 restart

Configurar a nivel de cliente

¿Os acordáis cuando creamos el bundle para importarlo en nuestro navegador? pues bien es momento de usarlo y estamos listos para ello. Nuestro archivo lo llamamos selfsigned-cli.p12 y además le habíamos puesto una contraseña.

Lo único que haremos sera importarlo en nuestro navegador, por ejemplo en chrome:

Configuración > Gestionar Certificados  (lo buscamos en su buscador) > En la pestaña personal, pinchamos sobre Importar ...

Pulsamos en la última pantalla Finalizar (ya que es un resumen de lo que hemos hecho).

Comprobando el funcionamiento

Si todo ha ido bien nos queda la parte «divertida» o aquella que nos da la satisfacción de una configuración correcta, «la comprobación».

Lo único que tenemos que hacer es navegar a la URL que hemos configurado y directamente nos preguntará por nuestro certificado si tenemos +1 de uno instalado.

Creo que en el caso de que haya solo 1 te lo cogerá por defecto.

Si las pruebas han ido bien podrás ver la página web y sino te dará un fallo con el certificado.

Las pruebas las realicé de esa manera con un navegador (Chrome) y también con una ventana en Incógnito.

Deja un comentario

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