Creando tu propia Autoridad Certificadora (CA)

En esta entrada os voy a explicar para qué sirve una autoridad certificadora y como podemos crear una propia. Como siempre sin mucho rollo y al grano. Que no se enfade nadie por las incorrecciones teóricas, pero no es el objetivo de esta entrada ser teóricamente correcto, sino 100% práctico.

Una autoridad certificadora (en adelante CA, de Certificate Authority) es una entidad emisora de certificados digitales. Y ¿para qué sirve un certificado digital? Básicamente para validar documentos y para cifrar comunicaciones. Esta segunda utilidad es la que vamos a ver en esta entrada.

Los certificados están compuestos por dos partes, una, la clave privada que sirve para cifrar lo que enviamos, y la clave pública que sirve para que otros cifren lo que nos quieren enviar. Muchas veces a la clave privada se la llama clave (o key en inglés) y a la clave pública, se la llama certificado (certificate en inglés). La clave privada no la deberemos desvelar jamás ya que cualquiera que la tuviera se podría hacer pasar por nosotros (por nuestro servidor web seguro, o incluso por nuestra CA).

¿Cómo sabemos que un certificado es válido? Fácil, porque alguien en quien confiamos nos dice que ese certificado es valido, es decir, alguien le ha puesto su firma indicándonos que es válido. Esa es la utilidad de la CA.

Cuando estamos navegando por Internet, y accedemos a cualquier página por HTTPS, quiere decir que esa web utiliza un certificado. ¿Como sabe nuestro navegador que ese certificado es válido? Pues porque cuando nos instalamos el navegador, también se instala una lista de certificados (en realidad son solo sus claves públicas) de autoridades certificadoras en las que se confía (Verisign, FNMT, Go Daddy, Entrust…).

Entonces tenemos el siguiente escenario: la autoridad certificadora (CA) crea un certificado (clave pública y clave privada) firmado por ella misma, y lo vende a una empresa para que lo use en su servidor web para cifrar las comunicaciones usando HTTPS.

Imaginaos ahora que queréis montar un servidor web seguro y queréis usar HTTPS, o compráis un certificado a una CA oficial pagando el dineral que valen u os creáis una propia… La misma situación la tenemos para montar un servidor de correo seguro, para montar uno MQTT con certificados, o simplemente para crear una VPN que use certificados. La única pega es que tendréis que instalar el certificado (la clave pública) de vuestra CA en todos los equipos que vayan a usar sus certificados, o cada vez que se haga uso os aparecerá el molesto mensaje de que se están usando certificados emitidos por una CA en la que no se confía.

En mi caso, tengo un servidor web, varios túneles VPN, un servidor MQTT y varios servidores SSH. Ya me estoy cansando de tantas contraseñas. Necesito una CA para emitir certificados para todos, que las comunicaciones se cifren, y que todo esté centralizado y sea fácil de administrar. Vamos a ello.

Estructura de directorios y fichero de configuración

Usaremos OpenSSL para crear toda la infraestructura de la autoridad, y todos los certificados, bajo Ubuntu.

Lo primero es crear la estructura de directorios adecuada y el archivo de configuración principal, para ello ejecutamos:

creamos el archivo /etc/CA/openssl.cnf con el siguiente contenido:

 

En la sección  [req_distinguished_name] podemos encontrar algunos parámetros por defecto interesantes como son: countryName_default, stateOrProvinceName_default y 0.organizationName_default, que deberíamos ajustar con nuestros valores personalizados.

Las secciones [v3_ca], [v3_intermediate_ca], [usr_cert], [server_cert] y [ocsp] definen los valores por defecto de los distintos tipos de certificados que vamos a poder crear más adelante.

Creación de la clave privada y el certificado raíz de la CA

Ahora podemos crear la pareja de claves. Primero la clave privada de la CA:

Ahora podemos crear el certificado raíz (clave pública) de la CA usando la clave privada anterior:

Podemos verificar el certificado recien creado con el comando:

A partir de este momento ya podemos crear certificados para nuestros servidores (MQTT, SSH, HTTPS, …) y para autenticar clientes (moviles, clientes VPN, …).

 

Asegurando nuestro servidor web Apache2

Como primer ejemplo vamos a crear un par de claves privada y publica (key & certificate) para usar con Apache2 y permitir el trafico HTTPS usando nuestra flamante CA. Primero creamos la clave privada:

El segundo paso es crear la petición formal de certificado:

Finalmente, nuestra CA firma la petición de certificado anterior y se genera el certificado del servidor web, válido 5 años (1825 días):

Una ves que ya tenemos la clave privada, la publica y el certificado de la CA tenemos que ir a nuestro archivo donde se define el virtualhost del servidor y añadir las directivas:

Asegurando Mosquitto (MQTT)

De la misma forma podemos asegurar nuestro servidor mosquitto (MQTT):

Una vez que tenemos los ficheros generados, los copiamos al servidor junto con el certificado de la CA y modificamos el fichero de configuración de mosquitto para espeficarle las nuevas rutas de los tresarchivos:

Certificados de usuario

Si lo que queremos es autenticar algún usuario mediante un certificado, por ejemplo, que nuestro servidor web requiera que el usuario que accede se identifique mediante certificado, el procecimiento es exactamente el mismo que para crear los certificados de servidor, pero cambiando en el comando openssl la parte -extensions server_cert por -extensions usr_cert.

Si lo que vamos a hacer es instalar el certificado de usuario en un navegador, necesitaremos el fichero P12 o PFX, que no es más que la clave privada, la pública y el certificado del servidor todo en uno. Para generarlo usamos el siguiente comando:

El comando anterior nos pide una clave de exportación (‘1234‘), que mas tarde nos pedirá el navegador para realizar la importación.

A partir de ahora cada vez que necesitemos un certificado, iremos a nuestro servidor que tenga la CA configurada, emitiremos uno nuevo, lo llevamos donde corresponda y listo.

Espero que os sirva para tener más organizado vuestro sistema 🙂

Comentarios

  1. Por Eduardo

    Responder

    • Por José María

      Responder

      • Por Beto Bautista

        Responder

        • Por José María

          Responder

Deja un comentario

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