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

Introducción
TLS , o “seguridad de la capa de transporte”, y su predecesor SSL , son protocolos que se utilizan para envolver el tráfico normal en un contenedor protegido y cifrado. Con esta tecnología, los servidores pueden enviar información de forma segura a sus clientes sin que sus mensajes sean interceptados o leídos por un tercero.
En esta guía, creará y utilizará un certificado TLS autofirmado con el servidor web Apache en Ubuntu 22.04. Utilizará la openssl
herramienta de línea de comandos para crear el certificado y, luego, configurará Apache para usarlo.
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 de certificación de confianza incluidas en los navegadores web y los sistemas operativos, los usuarios no pueden utilizar el certificado para validar la identidad de su servidor automáticamente. 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 brinde servicios al público. Por lo general, se utilizan para realizar pruebas o para proteger 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 preparada para la producción, consulte Let’s Encrypt , una autoridad de certificación 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 22.04 .
Prerrequisitos
Antes de comenzar este tutorial, necesitarás lo siguiente:
-
Acceso a un servidor Ubuntu 22.04 con un usuario que no sea root y que tenga habilitado sudo. Nuestra guía Configuración inicial del servidor con Ubuntu 22.04 puede mostrarle cómo crear esta cuenta.
-
También necesitará tener instalado Apache. Puede instalar Apache mediante
apt
. Primero, actualice el índice de paquetes local para reflejar los últimos cambios en el servidor:- sudo apt update
Luego, instala el
apache2
paquete:- sudo apt install apache2
Y por último, si tienes un
ufw
firewall configurado, abre los puertoshttp
yhttps
:- sudo ufw allow "Apache Full"
Una vez completados estos pasos, asegúrese de haber iniciado sesión como usuario no root y continúe con el tutorial.
Paso 1 — Habilitaciónmod_ssl
Antes de poder utilizar cualquier certificado TLS, primero deberá habilitar mod_ssl
, un módulo de Apache que proporciona soporte para el cifrado SSL.
Habilitar mod_ssl
con el a2enmod
comando:
- sudo a2enmod ssl
Reinicie Apache para activar el módulo:
- sudo systemctl restart apache2
El mod_ssl
módulo ahora está habilitado y listo para usar.
Paso 2: Creación del certificado TLS
Ahora que Apache está listo para usar el cifrado, podemos pasar a generar un nuevo certificado TLS. El certificado almacenará información básica sobre su sitio y estará acompañado de un archivo de clave que permite al servidor manejar de forma segura los datos cifrados.
Podemos crear los archivos de clave y certificado TLS con el openssl
comando:
- sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
Después de ingresar el comando, aparecerá un mensaje en el que podrá ingresar información sobre su sitio web. Antes de analizarlo, veamos qué sucede en el comando que estamos ejecutando:
openssl
:Esta es la herramienta de línea de comandos para crear y administrar certificados, claves y otros archivos OpenSSL.req -x509
:Esto especifica que queremos utilizar la gestión de solicitudes de firma de certificados (CSR) X.509. X.509 es un estándar de infraestructura de clave pública que TLS respeta para la gestión de claves y certificados.-nodes
:Esto le indica a OpenSSL que omita la opción de proteger nuestro certificado con una frase de contraseña. Necesitamos que Apache pueda leer el archivo, sin la intervención del usuario, cuando se inicia el servidor. Una frase de contraseña evitaría que esto suceda, ya que tendríamos que ingresarla después de cada reinicio.-days 365
: Esta opción establece el período de tiempo durante el cual se considerará válido el certificado. Aquí lo establecemos en un año. Muchos navegadores modernos rechazarán cualquier certificado que tenga una validez superior a un año.-newkey rsa:2048
: Esto especifica que queremos 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. Larsa:2048
parte le indica que cree una clave RSA de 2048 bits de longitud.-keyout
:Esta línea le dice a OpenSSL dónde colocar el archivo de clave privada generado que estamos creando.-out
:Esto le dice a OpenSSL dónde colocar el certificado que estamos creando.
Complete las indicaciones de forma adecuada. La línea más importante es la que solicita el Common Name
. Debe ingresar el nombre de host que usará para acceder al servidor o la IP pública del servidor. Es importante que este campo coincida con lo que ingrese en la barra de direcciones de su navegador para acceder al sitio, ya que una falta de coincidencia provocará más errores de seguridad.
La lista completa de indicaciones se verá así:
Country Name (2 letter code) [XX]:USState or Province Name (full name) []:ExampleLocality Name (eg, city) [Default City]:Example Organization Name (eg, company) [Default Company Ltd]:Example IncOrganizational Unit Name (eg, section) []:Example DeptCommon Name (eg, your name or your server's hostname) []:your_domain_or_ipEmail Address []:webmaster@example.com
Ambos archivos que ha creado se colocarán en los subdirectorios apropiados en /etc/ssl
.
A continuación actualizaremos nuestra configuración de Apache para utilizar el nuevo certificado y clave.
Paso 3: Configuración de Apache para utilizar TLS
Ahora que tenemos nuestro certificado y clave autofirmados disponibles, necesitamos actualizar nuestra configuración de Apache para usarlos. En Ubuntu, puedes 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 de Apache.
Para este tutorial, crearemos un nuevo archivo de configuración mínima. (Si ya tiene un Apache Virtualhost
configurado y solo necesita agregarle TLS, probablemente deba copiar las líneas de configuración que comienzan con SSL
y cambiar el VirtualHost
puerto de 80
a 443
. Nos ocuparemos 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 de VirtualHost:
/etc/apache2/sitios-disponibles/su_dominio_o_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 ServerName
línea con la dirección que desee asignar a 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 lo que Common Name
eligió al crear el certificado.
Las líneas restantes especifican un DocumentRoot
directorio desde donde servir los archivos y las opciones TLS necesarias para apuntar Apache a nuestro certificado y clave recién creados.
Ahora vamos a crear nuestro DocumentRoot
archivo HTML y colocarlo en él solo para fines de prueba:
- sudo mkdir /var/www/your_domain_or_ip
Abra un nuevo index.html
archivo 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/tu_dominio_o_ip/index.html
h1it worked!/h1
Este no es un archivo HTML completo, por supuesto, pero los navegadores son indulgentes y será suficiente para verificar nuestra configuración.
Guardar y cerrar el archivo A continuación, debemos habilitar el archivo de configuración con la a2ensite
herramienta:
- sudo a2ensite your_domain_or_ip.conf
A continuación, probemos si hay errores de configuración:
- sudo apache2ctl configtest
Si todo sale bien, obtendrás un resultado parecido a esto:
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 messageSyntax OK
La primera línea es un mensaje que te indica que la ServerName
directiva no está configurada globalmente. Si quieres deshacerte de ese mensaje, puedes configurar ServerName
el nombre de dominio o la dirección IP de tu servidor en /etc/apache2/apache2.conf
. Esto es opcional, ya que el mensaje no causará ningún daño.
Si su salida Syntax OK
contiene, su archivo de configuración no tiene errores de sintaxis. Podemos volver a cargar Apache de manera segura para implementar nuestros cambios:
- sudo systemctl reload apache2
Ahora cargue su sitio en un navegador, asegurándose de usarlo https://
desde el principio.
Debería aparecer un error. ¡Esto es normal en el caso de un certificado autofirmado! El navegador le advierte que no puede verificar la identidad del servidor, ya que nuestro certificado no está firmado por ninguna de las autoridades de certificación conocidas. Para fines de prueba y uso personal, esto puede ser adecuado. Debería poder hacer clic en la opción avanzada o en más información y elegir continuar.
Después de hacerlo, su navegador cargará el it worked!
mensaje.
Nota: si su navegador no se conecta al servidor, asegúrese de que su conexión no esté bloqueada por un firewall. Si está utilizando ufw
, los siguientes comandos abrirán los puertos 80
y 443
:
- sudo ufw allow "Apache Full"
A continuación agregaremos otra VirtualHost
sección a nuestra configuración para atender solicitudes HTTP simples y redirigirlas a HTTPS.
Paso 4: redireccionamiento de 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 desea forzar que todo el tráfico esté cifrado. Configuremos un VirtualHost
para responder a estas solicitudes no cifradas y redirigirlas a HTTPS.
Abra el mismo archivo de configuración de Apache que iniciamos en los pasos anteriores:
- sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf
En la parte inferior, crea otro VirtualHost
bloque para que coincida con las solicitudes en el puerto 80
. Usa la ServerName
directiva para que coincida nuevamente con tu nombre de dominio o dirección IP. Luego, usa Redirect
para que coincida con las solicitudes y envíelas al TLS VirtualHost
. Asegúrate de incluir la barra diagonal final:
/etc/apache2/sitios-disponibles/su_dominio_o_ip.conf
VirtualHost *:80ServerName your_domain_or_ipRedirect / https://your_domain_or_ip//VirtualHost
Guarde y cierre este archivo cuando haya terminado, luego pruebe nuevamente la sintaxis de configuración y vuelva a cargar Apache:
- sudo apachectl configtest
- sudo systemctl reload apache2
Puede probar la nueva función de redireccionamiento visitando su sitio con plain http://
delante de la dirección. Debería ser redireccionado https://
automáticamente.
Conclusión
Ahora ha configurado Apache para atender solicitudes cifradas mediante un certificado TLS autofirmado y para redirigir solicitudes HTTP no cifradas a HTTPS.
Si planea utilizar TLS para un sitio web público, debería considerar comprar un nombre de dominio y utilizar una autoridad de certificación ampliamente admitida, como Let’s Encrypt .
Para obtener más información sobre el uso de Let’s Encrypt con Apache, lea nuestro tutorial Cómo proteger Apache con Let’s Encrypt en Ubuntu 22.04 .
Deja una respuesta