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

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Creación del certificado SSL
  • Paso 2: Configuración de Apache para utilizar SSL
    1. Creación de un fragmento de configuración de Apache con configuraciones de cifrado seguro
    2. Modificación del archivo de host virtual Apache SSL predeterminado
    3. (Recomendado) Modificar el archivo de host HTTP para redirigir a HTTPS
  • Paso 3: Ajuste del firewall
  • Paso 4: Habilitar los cambios en Apache
  • Paso 5: Prueba de cifrado
  • Paso 6: Cambiar a una redirección permanente
  • Conclusión
  • TLS, o seguridad de la capa de transporte, y su predecesor SSL, que significa capa de sockets seguros, son protocolos web utilizados para envolver el tráfico normal en un contenedor protegido y cifrado.

    Con esta tecnología, los servidores pueden enviar tráfico de forma segura entre servidores y clientes sin posibilidad de que los mensajes sean interceptados por terceros. El sistema de certificados también ayuda a los usuarios a verificar la identidad de los sitios a los que se conectan.

    En esta guía, aprenderá cómo configurar un certificado SSL autofirmado para usar con un servidor web Apache en Ubuntu 18.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 de certificación (CA) de confianza incluidas en los navegadores web, los usuarios no pueden utilizar el certificado para validar la identidad de su servidor automáticamente.

    Un certificado autofirmado puede ser adecuado si no tiene un nombre de dominio asociado a su servidor y para casos en los que no hay una interfaz web cifrada de cara al usuario. Si tiene un nombre de dominio, en muchos casos es mejor utilizar un certificado firmado por una CA. Lea más sobre cómo configurar un certificado de confianza gratuito con nuestra guía sobre Cómo proteger Apache con Let's Encrypt en Ubuntu 18.04.

    Prerrequisitos

    Para completar este tutorial, necesitarás:

    • Un servidor Ubuntu 18.04 con un usuario que no sea root configurado con sudoprivilegios y firewall habilitado. Puede configurar una cuenta de usuario de este tipo siguiendo nuestra Configuración inicial del servidor con Ubuntu 18.04
    • Un servidor web Apache instalado. Si desea instalar una pila LAMP (Linux, Apache, MySQL, PHP) completa en su servidor, puede seguir nuestra guía sobre cómo configurar LAMP en Ubuntu 18.04. Si solo desea el servidor web Apache, omita los pasos relacionados con PHP y MySQL.

    Cuando haya completado los requisitos anteriores, continúe con el siguiente paso.

    Paso 1: Creación del certificado SSL

    TLS/SSL funciona mediante una combinación de un certificado público y una clave privada. La clave SSL se mantiene en secreto en el servidor y se utiliza para cifrar el contenido enviado a los clientes. El certificado SSL se comparte públicamente con cualquier persona que solicite el contenido y se puede utilizar para descifrar el contenido firmado por la clave SSL asociada.

    Puede crear un par de claves y certificados autofirmados con un único comando OpenSSL:

    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

    Esto generará una serie de preguntas. Antes de analizarlas, repasemos lo que sucede en el comando que estás emitiendo:

    • openssl:Esta es la herramienta de línea de comandos básicos para crear y administrar certificados, claves y otros archivos OpenSSL.
    • req: Este subcomando especifica el uso de 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 SSL y TLS respetan para la gestión de claves y certificados. Para crear un nuevo certificado X.509, utilice este subcomando.
    • -x509:Esto modifica aún más el subcomando anterior al indicarle a la utilidad que cree un certificado autofirmado en lugar de generar una solicitud de firma de certificado, como sucedería normalmente.
    • -nodes:Esto le indica a OpenSSL que omita la opción de proteger el certificado con una frase de contraseña. Apache debe poder leer el archivo, sin la intervención del usuario, cuando se inicia el servidor. Una frase de contraseña evitaría que esto suceda porque los usuarios tendrían que ingresarla después de cada reinicio.
    • -days 365: Esta opción establece el período de tiempo durante el cual se considera válido el certificado. En este caso, se establece en un año.
    • -newkey rsa:2048: Esto especifica que desea generar un nuevo certificado y una nueva clave al mismo tiempo. La clave necesaria para firmar el certificado no se creó en un paso anterior, por lo que debe crearse junto con el certificado. La rsa:2048parte le indica que debe crear 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 se está creando.
    • -out:Esto le indica a OpenSSL dónde colocar el certificado que se está creando.

    Como se indicó anteriormente, estas opciones crearán un archivo de clave y un certificado. Se le harán algunas preguntas sobre su servidor para poder incorporar la información correctamente en el certificado.

    Complete las indicaciones de forma adecuada. La línea más importante es la que solicita el Common Name (e.g. server FQDN or YOUR name). Debe ingresar el nombre de dominio asociado con su servidor o, más probablemente, la dirección IP pública de su servidor.

    La lista completa de indicaciones tendrá el siguiente formato:

    OutputCountry Name (2 letter code) [AU]:USState or Province Name (full name) [Some-State]:New YorkLocality Name (eg, city) []:New York CityOrganization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.Organizational Unit Name (eg, section) []:Ministry of Water SlidesCommon Name (e.g. server FQDN or YOUR name) []:server_IP_addressEmail Address []:admin@your_domain.com

    Ambos archivos que ha creado se colocarán en los subdirectorios apropiados en /etc/ssl.

    Paso 2: Configuración de Apache para utilizar SSL

    Ha creado correctamente los archivos de clave y certificado en el /etc/ssldirectorio. Ahora, debes modificar la configuración de Apache para aprovecharlos.

    Para ello, deberás realizar algunos ajustes en la configuración:

    1. Cree un fragmento de configuración para especificar configuraciones SSL predeterminadas y seguras.
    2. Modifique el archivo de host virtual Apache SSL incluido para que apunte a los certificados SSL generados.
    3. (Recomendado) Modifique el archivo de host virtual no cifrado para redirigir automáticamente las solicitudes al host virtual cifrado.

    Cuando haya terminado, tendrá una configuración SSL segura.

    Creación de un fragmento de configuración de Apache con configuraciones de cifrado seguro

    Para comenzar, cree un fragmento de configuración de Apache para definir algunas configuraciones SSL. Esto configurará Apache con un conjunto de cifrado SSL sólido y habilitará algunas funciones avanzadas que ayudarán a mantener seguro su servidor. Los parámetros que configuran pueden ser utilizados por cualquier host virtual que habilite SSL.

    Crea un nuevo fragmento en el /etc/apache2/conf-availabledirectorio. En este ejemplo, crearemos los archivos nanoy les asignaremos un nombre ssl-params.confpara que quede claro su propósito. Puedes usar tu editor de texto preferido:

    1. sudo nano /etc/apache2/conf-available/ssl-params.conf

    Para configurar Apache SSL de forma segura, adaptaremos las recomendaciones de Cipherlist.eu. Cipherlist.eu es un recurso útil y fácil de entender para comprender las configuraciones de cifrado que se utilizan en el software más popular.

    Nota : Estas configuraciones sugeridas de Cipherlist.eu ofrecen una seguridad sólida. A veces, esto se produce una costa de una mayor compatibilidad con el cliente. Si necesita brindar soporte a clientes más antiguos, existe una lista alternativa a la que puede acceder haciendo clic en el enlace de la página con la etiqueta “Sí, deme un conjunto de cifrado que funciona con software heredado/antiguo”. Si lo desea, puede sustituir esa lista con el contenido del siguiente bloque de código de ejemplo.

    La elección de la configuración que se utilizará dependerá en gran medida de lo que se necesite admitir. Ambas proporcionarán una gran seguridad.

    Para sus propósitos, copie la configuración proporcionada en su totalidad. Sin embargo, hará un pequeño cambio: deshabilitará el Strict-Transport-Securityencabezado (HSTS).

    La precarga de HSTS proporciona mayor seguridad, pero puede tener consecuencias de gran alcance si se habilita accidentalmente o de manera incorrecta. En esta guía, no habilitaremos la configuración, pero puede modificarla si está seguro de comprender las implicaciones.

    Antes de decidir, tómese un momento para leer sobre HTTP Strict Transport Security, o HSTS, y específicamente sobre la funcionalidad de “precarga”.

    Ahora pegue la configuración en el ssl-params.confarchivo:

    /etc/apache2/conf-available/ssl-params.conf

    SSLCipherSuite EECDH+AESGCM:EDH+AESGCM# Requires Apache 2.4.36  OpenSSL 1.1.1SSLProtocol -all +TLSv1.3 +TLSv1.2SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1# Older versions# SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1SSLHonorCipherOrder On# Disable preloading HSTS for now.  You can use the commented out header line that includes # the "preload" directive if you understand the implications.# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"Header always set X-Frame-Options DENYHeader always set X-Content-Type-Options nosniff# Requires Apache = 2.4SSLCompression offSSLUseStapling onSSLStaplingCache "shmcb:logs/stapling-cache(150000)"# Requires Apache = 2.4.11SSLSessionTickets Off

    Guarde y cierre el archivo cuando haya terminado. Si está utilizando nano, puede hacerlo presionando CTRL + X, luego Yy ENTER.

    Modificación del archivo de host virtual Apache SSL predeterminado

    A continuación, modificará /etc/apache2/sites-available/default-ssl.confel archivo de host virtual Apache SSL predeterminado. Si está utilizando un archivo de bloque de servidor diferente, sustituya su nombre en los siguientes comandos.

    Antes de comenzar, haga una copia de seguridad del archivo de host virtual SSL original:

    1. sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

    Ahora, abra el archivo de host virtual SSL para realizar ajustes:

    1. sudo nano /etc/apache2/sites-available/default-ssl.conf

    En el interior, con la mayoría de los comentarios eliminados, el archivo Virtual Host contendrá el siguiente contenido de forma predeterminada:

    /etc/apache2/sites-available/default-ssl.conf

    IfModule mod_ssl.c        VirtualHost _default_:443                ServerAdmin webmaster@localhost                DocumentRoot /var/www/html                ErrorLog ${APACHE_LOG_DIR}/error.log                CustomLog ${APACHE_LOG_DIR}/access.log combined                SSLEngine on                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key                FilesMatch ".(cgi|shtml|phtml|php)$"                                SSLOptions +StdEnvVars                /FilesMatch                Directory /usr/lib/cgi-bin                                SSLOptions +StdEnvVars                /Directory        /VirtualHost/IfModule

    Realizará algunos ajustes menores en el archivo. Primero, configure los elementos normales que desea ajustar en un archivo de host virtual (como ServerAdminla dirección de correo electrónico, ServerNameetc., y ajusta las SSLdirectivas para que apunten a sus archivos de certificado y clave).

    Después de realizar estos cambios, el bloqueo del servidor debería tener el siguiente resultado:

    /etc/apache2/sites-available/default-ssl.conf

    IfModule mod_ssl.c        VirtualHost _default_:443                ServerAdmin your_email@example.com                ServerName server_domain_or_IP                DocumentRoot /var/www/html                ErrorLog ${APACHE_LOG_DIR}/error.log                CustomLog ${APACHE_LOG_DIR}/access.log combined                SSLEngine on                SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key                FilesMatch ".(cgi|shtml|phtml|php)$"                                SSLOptions +StdEnvVars                /FilesMatch                Directory /usr/lib/cgi-bin                                SSLOptions +StdEnvVars                /Directory        /VirtualHost/IfModule

    Guarde y cierre el archivo cuando haya terminado.

    (Recomendado) Modificar el archivo de host HTTP para redirigir a HTTPS

    En la actualidad, el servidor proporcionará tráfico HTTP sin cifrar y tráfico HTTPS cifrado. Para mayor seguridad, se recomienda en la mayoría de los casos redirigir HTTP a HTTPS automáticamente. Si no desea o no necesita esta funcionalidad, puede omitir esta sección sin problemas.

    Para ajustar el archivo de host virtual sin cifrar para redirigir todo el tráfico para que esté cifrado con SSL, abra el /etc/apache2/sites-available/000-default.confarchivo:

    1. sudo nano /etc/apache2/sites-available/000-default.conf

    Dentro de los VirtualHostbloques de configuración, agregue una Redirectdirectiva que puntear todo el tráfico a la versión SSL del sitio:

    /etc/apache2/sites-available/000-default.conf

    VirtualHost *:80        . . .        Redirect "/" "https://your_domain_or_IP/"        . . ./VirtualHost

    Guarde y cierre el archivo cuando haya terminado.

    Paso 3: Ajuste del firewall

    Si tiene el ufwfirewall habilitado, como lo recomiendan las guías de requisitos anteriores, es posible que deba ajustar la configuración para permitir el tráfico SSL. Afortunadamente, Apache registra algunos perfiles al ufwmomento de la instalación.

    Vea la lista de perfiles disponibles ejecutando lo siguiente:

    1. sudo ufw app list

    El resultado debería ser el siguiente:

    OutputAvailable applications:  Apache  Apache Full  Apache Secure  OpenSSH

    Puede revisar la configuración actual comprobando el estado:

    1. sudo ufw status

    Si anteriormente solo permitía tráfico HTTP normal, los resultados de salida serán como los siguientes:

    OutputStatus: activeTo                         Action      From--                         ------      ----OpenSSH                    ALLOW       AnywhereApache                     ALLOW       AnywhereOpenSSH (v6)               ALLOW       Anywhere (v6)Apache (v6)                ALLOW       Anywhere (v6)

    Para permitir tráfico HTTPS adicional, puede habilitar el perfil “Apache Full” y luego eliminar la asignación redundante del perfil “Apache”:

    1. sudo ufw allow 'Apache Full'
    2. sudo ufw delete allow 'Apache'

    Confirme los cambios comprobando el estado:

    1. sudo ufw status
    OutputStatus: activeTo                         Action      From--                         ------      ----OpenSSH                    ALLOW       AnywhereApache Full                ALLOW       AnywhereOpenSSH (v6)               ALLOW       Anywhere (v6)Apache Full (v6)           ALLOW       Anywhere (v6)

    Ahora ha permitido con éxito el tráfico de Apache a su firewall.

    Paso 4: Habilitar los cambios en Apache

    Ahora que ha realizado cambios y ajustado su firewall, puede habilitar los módulos SSL y de encabezados en Apache, habilitar su host virtual preparado para SSL y reiniciar Apache.

    Habilite mod_ssl, el módulo Apache SSL, y mod_headers, que es necesario para algunas de las configuraciones en el fragmento SSL, con el a2enmodcomando:

    1. sudo a2enmod ssl
    2. sudo a2enmod headers

    A continuación, habilite su host virtual SSL con el a2ensitecomando:

    1. sudo a2ensite default-ssl

    También necesitarás habilitar tu ssl-params.confarchivo para leer los valores que configura:

    1. sudo a2enconf ssl-params

    En este punto, su sitio y los módulos necesarios están habilitados. Verifique que no haya errores de sintaxis en sus archivos con una prueba:

    1. sudo apache2ctl configtest

    Si todo sale bien, obtendrás los siguientes resultados:

    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 el resultado contiene Syntax OKerrores de sintaxis, el archivo de configuración no contiene errores de sintaxis. Ahora puede reiniciar Apache de forma segura para implementar los cambios:

    1. sudo systemctl restart apache2

    Has realizado tus cambios y ahora probarás tu servidor SSL.

    Paso 5: Prueba de cifrado

    Ahora es el momento de probar su servidor SSL. Comience abriendo su navegador web y escriba https://seguido del nombre de dominio o IP de su servidor en la barra de direcciones:

    https://server_domain_or_IP

    Debido a que el certificado que creó no está firmado por una de las autoridades de certificación confiables de su navegador, es probable que reciba una advertencia como la siguiente:

    Esto es normal y esperado. Solo nos interesa el aspecto de cifrado de nuestro certificado, no la validación de terceros de la autenticidad de nuestro servidor. Haga clic en AVANZADO y luego en el enlace proporcionado para continuar con su servidor de todos los modos:

    Deberías ser redirigido a tu sitio. En la barra de direcciones del navegador verás un candado con una “x” encima. Esto significa que el certificado no se puede validar. Todavía estás calculando tu conexión.

    Si configuras Apache para redirigir HTTP a HTTPS, también puedes comprobar si la redirección funciona correctamente:

    http://server_domain_or_IP

    Si el resultado es el mismo icono, significa que la redirección funcionó correctamente.

    Paso 6: Cambiar a una redirección permanente

    Si su redirección funcionó correctamente y está seguro de que desea permitir solo cifrado tráfico, debe modificar nuevamente el host virtual Apache sin cifrar para que la redirección sea permanente.

    Abra nuevamente el archivo de configuración del bloque del servidor:

    1. sudo nano /etc/apache2/sites-available/000-default.conf

    Busque la Redirectlínea que agregó anteriormente. Agregue permanenta esa línea, que cambia la redirección de una redirección temporal 302 a una redirección permanente 301:

    /etc/apache2/sites-available/000-default.conf

    VirtualHost *:80        . . .        Redirect permanent "/" "https://your_domain_or_IP/"        . . ./VirtualHost

    Guarde y cierre el archivo.

    Comprueba tu configuración en busca de errores de sintaxis:

    1. sudo apache2ctl configtest

    Cuando esté listo, reinicie Apache para que la redirección sea permanente:

    1. sudo systemctl restart apache2

    Has logrado que la redirección sea permanente para permitir únicamente cifrado de tráfico.

    Conclusión

    Ha configurado su servidor Apache para utilizar un cifrado fuerte para las conexiones de los clientes. Esto le permitirá atender solicitudes de forma segura y evitará que terceros se apoyen en su tráfico.

    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