Cómo crear un certificado digital para pasar una web a HTTPS (SSL/TLS) y cifrar el tráfico, aportando mayor seguridad en las comunicaciones. Utilizaremos un certificado creado por nosotros y estableceremos el protocolo HTTPS, como acceso por defecto para nuestro sitio web en Apache y Linux Ubuntu. Mostramos los tipos de certificados para sitios web: validación ampliada (EV SSL), SSL OV y validación de dominio (DV SSL).

Necesidad de pasar de HTTP a HTTPS, a SSL/TLS y cifrar las comunicaciones

El protocolo HTTP (por el puerto 80 habitualmente) no cifra las comunicaciones. Si tenemos un sitio web con HTTP, cualquier atacante podría escuchar el tráfico entre el cliente (equipo con un navegador web) y el servidor (equipo con servicio web tipo Apache, Nginx, Tomcat u otros) y ver su contenido, sin apenas esfuerzo.

Desde hace un tiempo, los motores de búsqueda como Google, Yahoo, Bing y otros, penalizan las webs HTTP, colocándolas en lugares inferiores en el posicionamiento, considerando que HTTP es un protocolo totalmente inseguro.

Por ello, se hace cada vez más necesario pasar a HTTPS, de forma que el tráfico entre cliente y servidor viaje cifrado.

Mediante HTTPS (habitualmente por el puerto 443) se establece un túnel TLS (antes SSL) entre el equipo servidor (que contiene el servicio web) y el equipo cliente (que realiza la petición). Este túnel se realiza mediante el establecimiento de un certificado digital.

Dejamos una pequeña definición de SSL, TLS y HTTPS, para aclarar posibles dudas:

  • SSL (Secure Sockets Layer): tecnología estandarizada que permite cifrar el tráfico de datos entre un navegador web y un sitio web (o entre dos servidores web), protegiendo así la conexión. Este mecanismo de seguridad en la conexión impide que un atacante malintencionado pueda ver o interceptar la información que se transmite desde un punto a otro.
  • TLS (Transport Layer Security): versión actualizada y más segura de SSL. Actualmente, se sigue nombrando TLS como SSL, aunque no es así, TLS es una actualización mejorada de SSL.
  • HTTPS (HyperText Transfer Protocol Secure): cuando aparecen las letras HTTPS al principio de la dirección web (URL) de un sitio web, indican que dicho sitio está protegido por un certificado SSL o TLS. Prácticamente todos los navegadores web actuales (Mozilla Firefox, Microsoft Edge, Google Chrome, Safari, Opera, Brave, Falkon, etc.), suelen mostrar, en la barra de direcciones, un icono de un candado, indicando que se trata de un sitio web con conexión cifrada. En muchos de los navegadores, haciendo clic en el icono, se puede consultar información sobre el certificado empleado: fecha de caducidad, autoridad emisora, nombre de la empresa propietaria del sitio web, tipo de cifrado SSL/TLS, etc. Por ejemplo, en el caso de Google Chrome, mostrará un icono a la izquierda de la URL del sitio web con SSL/TLS:
Necesidad de pasar de HTTP a HTTPS, a SSL/TLS y cifrar las comunicaciones

Pulsando en «El certificado es válido» podremos obtener información del certificado:

Necesidad de pasar de HTTP a HTTPS, a SSL/TLS y cifrar las comunicaciones

En el caso de Microsoft Edge, también mostrará un icono a la izquierda:

Cuando el certificado ha expirado o está mal configurado/instalado, al acceder al sitio web mediante un navegador, podemos obtener estos avisos:

Firefox ha detectado un problema y no ha continuado a sitioweb.com. El sitio web está mal configurado o el reloj de su ordenador está configurado de manera incorrecta. Probablemente el certificado del sitio ha expirado, lo que impide a Firefox conectarse de forma segura. Si visita este sitio, los atacantes pueden intentar robar información como sus contraseñas, correos o datos de la tarjeta de crédito.

Necesidad de pasar de HTTP a HTTPS, a SSL/TLS y cifrar las comunicaciones

En caso de no tener certificado y usar HTTP, los navegadores avisarán con una advertencia de que el tráfico no viaja cifrado y puede ser peligroso:

No está conectado de forma segura a este sitio. Su conexión a este sitio no es privada. La información que envíe podría ser vista por otros (como contraseñas, mensajes, tarjetas de crédito, etc.).

Necesidad de pasar de HTTP a HTTPS, a SSL/TLS y cifrar las comunicaciones

Por todo ello, es muy recomendable usar un certificado y cifrar el tráfico (usar HTTPS en lugar de HTTP) en nuestros servidores web.

Tipos de certificados para sitios web

