La configuración de una conexión SSL (Secure Sockets Layer) le permite agregar un protocolo de cifrado asimétrico adicional al HTTP común. El protocolo SSL puede ser útil para fortalecer el sistema de autenticación de un sitio web o el intercambio de datos entre una aplicación y el servidor. En esta guía, verá cómo configurar una conexión SSL y habilitar HTTPS en Apache con Ubuntu 18.04.
Primero, conéctese a su servidor a través de una conexión SSH. Si aún no lo ha hecho, se recomienda seguir nuestra guía para conectarse de forma segura con el protocolo SSH. En caso de un servidor local, vaya al siguiente paso y abra la terminal de su servidor.
Obtención de un certificado SSL
Para establecer una conexión segura, Apache necesitará un certificado SSL que se puede obtener de una Autoridad de Certificación (CA). Por conveniencia, en este ejemplo usaremos un certificado autofirmado o autofirmado, usado solo en entornos de prueba y desarrollo. Para obtener un certificado autofirmado, consulte nuestra guía para crear un certificado SSL autofirmado.
Si está interesado en obtener un certificado SSL gratuito emitido por una Autoridad de Certificación, siga nuestra guía sobre Cómo asegurar Apache con Let's Encrypt y Ubuntu 18.04.
Nota importante:
Durante la creación del certificado, ingrese la dirección IP de su servidor o el nombre de dominio cuando se le solicite el nombre común:
Common Name (e.g. server FQDN or YOUR name) []: domain.com
Después de obtener el certificado, cree la carpeta /etc/certificate:
$ sudo mkdir /etc/certificate
Luego guarde tanto el certificado como la clave privada en él.
Configuración de los parámetros Apache SSL
Continúe configurando las directivas para la conexión segura que creará Apache. Para hacerlo, cree el archivo ssl-params.conf en el directorio disponible de conf de Apache:
$ sudo nano /etc/apache2/conf-available/ssl-params.conf
Pegue la siguiente configuración básica en el archivo recién creado:
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off
Luego guarde y cierre el archivo.
Cómo cambiar el host virtual
Luego, modifique la configuración SSL del Virtual Host del dominio que desea proteger con conexión SSL. En este tutorial, se usará la configuración SSL del Apache Virtual Host predeterminado, como ejemplo.
Abra la configuración de Virtual Host SSL:
$ sudo nano /etc/apache2/sites-available/default-ssl.conf
Encontrará un archivo estructurado de la siguiente manera:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin [email protected]
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>
Configure correctamente la directiva ServerAdmin ingresando su correo electrónico y agregue la directiva ServerName seguida de su dominio o la dirección IP de su servidor.
Finalmente, cambie la ruta indicada por las directivas SSLCertificateFile y SSLCertificateKeyFile, ingresando respectivamente la ruta de su certificado y clave privada.
Obtendrá un resultado similar al siguiente:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin [email protected]
ServerName mydomain.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/certificate/certificate.crt
SSLCertificateKeyFile /etc/certificate/private.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
Luego guarde y cierre el archivo.
Cómo configurar el Cortafuegos
En caso de que haya un firewall en su sistema, configúrelo para habilitar el tráfico HTTP y el tráfico HTTPS a su máquina.
Al usar el firewall UFW, hay disponibles algunos perfiles preinstalados para Apache. Así que veamos cómo habilitarlos.
Para verificar los perfiles disponibles instalados en el firewall UFW, ejecute este comando:
$ sudo ufw app list
Se mostrará una lista similar a la siguiente en la pantalla:
Available applications:
Apache
Apache Full
Apache Secure
OpenSSH
Para permitir el tráfico HTTP (Puerto 80) y HTTPS (Puerto 443), use el perfil "Apache Full".
Verifique la información del perfil de la siguiente manera:
$ sudo ufw app info "Apache Full"
Se mostrará la descripción del perfil de la pantalla:
Profile: Apache Full
Title: Web Server (HTTP,HTTPS)
Description: Apache v2 is the next generation of the omnipresent Apache web
server.
Ports:
80,443/tcp
Después de verificar el perfil, habilítelo:
$ sudo ufw allow in "Apache Full"
Cómo configurar Apache
En este punto, se pueden realizar cambios en la configuración de Apache.
Habilite los módulos mod_ssl y mod_headers:
$ sudo a2enmod ssl
$ sudo a2enmod headers
Habilitar la lectura de la configuración SSL creada anteriormente:
$ sudo a2enconf ssl-params
Habilite el servidor virtual SSL predeterminado:
$ sudo a2ensite default-ssl
Compruebe que no ha cometido errores de sintaxis en los archivos de configuración de Apache:
$ sudo apache2ctl configtest
Si aparece el mensaje "Syntax OK" en la pantalla, reinicie Apache:
$ sudo systemctl restart apache2
Cómo comprobar la conexión segura
Abra su navegador conectándose al dominio o dirección IP del Virtual Host que configuró, asegurándose de usar el protocolo https
https://mydomain.com