Cómo crear un certificado SSL autofirmado para Apache en Ubuntu 20.04

Introducción

TLS, o “seguridad de capa de transporte”, y su predecesor SSL, son protocolos utilizados para envolver el tráfico normal en un envoltorio protegido y cifrado. Usando esta tecnología, los servidores pueden enviar de forma segura información a sus clientes sin que sus mensajes sean interceptados o leídos por una parte externa.

En esta guía, le mostraremos cómo crear y usar un certificado SSL autofirmado con el servidor web Apache en Ubuntu 20.04.

Nota: Un certificado autofirmado cifrará la comunicación entre su servidor y cualquier cliente. Sin embargo, dado que no está firmado por ninguna de las autoridades certificadoras de confianza incluidas con los navegadores web y los sistemas operativos, los usuarios no pueden usar el certificado para validar la identidad de su servidor de forma automática. Como resultado, sus usuarios verán un error de seguridad cuando visiten su sitio.

Debido a esta limitación, los certificados autofirmados no son apropiados para un entorno de producción que sirve al público. Normalmente, se utilizan para probar o para asegurar servicios no críticos utilizados por un solo usuario o un pequeño grupo de usuarios que pueden confiar en la validez del certificado a través de canales de comunicación alternativos.

Para obtener una solución de certificado más preparado para la producción, consulte Let’s Encrypt, una autoridad de certificado gratuita. Puede aprender a descargar y configurar un certificado Let’s Encrypt en nuestro tutorial Cómo proteger Apache con Let’s Encrypt en Ubuntu 20.04.

Requisitos previos

Antes de iniciar este tutorial, necesitará lo siguiente:

  • Acceso a un servidor Ubuntu 20.04 con un usuario no root sudo habilitado. Nuestra guía de configuración inicial de servidor con Ubuntu 20.04 puede mostrarle cómo crear esta cuenta.
  • También deberá tener Apache instalado. Puede instalar Apache usando apt. Primero, actualice el índice de paquetes locales de modo que se refleje cualquier cambio anterior:
  • sudo apt update

A continuación, instale el paquete apache2:

  • sudo apt install apache2

Y, por último, si tiene un firewall ufw configurado, abra los puertos http y https:

  • sudo ufw allow "Apache Full"

Una vez que haya completado estos pasos, asegúrese de haber iniciado sesión como usuario no root y continúe con el tutoria.

Paso 1: Habilitar mod_ssl

Antes de poder utilizar cualquiera de los certificados SSL,primero se debe habilitar mod_ssl, un módulo de Apache que proporciona soporte para el cifrado SSL.

Habilite mod_ssl con el comando a2enmod:

  • sudo a2enmod ssl

Reinicie Apache para activar el módulo:

  • sudo systemctl restart apache2

Ahora está habilitado el módulo mod_ssl y listo para su uso.

Paso 2: Crear el certificado SSL

Ahora que Apache está listo para usar cifrado, podemos continuar y generar un nuevo certificado SSL. El certificado almacenará información básica sobre su sitio, y estará acompañado de un archivo de claves que permite al servidor manejar de forma segura datos cifrados.

Podemos crear la clave SSL y los archivos de certificado con el comando openssl:

  • sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

Tras introducir el comando, aparecerá un mensaje donde puede introducir información sobre su sitio web. Antes de abordar eso, observemos lo que sucede en el comando que emitimos:

  • openssl: es la herramienta de línea de comandos para crear y administrar certificados, claves y otros archivos de OpenSSL.
  • req -x509: especifica que deseamos usar la administración de la solicitud de firma de certificados (CSR) X.509. El “X.509” es un estándar de infraestructura de claves públicas al que se adhieren SSL y TLS para la administración de claves y certificados.
  • -nodes: indica a OpenSSL que omita la opción para proteger nuestro certificado con una frase de contraseña. Necesitamos que Apache pueda leer el archivo, sin intervención del usuario, cuando se inicie el servidor. Una frase de contraseña evitaría que esto suceda porque tendríamos que introducirla tras cada reinicio.
  • -days 365: esta opción establece el tiempo durante el cual el certificado se considerará válido. En este caso, lo configuramos por un año. Muchos navegadores modernos rechazarán cualquier certificado válido por más de un año.
  • -newkey rsa:2048: especifica que deseamos generar un nuevo certificado y una nueva clave al mismo tiempo. No creamos la clave que se requiere para firmar el certificado en un paso anterior, por lo que debemos crearla junto con el certificado. La parte rsa:2048 le indica que cree una clave RSA de 2048 bits de extensión.
  • -keyout: esta línea indica a OpenSSL dónde colocar el archivo de clave privada generado que estamos creando.
  • -out: indica a OpenSSL dónde colocar el certificado que creamos.

Complete las solicitudes de forma adecuada. La línea más importante es la que solicita Common Name. Debe introducir el nombre de host que utilizará para acceder al servidor o a la IP pública del servidor. Es importante que este campo coincida con lo que pondrá en la barra de direcciones de su navegador para acceder al sitio, ya que un error de concordancia causará más errores de seguridad.

La lista completa de las instrucciones tendrá un aspecto similar a este:

Country Name (2 letter code) [XX]:US State or Province Name (full name) []:Example Locality Name (eg, city) [Default City]:Example  Organization Name (eg, company) [Default Company Ltd]:Example Inc Organizational Unit Name (eg, section) []:Example Dept Common Name (eg, your name or your server's hostname) []:your_domain_or_ip Email Address []:[email protected] 

Los dos archivos que creó se ubicarán en los subdirectorios correspondientes en /etc/ssl.

A continuación, actualizaremos nuestra configuración Apache para usar el nuevo certificado y la clave.

Paso 3: Configurar Apache para usar SSL

Ahora que tenemos nuestro certificado y la clave autofirmados disponibles, debemos actualizar nuestra configuración Apache para usarlos. En Ubuntu, puede colocar nuevos archivos de configuración de Apache (deben terminar en .conf) en /etc/apache2/sites-available/y se cargarán la próxima vez que se vuelva a cargar o reiniciar el proceso Apache.

Para este tutorial, crearemos un nuevo archivo de configuración mínimo. (Si ya tiene un Apache <Virtualhost> configurado y solo necesita agregarle SSL, probablemente deberá copiar las líneas de configuración que comienzan con SSL, y cambiar el puerto VirtualHost de 80 a 443. Nos encargaremos del puerto 80 en el siguiente paso).

Abra un nuevo archivo en el directorio /etc/apache2/sites-available:

  • sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

Pegue la siguiente configuración mínima VirtualHost:

/etc/apache2/sites-available/your_domain_or_ip.conf

<VirtualHost *:443>    ServerName your_domain_or_ip    DocumentRoot /var/www/your_domain_or_ip     SSLEngine on    SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt    SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key </VirtualHost>  

Asegúrese de actualizar la línea ServerName a la que desea que se dirija su servidor. Puede ser un nombre de host, un nombre de dominio completo o una dirección IP. Asegúrese de que lo que elija coincida con Common Name que eligió al crear el certificado.

Las líneas restantes especifican un directorio DocumentRoot para que sirva los archivos, y las opciones SSL necesarias para apuntar Apache a nuestro certificado y clave recién creados.

Ahora vamos a crear nuestro DocumentRoot y ponemos un archivo HTML en él solo para fines de prueba:

  • sudo mkdir /var/www/your_domain_or_ip

Abra un nuevo archivo index.html con su editor de texto:

  • sudo nano /var/www/your_domain_or_ip/index.html

Pegue lo siguiente en el archivo en blanco:

/var/www/your_domain_or_ip/index.html

<h1>it worked!</h1> 

Esto no es un archivo HTML completo, por supuesto, pero los navegadores son indulgentes y bastará para verificar nuestra configuración.

Guarde y cierre el archivo. A continuación, debemos habilitar el archivo de configuración con la herramienta a2ensite:

  • sudo a2ensite your_domain_or_ip.conf

A continuación, realizaremos una prueba para ver que no haya errores de configuración:

  • sudo apache2ctl configtest

Si la operación se completa de forma correcta, obtendrá un resultado similar a este:

OutputAH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message Syntax OK 

La primera línea es un mensaje que le indica que la directiva ServerName no está configurada a nivel global. Si quiere deshacerse de ese mensaje, puede establecer ServerName en el nombre de dominio o la dirección IP de su servidor en /etc/apache2/apache2.conf. Esto es opcional, ya que el mensaje no causará problemas.

Si el resultado contiene Syntax OK, en su archivo de configuración no habrá errores de sintaxis. Podemos volver a cargar Apache de forma segura para implementar nuestros cambios:

  • sudo systemctl reload apache2

Ahora cargue su sitio en un navegador, asegurándose de usar https:// al principio.

Debería ver un error. Esto es normal para un certificado autofirmado. El navegador le advierte que no puede verificar la identidad del servidor, porque nuestro certificado no está firmado por ninguna de sus autoridades de certificado conocidas. Para fines de prueba y uso personal, puede estar bien. Debería poder hacer clic en avanzada o más información y elegir continuar.

Una vez que lo haga, su navegador cargará el mensaje it worked! (¡funcionó!).

Nota: si su navegador no se conecta en absoluto al servidor, asegúrese de que su conexión no está siendo bloqueada por un firewall. Si utiliza ufw, los siguientes comandos abrirán los puertos 80 y 443:

  • sudo ufw allow "Apache Full"

A continuación, añadiremos otra sección VirtualHost a nuestra configuración para que sirva las solicitudes HTTP sencillas y las redirija a HTTPS.

Paso 4: Redirigir HTTP a HTTPS

Actualmente, nuestra configuración solo responderá a las solicitudes HTTPS en el puerto 443. Es una buena práctica responder también en el puerto 80, incluso si quiere forzar que se cifre todo el tráfico. Configuraremos un VirtualHost para que responda a estas solicitudes no cifradas y las redireccione a HTTPS.

Abra el mismo archivo de configuración Apache que iniciamos en pasos anteriores:

  • sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

En la parte inferior, cree otro bloque VirtualHost para que coincida con las solicitudes en el puerto 80. Utilice la directiva ServerName para que coincida de nuevo con su nombre de dominio o su dirección IP. A continuación, utilice Redirect para que coincida con cualquier solicitud y las envíe al VirtualHost SSL. Asegúrese de incluir la barra de arrastre:

/etc/apache2/sites-available/your_domain_or_ip.conf

<VirtualHost *:80>     ServerName your_domain_or_ip     Redirect / https://your_domain_or_ip/ </VirtualHost> 

Guarde y cierre este archivo cuando haya terminado, y vuelva a probar la sintaxis de configuración y a cargar Apache:

  • sudo apachectl configtest
  • sudo systemctl reload apache2

Puede probar la nueva funcionalidad de redireccionamiento visitando su sitio con http:// simple delante de la dirección. Debería redireccionarse a https:// automáticamente.

Conclusión

Ahora ha configurado Apache para que sirva las solicitudes cifradas usando un certificado SSL autofirmado, y para redireccionar las solicitudes HTTP no cifradas a HTTPS.

Si planea usar SSL para un sitio web público, debería pensar en comprar un nombre de dominio y usar una autoridad de certificado ampliamente compatible, como Let’s Encrypt.

Para obtener más información sobre el uso de Let’s Encrypt con Apache, consulte nuestro tutorial Cómo proteger Apache con Let’s Encrypt en Ubuntu 20.04.