Activar HTTPS en Apache + Forzar SSL
Una tarea que repito una y otra vez al instalar un servidor Apache, es la configuración para activar HTTPS. Los pasos son bastante simples, pero es necesario algún que otro truco. Por ello, me pareció interesante describir el procedimiento.
Además les comentaré cómo forzar al servidor a que siempre utilice HTTPS, y que no envíe nada a través de HTTP.
La configuración que describiré a continuación está pensada para una distribución debian o basada en ésta, aunque los pasos no deberían cambiar mucho en otras distros.

Para configurar HTTPS, primero deben crear un certificado SSL. Hace poco más de un año escribí una guía completa, describiendo los certificados y cómo crear uno utilizando openssl. La pueden acceder aquí.

Una vez que tenemos el certificado, debemos actualizar apache para que escuche en el puerto 443 y decirle donde están los certificados. Las distros basadas en debian suelen traer el archivo /etc/apache2/sites-available/default-ssl, en el cual se encuentra una configuración default del VirtualHost necesario para utilizar HTTPS. Podemos utilizar este archivo como base para nuestra configuración. Simplemente deben copiar el archivo de sites-available a sites-enabled:
cp /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled/
o bien, utilizar el comando a2ensite, que se encarga de habilitar Virtual Hosts definidos en sites-available:
a2ensite default-ssl
El siguiente paso me costó un par de horas de trabajo. El paso en sí es muy simple, pero encontrar el error me llevó bastante tiempo.
Luego de configurar el servidor para que funcione con ssl (incluyendo los pasos que describo luego), me encontré con que apache arrojaba el error "ssl_error_rx_record_too_long". Me costó un buen tiempo descubrir el problema, aunque la solución la tuve desde el principio en la página stackoverflow.
El error se debe a que en la configuración del VirtualHost default (/etc/apache2/sites-enabled/000-default) se especifica que apache debe utilizar esa configuración para todas las direcciones DNS y para todos los ports. Por ello, cuando accedemos a través de HTTPS (port 443), apache se encuentra con una configuración que no presenta SSL, y envía una respuesta HTTP común, cuando en realidad el browser del cliente está esperando una conexión SSL.
En fin, el error se soluciona cambiando la línea:
<VirtualHost *>
por
<VirtualHost *:80>
en el archivo /etc/apache2/sites-enabled/000-default. Ahora apache sabe que esta configuración es sólo para el port 80.

Una vez realizado el paso anterior, debemos modificar algunas líneas en el archivo sites-enabled/default-ssl para que funcione SSL. Por un lado necesitamos cambiar los paths al certificado y la clave del certificado. Dirijanse a la parte del archivo que empieza con "SSL Engine Switch" y asegúrense de que la línea "SSLEngine on" se encuentre descomentada. Luego modifiquen las líneas:
SSLCertificateKeyFile /path/clave.key
SSLCertificateFile /path/certificad.crt
y coloquen el path correspondiente. La primera especifica la ubicación de la clave, y la segunda la ubicación del certificado.


Configurado SSL correctamente, forzaremos al cliente a utilizar HTTPS en lugar de HTTP. Es decir, si el usuario olvida poner https en la dirección, forzaremos a que el server igualmente utilice https a través de una redirección.
Para forzar la redirección, agregaremos algunas líneas al archivo /etc/apache2/sites-enabled/000-default. Vayan a la parte donde se configura el directorio base, y dejenlo de la siguiente forma:
<Directory /var/www/>
...
...
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</Directory>
Las líneas que agregamos realizan un if. Si no se está utilizando HTTPS (RewriteCond %{HTTPS} off), entonces redirigir a la misma dirección pero utilizando HTTPS (RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}). Estas reglas las obtuve de Apache: Redirect http to https Apache secure connection – force HTTPS Connections.

Eso es todo, ya tenemos habilitado SSL en Apache, y establecimos que siempre se utilice HTTPS =)

5 comentarios:

Anónimo dijo...

Gracias.

Llevaba una tarde con ese detalle del error ssl_error_rx_record_too_long y no se como di con tu artículo.

Tenía mal puesto un virtualhost y me tiraba todo el apache

GRACIAS

d3m4s1@d0v1v0 dijo...

Yo perdí dos tardes (con distancia de más de 1 año entre ellas) por no haber anotado esta solución la primera vez jeje
Me alegra haber ayudado =)

Anónimo dijo...

el forzado a https si funcionó!!

Anónimo dijo...

Hola buenas tardes, mi consulta es que no logro entender en que parte agrego esas lineas

Anónimo dijo...

GRACIASSSSSSSSSSSSSSSSS

Publicar un comentario