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.
- Tipos de certificados para sitios web.
- Requisitos para pasar una web de HTTP a HTTPS en Linux y Apache.
- Instalar/Actualizar OpenSSL en Linux Ubuntu y habilitar módulo SSL en Apache.
- Generar certificado SSL/TLS autofirmado en Linux.
- Configuración de servidor web Apache (Nginx) para permitir el uso de SSL/TLS HTTPS.
- Comprobar que el certificado SSL/TLS funciona correctamente.
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:
Pulsando en «El certificado es válido» podremos obtener información del certificado:
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.
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.).
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:
- Montar servidor web Apache y servidor MySQL con Linux CentOS 7 Minimal.
- Instalar Apache en Rocky Linux 8 y convertirlo en servidor web.
- Instalar Linux Ubuntu Server 13.04 servidor web con Tomcat, Apache, PHP y MySQL.
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:
1 |
apt-get update |
Y, posteriormente, actualizaremos el paquete OpenSSL, que suele venir instalado por defecto, con el comando:
1 |
apt-get upgrade openssl |
Si hay una versión más reciente, nos pedirá confirmación para instalarla:
A continuación, habilitaremos el módulo SSL en Apache, con el comando:
1 |
a2enmod ssl |
Que devolverá:
1 2 3 4 |
Enabling module ssl. See /usr/share/doc/apache2.2-common/README.Debian.gz on how to configure SSL and create self-signed certificates. To activate the new configuration, you need to run: service apache2 restart |
Habilitaremos el fichero de configuración por defecto para SSL, con el comando:
1 |
a2ensite default-ssl |
Que devolverá:
1 2 3 |
Enabling site default-ssl. To activate the new configuration, you need to run: service apache2 reload |
Reiniciaremos el servicio de Apache para aplicar los cambios, con el comando:
1 |
service apache2 reload |
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):
1 2 |
mkdir /home/alonso/certificados cd /home/alonso/certificados |
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):
1 |
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout comunidadbiker.key -out comunidadbiker.crt |
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.
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).
Estableceremos los permisos para los dos ficheros creados, con los comandos:
1 2 |
chmod 600 /home/alonso/certificados/comunidadbiker.crt chmod 600 /home/alonso/certificados/comunidadbiker.key |
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:
1 |
nano /etc/apache2/sites-enabled/comunidadbiker.com.conf |
Añadiremos las siguientes líneas (para una configuración básica):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<VirtualHost *:443> DocumentRoot /var/www/comunidadbiker ServerName comunidadbiker.com SSLEngine on SSLCertificateFile /home/alonso/certificados/comunidadbiker.crt SSLCertificateKeyFile /home/alonso/certificados/comunidadbiker.key <Directory /var/www/comunidadbiker> AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> |
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:
1 |
apachectl configtest |
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á:
1 2 3 4 5 |
[Mon Nov 13 21:01:06 2023] [error] (EAI 2)Name or service not known: Could not resolve host name *.443 -- ignoring! Syntax error on line 49 of /etc/apache2/sites-enabled/comunidadbiker.com.conf: Invalid command 'SSLCertificateFile', perhaps misspelled or defined by a module not included in the server configuration Action 'configtest' failed. The Apache error log may have more information. |
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:
1 |
openssl s_client -connect comunidadbiker.com:443 |
Nos devolverá todos los datos del certificado SSL/TLS, indicando que el tráfico es cifrado:
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»:
Podremos continuar con la navegación al sitio web, pulsando en «Continuar a comunidadbiker.com (no seguro)» y será una navegación cifrada HTTPS:
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»:
Y pulsando en el icono del certificado:
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: