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

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, 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
sudo
privilegios 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:
- 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. Larsa:2048
parte 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/ssl
directorio. Ahora, debes modificar la configuración de Apache para aprovecharlos.
Para ello, deberás realizar algunos ajustes en la configuración:
- Cree un fragmento de configuración para especificar configuraciones SSL predeterminadas y seguras.
- Modifique el archivo de host virtual Apache SSL incluido para que apunte a los certificados SSL generados.
- (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-available
directorio. En este ejemplo, crearemos los archivos nano
y les asignaremos un nombre ssl-params.conf
para que quede claro su propósito. Puedes usar tu editor de texto preferido:
- 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-Security
encabezado (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.conf
archivo:
/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 Y
y ENTER
.
Modificación del archivo de host virtual Apache SSL predeterminado
A continuación, modificará /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 siguientes comandos.
Antes de comenzar, haga 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 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 ServerAdmin
la dirección de correo electrónico, ServerName
etc., y ajusta las SSL
directivas 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.conf
archivo:
- sudo nano /etc/apache2/sites-available/000-default.conf
Dentro de los VirtualHost
bloques de configuración, agregue una Redirect
directiva 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 ufw
firewall 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 ufw
momento de la instalación.
Vea la lista de perfiles disponibles ejecutando lo siguiente:
- 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:
- 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”:
- sudo ufw allow 'Apache Full'
- sudo ufw delete allow 'Apache'
Confirme los cambios comprobando el estado:
- 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 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 configura:
- 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:
- 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 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 el resultado contiene Syntax OK
errores de sintaxis, el archivo de configuración no contiene errores de sintaxis. Ahora puede reiniciar Apache de forma segura para implementar los cambios:
- 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:
- sudo nano /etc/apache2/sites-available/000-default.conf
Busque la Redirect
línea que agregó 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
Cuando esté listo, reinicie Apache para que la redirección sea permanente:
- 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.
Deja una respuesta