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

Introducció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 sudo
privilegios. 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:
- 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: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.
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/ssl
directorio. Ahora solo necesitamos modificar nuestra configuración de Apache para aprovecharlos.
Realizaremos algunos ajustes a nuestra configuración:
- Crearemos un fragmento de configuración para especificar configuraciones SSL predeterminadas y seguras.
- Modificaremos el archivo de host virtual Apache SSL incluido para que apunte a nuestros certificados SSL generados.
- (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-available
directorio. Le pondremos un nombre al archivo ssl-params.conf
para que quede claro su propósito:
- 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-Security
encabezado (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.conf
archivo 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.conf
el 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:
- 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:
- 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 DocumentRoot
directiva.
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.conf
archivo:
- sudo nano /etc/apache2/sites-available/000-default.conf
Dentro, dentro de los VirtualHost
bloques de configuración, agregue una Redirect
directiva, 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 ufw
permitir el tráfico HTTPS cifrado a tu servidor.
Paso 3: Ajuste del firewall
Si tiene el ufw
firewall 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, ufw
viene cargado con perfiles de aplicaciones que puede usar para modificar la configuración de su firewall.
Podemos ver los perfiles disponibles escribiendo:
- 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:
- 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”:
- sudo ufw allow 'WWW Full'
- sudo ufw delete allow 'WWW'
Tu estado debería verse así ahora:
- 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 a2enmod
comando:
- sudo a2enmod ssl
- sudo a2enmod headers
A continuación, habilite su host virtual SSL con el a2ensite
comando:
- sudo a2ensite default-ssl
También necesitarás habilitar tu ssl-params.conf
archivo para leer los valores que has configurado:
- 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:
- sudo apache2ctl configtest
Si todo sale bien, obtendrás un resultado parecido a esto:
OutputSyntax OK
Mientras su salida contenga Syntax OK
esto, su archivo de configuración no tendrá errores de sintaxis y podrá reiniciar Apache de manera segura para implementar los cambios:
- 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:
- sudo nano /etc/apache2/sites-available/000-default.conf
Busque la Redirect
línea que agregamos anteriormente. Agregue permanent
a 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:
- sudo apache2ctl configtest
Si este comando no informa ningún error de sintaxis, reinicie Apache:
- 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.
Deja una respuesta