Existen varios tipos de certificados para sitios web:

  • Certificado con validación ampliada (EV SSL): la Autoridad de Certificación (AC) comprueba el derecho del solicitante a usar el nombre del dominio en cuestión y, además, realiza un proceso de inspección de la organización estricto. El proceso de emisión de los certificados EV SSL está perfectamente definido en las Directrices sobre EV, ratificadas formalmente por el Foro de Navegadores y Autoridades de Certificación en 2007.
  • Certificados SSL OV (OV SSL): la Autoridad de Certificación comprueba el derecho del solicitante a usar un nombre de dominio específico. No se inspecciona la identidad de la empresa y únicamente se muestra la información encriptada al hacer clic sobre el Sello de Página Segura.
  • Certificados SSL con validación de dominio (DV SSL): la Autoridad de Certificación (AC) comprueba el derecho del solicitante a usar el nombre del dominio en cuestión. No se inspecciona la información relativa a la identidad de la empresa y no se muestra ningún dato más allá de la información de cifrado incluida en el Sello de Sitio Seguro. Aunque la información estará cifrada, no se puede garantizar quién recibe la información en el otro extremo.

Debido a la rapidez de la expedición y al precio, el tipo de certificado habitualmente más usado es el DV SSL. En el ejemplo de este artículo, usaremos un certificado autofirmado, que generaremos nosotros mismos, sin ninguna Autoridad de Certificación oficial. Este tipo de certificados sirve para sitios web de pruebas y para Intranets y sitios web que no serán públicos, de uso interno, dado que, si bien el tráfico se cifrará, mostrarán en el navegador una aviso.

Requisitos para pasar una web de HTTP a HTTPS en Linux y Apache

Necesitaremos disponer de un servidor web en Apache (el proceso es similar para un servidor web con Nginx) sobre sistema operativo Linux Ubuntu. El proceso que explicaremos es, de todas formas, similar para otras distribuciones de Linux.

En los siguientes artículos explicamos cómo montar un servidor web con Apache sobre Linux:

Lo ideal es disponer de un certificado adquirido, al menos de tipo DV SSL, pero en el caso de este artículo, dado que se trata de una prueba y un entorno de pre-producción, usaremos un certificado autofirmado que generaremos nosotros mismos (sin una Autoridad de Certificación oficial).

Deberemos disponer de acceso SSH al servidor web con Linux Ubuntu (o cualquier otra distribución) y un usuario con privilegios de administrador, para poder generar e instalar el certificado y configurar Apache (o Nginx) para permitir la conexión SSL/TLS por HTTPS.

Instalar/Actualizar OpenSSL en Linux Ubuntu y habilitar módulo SSL en Apache

Revisaremos que tenemos la última versión de OpenSSL en nuestro servidor web Apache con Linux Ubuntu. Es recomendable actualizar a la última versión disponible. En primer lugar, ejecutaremos el siguiente comando (desde la consola de shell de Linux del servidor web Apache), para actualizar la lista de paquetes:

Y, posteriormente, actualizaremos el paquete OpenSSL, que suele venir instalado por defecto, con el comando:

Si hay una versión más reciente, nos pedirá confirmación para instalarla:

Instalar/Actualizar OpenSSL en Linux Ubuntu y habilitar módulo SSL en Apache

A continuación, habilitaremos el módulo SSL en Apache, con el comando:

Que devolverá:

Habilitaremos el fichero de configuración por defecto para SSL, con el comando:

Que devolverá:

Reiniciaremos el servicio de Apache para aplicar los cambios, con el comando:

Instalar/Actualizar OpenSSL en Linux Ubuntu y habilitar módulo SSL en Apache

Generar certificado SSL/TLS autofirmado en Linux

En este caso, crearemos un certificado para un sitio web real: comunidadbiker.com, que actualmente usa HTTP y que pasaremos a HTTPS.

En primer lugar, crearemos el certificado que necesitamos para establecer el cifrado de la información en el protocolo HTTPS. Crearemos previamente una carpeta en el equipo Linux servidor web Apache, donde guardaremos el certificado creado, para ello, ejecutaremos los siguientes comandos (para crear la carpeta y para acceder a ella):

La crearemos donde deseemos, en nuestro caso en la carpeta del usuario /home/alonso.

Para crear el certificado y su clave privada, desde la carpeta creada, ejecutaremos el siguiente comando (estableciendo una caducidad de un año):

