Crear, configurar, firmar, validar e instalar certificado SSL (https)

Uno de los temas más importantes y relevantes para un desarrollador de sistemas bajo plataformas web es la seguridad, principalmente proteger los datos que son enviados mediante formularios, ya sean contraseñas, datos de tarjetas de crédito entre otros, para lograr este objetivo existe lo que llamamos certificados de seguridad “Secure Sockets Layer” SSL.

La idea principal de esta publicación es comprender como se crean los certificados de seguridad SSL, como se generan y validan, del mismo modo enseñar a firmar certificados desde nuestra propia empresa validadora.

Prólogo

Imaginemos que somos una empresa privada online donde nuestros clientes, mediante un nombre de usuario y contraseña, ingresan a nuestra plataforma para acceder a nuestros servicios, se da por hecho que el desarrollo de nuestros sistemas está bien realizado y sin riesgos de seguridad, como desarrolladores web publicamos nuestro sitio en un servidor normal Apache (Puerto 80), en este punto tenemos funcionando nuestro sistema y donde está correctamente desarrollado podemos asumir que, en términos de seguridad, todo estará bien… lamentablemente esto no es precisamente cierto, no basta solo con tener una sólida programación en nuestros sistemas, existe una vulnerabilidad que es externa a nuestra capacidad de desarrollo, este nicho se encuentra en la propia red, resulta que existe la posibilidad de que otras personas puedan observar todo el tráfico entrante y saliente de una forma muy fácil, de este modo se pueden obtener por terceros los datos enviados por el usuario a través de los formularios en nuestra plataforma incluyendo contraseñas e incluso datos mas sensibles como tarjetas de crédito.

SSL – Secure Sockets Layer

La forma correcta de solucionar estos problemas de seguridad es implementando SSL, lo cual en palabras sencillas, consiste en dos cosas.

– A pesar de que no podemos evitar que un tercero pueda observar el tráfico de una red, a través de SSL podemos encriptar la información siendo el servidor el único que tiene la llave mágica para entender los datos que se envían, de este modo creamos una conexión segura entre el cliente y servidor.

– SSL es un certificado de confianza y nos indica que el sitio que visitas es precisamente quien dice ser, es por esto que existe un listado de empresas confiables en nuestros navegadores.

Por defecto un servidor web trabaja en SSL mediante el puerto 443, aunque esto se puede cambiar, lo cual será un tema para posteriores publicaciones.

CA Certificate Authority (Autoridad Certificadora)

Existen muchas guías y manuales que explican el funcionamiento general de muchas formas, nosotros intentamos explicar del modo mas sencillo posible. Una Autoridad Certificadora es una empresa digital encargada de validar los certificados, es quien firma y certifica que nuestro sitio web es precisamente quien dice ser, las empresas mas conocidas tienen la gran ventaja que la mayoría de los navegadores aceptan sus firmas, recordamos que la idea principal de esta publicación es que nosotros seamos una empresa que firma certificados, pero donde no estamos incorporados en los navegadores por defecto nos aparecerá una advertencia al inicio, cabe señalar que las firmas de certificados online tienen valores que van desde los 20 dólares hasta incluso superar los 800 dólares anuales.

Método de funcionamiento

El servidor posee un certificado de seguridad y pone a disposición del cliente algo que se llama “llave pública” que permite al cliente encriptar la información, entonces:

– El cliente recibe la llave pública y el navegador comprueba que el certificado está firmado por un empresa de confianza, osea verifica que el sitio web es quien precisamente dice ser, si nosotros somo la empresa certificadora debemos indicar al navegador que somos de confianza (Se toma el tema mas adelante).

– El cliente encripta la información con la llave pública, de este modo la envía al servidor y aunque esta sea interceptada, solo el servidor puede entenderla.

– El servidor desencripta la información y la usa.

Nuestra empresa certificadora CA

Al menos dos veces destaqué que al tener nuestra propia empresa certificadora, por defecto no se encuentra en la lista de empresas en nuestros navegadores, entonces ¿Cual es la ventaja de hacer una empresa?, bueno la gran ventaja es la seguridad, ya que a pesar de todo siempre la información estará encriptada y protegida, en el caso de instituciones o empresas que manejan intranet a nivel local, bastaría con instalar los certificados individuales en los clientes y de este modo ahorrarnos la compra del servicio.

Sistema y requisitos

Debo señalar que las pruebas se realizaron en un servidor con Centos 7, aunque los pasos se deben aplicar a cualquier versión de linux.

Para comenzar a trabajar se debe tener instalado el paquete openssl y comprobar su estado con la siguiente instrucción.

openssl version


Instalación inicial

Comenzamos creando un directorio de trabajo que asignemos para nuestra empresa, en mi caso “PERSONAL” yo lo creo en /root/CuackCA/, dentro de esta carpeta debemos crear una para las llaves publicas (certificados) y privadas (privado), luego ingresamos a la carpeta “CuackCA”.

Ahora creamos dos documentos de texto que tendrán la función de almacenar un contador (contador) y la base de datos de nuestros certificados (resgistro).


Archivo de configuración

A continuación dejo el archivo de configuración que ocupamos, dejando abierta la posibilidad de que cualquier persona pueda modificar las opciones a su propio gusto, al respecto existe mucha información en la red, luego guardamos el archivo en nuestra carpeta de trabajo como “openssl.cfg”.


Nuestros Archivos

A continuación hacemos un resumen de como quedaron nuestros archivos.


Nos transformamos en una empresa certificadora

Como primer paso debemos definir una firma digital (contraseña), la idea es que esta sea muy difícil y que obviamente debe estar muy limitado el acceso a ella, solo en este caso en particular, a modo de enseñar, publicaremos la nuestra, está será la firma de nuestra nueva empresa certificadora, en nuestro caso generamos una aleatoria desde internet.

Pj=qyLaUJRjjKyqx-eW+cm-Z$%*aJ{V!4B8H.tPC4%;4Dd*VzYWQW!x]Z+eQ

Recomendamos que sea en este nivel de dificultad, así aseguramos que sea casi imposible encontrar mediante fuerza bruta.

Como segundo paso vamos a generar un certificado autofirmado el cual nos validará como empresa cerficadora, para ello ejecutaremos la siguiente orden:

openssl req -new -x509 -extensions v3_ca -keyout privado/cakey.pem -out cacert.pem -days 3650 -config openssl.cfg

req -new -x509 —> Crear un certificado nuevo autofirmado.
-extensions v3_ca —> Crear un certificado raíz CA.
-keyout —> Nombre y donde guardará la llave privada.
-out —> Nombre del certificado raíz CA.
-days 3650 —> El certificado será válido por 3650 días (10 años).
-config —> Archivo de configuración a utilizar.

En este paso hemos generado dos archivos, un certificado de raíz “cacert.pem” y una llave privada “cakey.pem” que se encuentra en la carpeta “privado”, con esto ya podemos decir que tenemos armada nuestra empresa.

Ahora mostramos ambos archivos.

NOTA: Lo siguiente solo es de carácter informativo, ya que la llave privada jamás se tiene que revelar.


Solicitud de firma de certificado

En este punto tenemos un certificado que nos valida como CA, aunque solo para nosotros, ya tenemos nuestra empresa funcionando y comenzaremos a firmar.

Para poder firmar un certificado necesitamo un CSR (Certificate Signing Request), que es un archivo que contiene un solicitud de fima.

Para generar un CSR (Certificate Signing Request) debemos ejecutar la siguiente instrucción:

openssl req -new -nodes -out CSR_ejemplo.pem -config openssl.cfg

En este paso se han generado dos nuevos archivos, el primero guardado como CSR_ejemplo.pem, que es precisamente nuestro CSR, además se ha generado la llave privada del certificado guardada como “key.pem”, este último archivo es el que necesita la servidor para entender la información que recibe, por ningún motivo tiene que estar a disposición de un externo o persona que no sea de confianza, recordamos que en este momento no está firmado el certificado pero podemos observar en detalle del CSR con la siguiente instrucción:

