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:
_files/cert-verifiedby.png)
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