El comando anterior es interactivo, nos realizará las siguientes preguntas para crear el certificado:

  • [1] Country Name (2 letter code) [AU]: introduciremos las dos letras identificativas del país, en nuestro caso «SP» (Spain).
  • [2] State or Province Name (full name) [Some-State]: introduciremos el estado o provincia, por ejemplo «Madrid».
  • [3] Locality Name (eg, city): introduciremos la localidad, por ejemplo «Las Rozas».
  • [4] Organization Name (eg, company) [Internet Widgits Pty Ltd]: introduciremos el nombre de la compañía, por ejemplo «Comunidad Biker».
  • [5] Organizational Unit Name (eg, section): si queremos, introduciremos la sección, podremos dejar el mismo nombre que la compañía «Comunidad Biker».
  • [6] Common Name (e.g. server FQDN or YOUR name): este valor sí es importante, dado que debe coincidir con el nombre del dominio, en nuestro caso, «comunidadbiker.com». Si no tenemos un dominio, introduciremos aquí la dirección IP del servidor web.
  • [7] Email Address: una dirección de correo electrónico de contacto. Si el sitio web es público, introduciremos una dirección de mail que pueda exponerse públicamente, dado que los clientes que conecten a la web y obtengan los datos del certificado, podrán ver esta dirección de correo electrónico.
Generar certificado SSL/TLS autofirmado en Linux

Una vez introducidos los datos, el comando «openssl» habrá generado dos ficheros:

  • comunidadbiker.crt: fichero con el certificado autofirmado.
  • comunidadbiker.key: fichero con la clave privada (que debemos almacenar siempre el lugar seguro).
Generar certificado SSL/TLS autofirmado en Linux

Estableceremos los permisos para los dos ficheros creados, con los comandos:

Configuración de servidor web Apache para permitir el uso de SSL/TLS HTTPS

Realizaremos la configuración necesaria en Apache para que, a partir de ahora, use HTTPS (SSL/TLS) con el certificado creado. Suponemos que se está usando la opción de VirtualHost de Apache (Server Blocks de Nginx), por lo que editaremos el fichero VirtualHost del sitio web que queremos establecer a HTTPS, con el comando:

Añadiremos las siguientes líneas (para una configuración básica):

Guardaremos los cambios pulsando «Control» + «O» y cerraremos la edición pulsando «Control» + «X».

En el fichero anterior, hemos indicando que se active el SSL/TLS para las peticiones que nos lleguen por el puerto 443, para el sitiow web comunidadbiker.com, enviando las peticiones a la carpeta /var/www/comunidadbiker que es la que contendrá los ficheros del sitio web. En este fichero, indicamos también los tres parámetros importantes:

  • SSLEngine: a valor «on».
  • SSLCertificateFile: indicaremos en este parámetro la ruta y nombre del fichero con el certificado generado.
  • SSLCertificateKeyFile: indicaremos en este parámetro la ruta y nombre del fichero con la clave privada del certificado generado.

Comprobaremos que la sintaxis introducida en los ficheros de configuración de Apache es correcta, con el comando:

Si es correcta devolverá:

Syntax OK

En caso de algún problema, por ejemplo si no hemos habilitado el módulo SSL en Apache, devolverá:

Para aplicar los cambios en el servidor web Apache, reinicaremos el servicio con el comando:

Comprobar que el certificado SSL/TLS funciona correctamente

Desde otro equipo con Linux, desde la consola shell de comandos, podremos comprobar que el sitio web HTTPS funciona correctamente, ejecutando el siguiente comando:

Nos devolverá todos los datos del certificado SSL/TLS, indicando que el tráfico es cifrado:

Comprobar que el certificado SSL/TLS funciona correctamente

Si accederemos desde un navegador web, nos mostrará una aviso, dado que, como hemos comentado al inicio del artículo, el certificado que usamos es autofirmado y no validado por una Autoridad de Certificación, por ello, al acceder desde un navegador (sea el que sea), recibiremos esta advertencia, pero pulsando en «Avanzado»:

Comprobar que el certificado SSL/TLS funciona correctamente

Podremos continuar con la navegación al sitio web, pulsando en «Continuar a comunidadbiker.com (no seguro)» y será una navegación cifrada HTTPS:

Comprobar que el certificado SSL/TLS funciona correctamente

Pulsando en el icono del candado, nos indicará que la conexión con el sitio no es segura (por lo comentado arriba), pero en realidad, sí que está cifrada SSL/TLS. Pulsando en «Su conexión con este sitio no es segura»:

Comprobar que el certificado SSL/TLS funciona correctamente

Y pulsando en el icono del certificado:

Comprobar que el certificado SSL/TLS funciona correctamente

Comprobaremos que, efectivamente, la información viaja cifrada y podremos consultar los datos del certificado autofirmado que hemos generado y usado en nuestro sitio web:

Comprobar que el certificado SSL/TLS funciona correctamente