Este artículo explica cómo configurar SSL para implementar HTTPS en un servidor Web Apache sobre sistemas Debian/Devuan y derivados. En la actualidad es imprescindible contar con soporte para HTTPS en nuestros sitios Web, ya que Google desde hace un par de años está poniendo el foco en la seguridad en Internet (de hecho la considera una de las principales prioridades) y el buscador valora el soporte para HTTPS como un factor de peso al momento de posicionar.



Configuración del módulo SSL

Antes de comenzar es necesario verificar que el módulo SSL esté habilitado en el servidor Apache:

root@cloud:~# apache2ctl -t -D DUMP_MODULES 2>/dev/null | grep ssl
 ssl_module (shared)

Si el módulo SSL no se encuentra habilitado, es posible habilitarlo y cargarlo ejecutando:

root@cloud:~# a2enmod ssl
root@cloud:~# service apache2 restart

Una vez reiniciado, verificar que el servidor Apache esté aceptando conexiones entrantes en el puerto 443:

root@cloud:~# netstat -nl | grep 443
tcp6       0      0 :::443                  :::*                    LISTEN

Y también que esté permitida la entrada hacia dicho puerto en el firewall:

root@cloud:~# iptables -nL | grep 443
ACCEPT     tcp  --  0.0.0.0/0     1.2.3.4     tcp spts:1024:65535 dpt:443 state NEW

Configuración del VirtualHost

Por defecto, el servidor Apache incluye un archivo de configuración de VirtualHost de ejemplo "default-ssl". Cuando se trata de configuraciones simples, es posible copiar dicho archivo y trabajar modificando el mismo. Aunque, cuando tenemos un VirtualHost cuya configuración es grande y compleja (y no deseamos copiarla, para evitar errores) es más conveniente copiar la configuración del VirtualHost HTTP para convertirlo en HTTPS.

Copiar la configuración del VirtualHost HTTP (por ejemplo "mywebapp") utilizando el sufijo "-ssl":

root@cloud:~# cd /etc/apache2/sites-available/
root@cloud:/etc/apache2/sites-available/# cp mywebapp mywebapp-ssl

Editar la configuración del VirtualHost SSL y realizar las siguientes modificaciones:

/etc/apache2/sites-available/# nano mywebapp-ssl

Primero, cambiar el puerto del 80 al 443:

<VirtualHost mywebapp.linuxito.com:443>

Luego, cambiar los nombres de los archivos de log de accesos y errores (utilizando el mismo sufijo) para separar los registros entre HTTP y HTTPS:

ErrorLog /var/log/apache2/mywebapp-ssl-error.log
CustomLog /var/log/apache2/mywebapp-ssl-access.log combined

A continuación, agregar la configuración de SSL dentro de la sección <VirtualHost>:


        SSLEngine on

        SSLCertificateFile /etc/letsencrypt/live/mywebapp.linuxito.com/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/mywebapp.linuxito.com/privkey.pem

        <FilesMatch "\.(php|py)$">
                SSLOptions +StdEnvVars
        </FilesMatch>

        BrowserMatch "MSIE [2-6]" \
                nokeepalive ssl-unclean-shutdown \
                downgrade-1.0 force-response-1.0
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

La primera línea de configuración habilita el motor SSL para este VirtualHost. Luego se indica la ruta a los archivos correspondientes al certificado SSL y a su clave privada. La sección <FilesMatch> (copiada del VirtualHost "default-ssl") exporta las variables de entorno SSL para scripts PHP y Python (porque este caso así lo requería). Finalmente, las directivas BrowserMatch se incluyen para dar soporte a navegadores obsoletos (IE 6/7+). Estas últimas directivas son opcionales y pueden omitirse si no se desea, o no es necesario, dar soporte a dichos navegadores.

Una vez terminada la configuración del VirtualHost, es necesario habilitarlo y recargar la configuración de Apache:

root@cloud:/etc/apache2/sites-available# a2ensite mywebapp-ssl
Enabling site mywebapp-ssl.
To activate the new configuration, you need to run:
  service apache2 reload
root@cloud:/etc/apache2/sites-available# service apache2 reload
[ ok ] Reloading web server config: apache2.

A partir de este momento es posible utilizar un navegador para corroborar el acceso:

También es posible conectarse desde línea de comandos con el cliente s_client provisto por OpenSSL:

root@cloud:/etc/apache2/sites-available# openssl s_client -connect mywebapp.linuxito.com:443

En caso de no contar con un certificado para nuestro servidor Web, es posible obtener un certificado SSL de manera simple y gratuita gracias a Let's Encrypt.

Para más información:

man apache2
man apache2ctl
man a2enmod
man a2ensite
man openssl
man s_client


Tal vez pueda interesarte


Compartí este artículo