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

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1 — Habilitaciónmod_ssl
  • Paso 2: Creación del certificado TLS
  • Paso 3: Configuración de Apache para utilizar TLS
  • Paso 4: redireccionamiento de HTTP a HTTPS
  • Conclusió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 opensslherramienta 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:

      1. sudo apt update

      Luego, instala el apache2paquete:

      1. sudo apt install apache2

      Y por último, si tienes un ufwfirewall configurado, abre los puertos httpy https:

      1. 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_sslcon el a2enmodcomando:

    1. sudo a2enmod ssl

    Reinicie Apache para activar el módulo:

    1. sudo systemctl restart apache2

    El mod_sslmó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 opensslcomando:

    1. 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. La rsa:2048parte 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 Virtualhostconfigurado y solo necesita agregarle TLS, probablemente deba copiar las líneas de configuración que comienzan con SSLy cambiar el VirtualHostpuerto de 80a 443. Nos ocuparemos del puerto 80en el siguiente paso).

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

    1. 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 ServerNamelí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 Nameeligió al crear el certificado.

    Las líneas restantes especifican un DocumentRootdirectorio 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 DocumentRootarchivo HTML y colocarlo en él solo para fines de prueba:

    1. sudo mkdir /var/www/your_domain_or_ip

    Abra un nuevo index.htmlarchivo con su editor de texto:

    1. 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 a2ensiteherramienta:

    1. sudo a2ensite your_domain_or_ip.conf

    A continuación, probemos si hay errores de configuración:

    1. 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 ServerNamedirectiva no está configurada globalmente. Si quieres deshacerte de ese mensaje, puedes configurar ServerNameel 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 OKcontiene, su archivo de configuración no tiene errores de sintaxis. Podemos volver a cargar Apache de manera segura para implementar nuestros cambios:

    1. 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 80y 443:

    1. sudo ufw allow "Apache Full"

    A continuación agregaremos otra VirtualHostsecció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 VirtualHostpara 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:

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

    En la parte inferior, crea otro VirtualHostbloque para que coincida con las solicitudes en el puerto 80. Usa la ServerNamedirectiva para que coincida nuevamente con tu nombre de dominio o dirección IP. Luego, usa Redirectpara 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:

    1. sudo apachectl configtest
    2. 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 .

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

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

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion