Cómo crear un certificado SSL autofirmado para Apache en Debian 10

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 seguras
    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, le mostraremos cómo configurar un certificado SSL autofirmado para usar con un servidor web Apache en Debian 10.

    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, 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 los 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. Puede averiguar cómo configurar un certificado de confianza gratuito con el proyecto Let's Encrypt aquí.

    Prerrequisitos

    Antes de comenzar, debe tener un usuario no root configurado con sudoprivilegios. Puede aprender a configurar una cuenta de usuario de este tipo siguiendo nuestro artículo Configuración inicial del servidor con Debian 10.

    También necesitarás tener instalado el servidor web Apache. Si deseas instalar una pila LAMP completa (Linux, Apache, MariaDB, PHP) en tu servidor, puedes seguir nuestra guía sobre cómo configurar LAMP en Debian 10. Si solo deseas el servidor web Apache, omite los pasos relacionados con PHP y MariaDB.

    Cuando haya completado estos requisitos previos, continúe a continuación.

    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.

    Podemos crear un par de clave y certificado autofirmado con OpenSSL en un solo comando:

    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

    Se le harán una serie de preguntas. Antes de analizarlas, veamos qué sucede en el comando que estamos emitiendo:

    • openssl : esta es la herramienta de línea de comandos básica para crear y administrar certificados, claves y otros archivos OpenSSL.
    • req : este subcomando 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 al que SSL y TLS adhieren para la gestión de claves y certificados. Queremos crear un nuevo certificado X.509, por lo que estamos utilizando este subcomando.
    • -x509 : Esto modifica aún más el subcomando anterior al indicarle a la utilidad que queremos crear 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 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 porque 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 configuramos en 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.

    Como hemos indicado anteriormente, estas opciones crearán tanto un archivo de clave como un certificado. Se nos harán algunas preguntas sobre nuestro 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 totalidad de las indicaciones se verá así:

    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

    Hemos creado nuestros archivos de clave y certificado en el /etc/ssldirectorio. Ahora solo necesitamos modificar nuestra configuración de Apache para aprovecharlos.

    Realizaremos algunos ajustes a nuestra configuración:

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

    Cuando terminemos, deberíamos tener una configuración SSL segura.

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

    Primero, crearemos 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 nuestro servidor seguro. Los parámetros que configuraremos pueden ser utilizados por cualquier host virtual que habilite SSL.

    Crea un nuevo fragmento en el /etc/apache2/conf-availabledirectorio. Le pondremos un nombre al archivo ssl-params.confpara que quede claro su propósito:

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

    Para configurar Apache SSL de forma segura, utilizaremos las recomendaciones de Remy van Elst en el sitio Cipherli.st. Este sitio está diseñado para proporcionar configuraciones de cifrado fáciles de usar para software popular.

    Las configuraciones sugeridas en el sitio al que se hace referencia anteriormente ofrecen una seguridad sólida. A veces, esto se produce a 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 funcione con software heredado/antiguo”. Esa lista puede sustituir a los elementos copiados a continuación.

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

    Para nuestros propósitos, podemos copiar la configuración proporcionada en su totalidad. Solo haremos un pequeño cambio y deshabilitaremos el Strict-Transport-Securityencabezado (HSTS).

    La precarga de HSTS proporciona mayor seguridad, pero puede tener consecuencias de gran alcance si se activa accidentalmente o de forma incorrecta. En esta guía, no activaremos 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”.

    Pegue la siguiente configuración en el ssl-params.confarchivo que abrimos:

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

    SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDHSSLProtocol 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.

    Modificación del archivo de host virtual Apache SSL predeterminado

    A continuación, modifiquemos /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 comandos siguientes.

    Antes de continuar, hagamos 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 bloque de host virtual debería verse de forma predeterminada como esto:

    /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

    Realizaremos algunos ajustes menores al archivo. Configuraremos los elementos normales que desearíamos ajustar en un archivo de host virtual (dirección de correo electrónico de ServerAdmin, ServerName, etc.) y ajustaremos las directivas SSL para que apunten a nuestros archivos de certificado y clave. Nuevamente, si está utilizando una raíz de documento diferente, asegúrese de actualizar la DocumentRootdirectiva.

    Después de realizar estos cambios, su bloque de servidor debería verse similar a esto:

    /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, dentro de los VirtualHostbloques de configuración, agregue una Redirectdirectiva, apuntando 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.

    Esos son todos los cambios de configuración que debes realizar en Apache. A continuación, analizaremos cómo actualizar las reglas del firewall para ufwpermitir el tráfico HTTPS cifrado a tu servidor.

    Paso 3: Ajuste del firewall

    Si tiene el ufwfirewall habilitado, como lo recomiendan las guías de requisitos previos, es posible que deba ajustar la configuración para permitir el tráfico SSL. Afortunadamente, cuando se instala en Debian 10, ufwviene cargado con perfiles de aplicaciones que puede usar para modificar la configuración de su firewall.

    Podemos ver los perfiles disponibles escribiendo:

    1. sudo ufw app list

    Debería ver una lista como ésta, con los siguientes cuatro perfiles cerca de la parte inferior de la salida:

    OutputAvailable applications:. . .  WWW  WWW Cache  WWW Full  WWW Secure. . .

    Puede ver la configuración actual escribiendo:

    1. sudo ufw status

    Si anteriormente solo permitía tráfico HTTP normal, su salida podría verse así:

    OutputStatus: activeTo                         Action      From--                         ------      ----OpenSSH                    ALLOW       AnywhereWWW                        ALLOW       AnywhereOpenSSH (v6)               ALLOW       Anywhere (v6)WWW (v6)                   ALLOW       Anywhere (v6)

    Para permitir adicionalmente el tráfico HTTPS, habilite el perfil “WWW completo” y luego elimine la autorización redundante del perfil “WWW”:

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

    Tu estado debería verse así ahora:

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

    Una vez que su firewall esté configurado para permitir el tráfico HTTPS, puede pasar al siguiente paso, donde repasaremos cómo habilitar algunos módulos y archivos de configuración para permitir que SSL funcione correctamente.

    Paso 4: Habilitar los cambios en Apache

    Ahora que hemos realizado nuestros cambios y ajustado nuestro firewall, podemos habilitar los módulos SSL y de encabezados en Apache, habilitar nuestro host virtual preparado para SSL y luego reiniciar Apache para que estos cambios surtan efecto.

    Habilite mod_ssl, el módulo Apache SSL, y mod_headers, que es necesario para algunas de las configuraciones en nuestro fragmento de 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 has configurado:

    1. sudo a2enconf ssl-params

    En este punto, el sitio y los módulos necesarios están habilitados. Debemos verificar que no haya errores de sintaxis en nuestros archivos. Para ello, escriba:

    1. sudo apache2ctl configtest

    Si todo sale bien, obtendrás un resultado parecido a esto:

    OutputSyntax OK

    Mientras su salida contenga Syntax OKesto, su archivo de configuración no tendrá errores de sintaxis y podrá reiniciar Apache de manera segura para implementar los cambios:

    1. sudo systemctl restart apache2

    Con esto, su certificado SSL autofirmado ya está listo. Ahora puede comprobar que su servidor está cifrando correctamente su tráfico.

    Paso 5: Prueba de cifrado

    Ahora está listo para probar su servidor SSL.

    Abra 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 vea una advertencia de aspecto aterrador como la que se muestra a continuación:

    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 modos:

    Deberías ser redirigido a tu sitio. Si miras la barra de direcciones del navegador, verás un candado con una “x” encima u otro aviso similar que diga “no seguro”. En este caso, esto solo significa que el certificado no se puede validar. Sigue cifrando tu conexión.

    Si configuraste 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. Sin embargo, la redirección que creaste anteriormente es solo temporal. Si deseas que la redirección a HTTPS sea permanente, continúa con el paso final.

    Paso 6: Cambiar a una redirección permanente

    Si su redirección funcionó correctamente y está seguro de que desea permitir solo tráfico cifrado, 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 agregamos 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

    Si este comando no informa ningún error de sintaxis, reinicie Apache:

    1. sudo systemctl restart apache2

    Esto hará que la redirección sea permanente y su sitio solo atenderá tráfico a través de HTTPS.

    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 lean 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