openssl req -in CSR_ejemplo.pem -text -verify -noout

Ahora procedemos a firmar el certificado.

openssl ca -out Ejemplo_Firmado.pem -config openssl.cfg -days 3650 -infiles CSR_ejemplo.pem

En este paso ya tenemos firmado el certificado, entonces el sistema creó el archivo Ejemplo_Firmado.pem que es nuestro certificado con firma, que ahora mostramos en detalle.

Bien, hagamos un pequeño ordenamiento de todo lo que hemos hecho, tenemos el archivo “CSR_ejemplo.pem”, que es nuestro certificado sin firma, tenemos “Ejemplo_Firmado.pem” que es nuestro certificado firmado, tenemos “key.pem” que es nuestra llave privada, estos tres archivos corresponden al primer certificado que como empresa certificadora creamos, ahora recordemos que los archivos “cacert.pem” y “privado/cakey.pem” son las llaves públicas y privadas de nuestra empresa certificadora, “openssl.cfg” es nuestro archivo de configuración, nuestro archivo “contador” que inicialmente estaba en “01” ahora esta de la siguente forma:

Nuestro archivo registro quedó así:

Y de este modo cada vez que firmemos un certificado se incrementará el contador y se agregará el registro del certificado que firmamos.

Ordenando nuestros archivos

Primero que nada ya no necesitamos la solicitud de firma CSR, ya que tenemos el certificado firmado, por lo tanto podemos eliminar sin problemas el archivo “CSR_ejemplo.pem”, ahora agregamos a la carpeta “certificados” el certificado firmado y su llave, lo renombramos para mantener un orden desde el inicio, en mi caso los llamaré “001_cer_ejemplo.cuack.org.pem” y “001_key_ejemplo.cuack.org.pem”, onviamente cada uno coloca el nombre que mas desee.

Para finalizar esta etapa mostramos a continuación nuestro certificado firmado y ordenado con la siguiente instrucción:


Configurando nuestro servidor web Apache

Ahora corresponde probar nuestro certificado en un servidor web con Apache, primero que nada tenemos nuestro servidor web funcionando normal, en mi caso con el siguiente archivo de configuración:

Ingresé un documento html con el texto “Hola Mundo” para verificar su funcionamiento.

Ahora guardamos el certificado y la llave privada en nuestro servidor, obviamente en una carpeta ajena a la web, en mi caso los copio en “/home/prueba/”.

Agregamos las siguientes lineas:

SSLEngine on
SSLCertificateFile /home/prueba/001_cer_ejemplo.cuack.org.pem
SSLCertificateKeyFile /home/prueba/001_key_ejemplo.cuack.org.pem

Modificando el puerto de 80 a 443, entonces nuestro archivo de configuración quedaría así:

En muy importante resaltar que esta configuración no reemplaza la anterior, sino que es una nueva, esto quiere decir que debería seguir funcionando bien el servidor normal por el puerto 80, ahora reiniciamos el servidor y probamos nuestro certificado.

Lo siguiente puede sonar raro, pero si les sale este error, es por que todo está funcionando bien, en este punto el navegador reconoce el certificado, pero no nos reconoce como entidad firmadora, entonces ahora tenemos que hacer clic en “Avanzado”.

Luego en “Añadir excepción…” y confirmamos en la siguiente ventana.

Y listo ya tenemos nuestro certificado y nuestro sitio web trabajando sobre ssl.

Mostramos el certificado a través del navegador.

Lo mismo pero en Chrome.

Cada navegador tiene la opción de agregar los certificados de manera permanente, basta con eso para que no tengamos probelmas al ingresar, espero que esta publicación sea de utilidad, cualquier duda estamos para contestar.

Para aquellos “curiosos” después de realizar esta prueba hemos bajado el dominio ejemplo.cuack.org … no faltan los “curiosos”…

Muchas Gracias.

Deja un comentario

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