Habilitar correctamente HTTPS en Apache con Let’s Encrypt en Ubuntu 20.04

Este tutorial te va a mostrar cómo habilitar correctamente HTTPS en Apache con Let’s Encrypt en Ubuntu. Google Chrome y Firefox ya han comenzado a marcar las páginas web no encriptadas con caja de entrada de contraseña como inseguras. Eventualmente todas las páginas web HTTP serán marcadas como inseguras. HTTPS se convertirá en el valor por defecto para cualquier sitio web. También es un requisito si quieres utilizar el protocolo HTTP/2 para acelerar tu sitio web.

Habilitar correctamente HTTPS en Apache con Let's Encrypt

Habilitar correctamente HTTPS en Apache con Let’s Encrypt

Como probablemente sepas, Let’s Encrypt es una autoridad certificadora gratuita, automatizada y abierta. La documentación oficial describe los sencillos pasos que puedes seguir para habilitar HTTPS con Let’s Encrypt, pero hay más que eso. Si sigues la documentación oficial, obtendrás una puntuación de A en la prueba de SSL Labs. Si sigues mis pasos, obtendrás una puntuación de A+. Si ya has desplegado un certificado Let’s Encrypt antes, puedes seguir este tutorial para renovar y reemplazar tu certificado existente.

Antes de enseñarte los pasos para habilitar HTTPS con Let’s Encrypt, quiero hablar primero del registro CAA, las cabeceras de seguridad y el grapado OCSP. Estas cosas son las que pueden ayudarte a conseguir A+. También te mostraré cómo tratar con el servicio CDN de CloudFlare al final de este tutorial.

Nota: Este tutorial funciona en todas las versiones actuales de Apache y Ubuntu (incluyendo 16.04, 18.04 y 20.04).

Creación de un registro CAA para tu nombre de dominio

El Organismo de Autoridad de Certificación (CAA) es un registro de recursos DNS que especifica qué autoridades de certificación (CA) están autorizadas a emitir certificados para un nombre de dominio concreto. A partir de septiembre de 2017, todas las CA tienen la obligación de comprobar los registros CAA antes de emitir un certificado para un nombre de dominio concreto. Si no se encuentra ningún registro CAA para un nombre de dominio, cualquier CA puede emitir un certificado para ese nombre de dominio. Si una CA no aparece en su registro CAA, entonces esa CA no puede emitir certificado para su nombre de dominio.

Para crear un registro CAA que permita a Let’s Encrypt emitir un certificado para su nombre de dominio, añada la siguiente entrada en su servidor DNS o gestor de DNS.

tu-dominio.com. IN CAA 0 issue "letsencrypt.org"

También puedes usar iodef para hacer que la CA reporte la solicitud de emisión de certificados maliciosos a tu dirección de correo electrónico.

tu-dominio.com. IN CAA 0 iodef "mailto:your-email-address"

El formato de los registros anteriores es para los archivos de zona. A continuación le ofrecemos algunos consejos.

  • Puede utilizar SSLMate CAA Record Helper para generar un registro CCA para su nombre de dominio.
  • Si estás usando GoDaddy DNS, entonces sigue este post para añadir el registro CAA.

Puedes utilizar el siguiente comando dig para comprobar tu registro de CAA.

dig tu-dominio.com CAA

Hay que tener en cuenta que los navegadores web no comprueban los registros de la CEA.

Encabezados de seguridad

Las cabeceras de seguridad son tan importantes como el HTTPS, pero sólo un pequeño porcentaje de los sitios con HTTPS prestan atención a las cabeceras de seguridad. Aunque una discusión completa sobre las cabeceras de seguridad está más allá del alcance de este tutorial, quiero hablar de las cabeceras upgrade-insecure-requests y HSTS porque puedes habilitarlas fácilmente con Let’s Encrypt para aumentar la seguridad de tu sitio.

Actualizar las solicitudes inseguras

Hay ocasiones en las que un sitio ha habilitado HTTPS, pero algunos CSS, imágenes o JavaScripts se siguen sirviendo a través de HTTP. En este caso, el candado verde al principio de la barra de direcciones del navegador desaparecerá. En Google Chrome, se sustituye por un icono de información; en Firefox, por un candado gris con un triángulo amarillo. Usted querrá mostrar un candado verde a los visitantes del sitio tanto como sea posible y la forma fácil de solucionar este problema es habilitar la cabecera upgrade-insecure-requests, que obligará al navegador web a utilizar https:// para cada recurso http://.

Para habilitar esta cabecera, simplemente añade la bandera –uir al emitir el comando certbot. Recuerda que esta cabecera funciona con recursos alojados en tu propio dominio y con recursos en dominios de terceros que soportan HTTPS. Si su página web incluye recursos en servidores de terceros que no están disponibles a través de HTTPS, entonces esos recursos serán bloqueados por los navegadores web, pero el uso de esta cabecera garantiza que sus páginas web siempre tengan un candado verde.

HSTS (Seguridad de transporte estricta HTTP)

La cabecera HSTS indica a los navegadores web que toda la comunicación con su sitio web debe realizarse a través de HTTPS. Defiende contra el SSL Striping, que es un ataque para degradar de HTTPS a HTTP. Para habilitar esta cabecera, simplemente añada la bandera –hsts cuando emita el comando certbot.

OCSP Stapling

Cuando un navegador web se conecta a un sitio web HTTPS, envía una solicitud OCSP (Online Certificate Status Protocol) a la autoridad de certificación (CA) para consultar el estado de revocación del certificado SSL del sitio web. Esto puede retrasar la carga de la página entre 1 y 3 segundos, según los datos de telemetría de Firefox.

Para mejorar el rendimiento, el propietario del sitio web puede activar el grapado OCSP, en cuyo caso el propio servidor web obtiene la respuesta OCSP firmada por la CA a intervalos regulares y la envía al navegador web, eliminando así la necesidad de que el navegador web se ponga en contacto con el servidor OCSP.

Para habilitar el grapado de OCSP, simplemente añada el indicador –staple-ocsp cuando emita el comando certbot.

OCSP Must Staple

Si un hacker crea un sitio web falso y duplicado, desactiva OCSP staplin y también bloquea el acceso del navegador web al servidor OCSP, el navegador web asumirá que está bien y procederá al sitio web malicioso. Para resolver este problema, puede habilitar OCSP stapling en su sitio web, que indica a los navegadores web que la respuesta de la grapa OCSP debe ser presentada por su sitio web durante la conexión HTTPS. Así, cuando los navegadores web se conectan a un sitio web falso que no tiene grapa OCSP, detendrá la conexión.

Para habilitar OCSP stapling, añade la bandera –must-staple cuando emitas el comando certbot.

Instalación del cliente Let’s Encrypt (Certbot) en Ubuntu

Ahora es el momento de ensuciarse las manos. A partir de Ubuntu 16.04, el cliente de Let’s Encrypt (Certbot) está incluido en el repositorio de Ubuntu, así que puedes instalarlo con el siguiente comando. Python3-certbot-apache es el plugin de Certbot para Apache.

sudo apt install certbot python3-certbot-apache

Para comprobar el número de versión, ejecuta

certbot --version

Muestra de salida:

certbot 0.31.0

Si quieres utilizar la última versión, puedes instalar Certbot desde Snap.

sudo apt install snapd

sudo snap install --classic certbot

Nota: Si quieres usar la versión de Snap, necesitas usar la ruta binaria completa: /snap/bin/certbot..

Uso del plugin de Apache para habilitar el HTTPS

Si tu sitio web no utiliza el servicio CDN, entonces se recomienda utilizar el plugin de Apache para habilitar HTTPS en el servidor web Apache, ya que puede obtener automáticamente el certificado SSL/TLS y configurarlo por ti. Ejecute el siguiente comando en su servidor Ubuntu.

sudo certbot --apache --agree-tos --redirect --uir --hsts --staple-ocsp --must-staple -d www.example.com,example.com --email you@example.com

Explicación:

  • --apache: Utilice el autentificador y el instalador de Apache
  • --agree-tos: Aceptar las condiciones de servicio de Let’s Encrypt
  • --redirect: Redirigir automáticamente todo el tráfico HTTP a HTTPS
  • --uir: Añade la cabecera “Content-Security-Policy: upgrade-insecure-requests” a cada respuesta HTTP.
  • --hsts:Añade la cabecera Strict-Transport-Security a cada respuesta HTTP.
  • --staple-ocsp: Activa el grapado OCSP.
  • --must-staple: Añade la extensión OCSP Must Staple al certificado.
  • -d va seguido de una lista de nombres de dominio, separados por comas. Puedes añadir hasta 100 nombres de dominio.
  • --email: Correo electrónico utilizado para el registro y el contacto de recuperación.

Se te preguntará si quieres recibir correos electrónicos de la EFF (Electronic Frontier Foundation). Tras elegir S o N, se obtendrá y configurará automáticamente tu certificado SSL, lo que se indica en el siguiente mensaje.

La imagen tiene un atributo ALT vacío; su nombre de archivo es image-3.png

Ahora, si visitas tu sitio web, puedes ver que HTTP se redirige automáticamente a la conexión HTTPS. Recuerda que el cliente de certbot crea /etc/apache2/sites-enabled/tu-dominio.com-le-ssl.conf SSL virtual host al configurar SSL para tu sitio web.

Prueba de tu certificado SSL

Ve a ssllabs.com para probar tu certificado SSL y la configuración. Como he prometido, obtendrás A+. También puedes comprobar si tu nombre de dominio tiene habilitado el registro CAA, si tu servidor tiene habilitado el HSTS, el grapado OCSP y el grapado OCSP.

Redireccionamiento de WWW a no-WWW (o viceversa)

Ya hemos habilitado la redirección de HTTP a HTTPS, lo que queda por hacer es redirigir www a no www, o viceversa. Si estás usando WordPress, entonces es muy fácil. Sólo tienes que ir a WordPress Escritorio> Ajustes> General y establecer tu versión preferida (www o nowww) en Dirección de WordPress (URL) y Dirección del sitio (URL).

Si vas por ese camino, terminarás con lo que se conoce como doble redirección 301. Primero, el servidor Apache redirige HTTP a HTTPS, luego WordPress redirige a un dominio www o no www.

Algunos pueden argumentar que se puede perder SEO link juice al hacer una doble redirección 301. Si te preocupa eso, entonces puedes usar el siguiente método para hacer que todas las versiones del dominio vayan directamente al destino final.

Edita tu archivo de host virtual. (No el host virtual SSL)

sudo nano /etc/apache2/sites-enabled/tu-dominio.com.conf

El cliente CertBot añadió las siguientes líneas al archivo para redirigir HTTP a HTTPS.

RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com [OR]
RewriteCond %{SERVER_NAME} =www.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

Para redirigir a un dominio www o no www, debes cambiar la última línea. Sustituya %{SERVER_NAME} por la versión del dominio que prefiera, como se indica a continuación. (dominio www)

RewriteRule ^ https://www.tu-dominio.com%{REQUEST_URI} [END,NE,R=permanent]

Si prefieres un dominio que no sea www, cámbialo por lo siguiente.

RewriteRule ^ https://tu-dominio.com%{REQUEST_URI} [END,NE,R=permanent]

A continuación, guarda y cierra el archivo. También tendremos que editar el host virtual SSL.

sudo nano /etc/apache2/sites-enabled/example.com-le-ssl.conf

Añade las siguientes líneas encima de la etiqueta de cierre para redirigir el dominio no www a www.

RewriteEngine on
RewriteCond %{SERVER_NAME} =tu-dominio.com
RewriteRule ^ https://www.example.com%{REQUEST_URI} [END,NE,R=permanent]

Si quieres redirigir el dominio www a otro que no sea www, añade las siguientes líneas en su lugar.

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.example.com
RewriteRule ^ https://example.com%{REQUEST_URI} [END,NE,R=permanent]

Guarda y cierra el archivo. Vuelve a cargar el servicio de Apache para que los cambios surtan efecto.

sudo systemctl reload apache2

Si estás usando WordPress, asegúrate de establecer tu versión de dominio preferida en Dirección de WordPress (URL) y Dirección del sitio (URL). Antes de editar los archivos de host virtual de Apache. Si la configuración de WordPress se contradice con la de Apache, su sitio entrará en un bucle de redirección.

Cómo desactivar TLSv1 y TLSv1.1

TLSv1 y TLSv1.1 ya no se consideran seguros. Para desactivarlas, edita el archivo de configuración de las opciones de Let’s Encrypt SSL.

sudo nano /etc/letsencrypt/options-ssl-apache.conf

Encuentra la siguiente línea, que desactiva SSLv2 y SSLv3 por defecto.

SSLProtocol             all -SSLv2 -SSLv3

Cámbialo por lo siguiente para desactivar también TLSv1.0 y TLSv1.1.

SSLProtocol             all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

Guarda y cierra el archivo. A continuación, reinicia Apache.

sudo systemctl restart apache2

Renovación automática del certificado

Para renovar automáticamente el certificado Let’s Encrypt, simplemente edita el archivo crontab del usuario root.

sudo crontab -e

A continuación, añade la siguiente línea en la parte inferior.

@daily certbot renew --quiet && systemctl reload apache2

La bandera --quiet suprimirá los mensajes normales. Si quieres recibir mensajes de error, añade la siguiente línea al principio del archivo crontab.

MAILTO=your-email-address

Es necesario recargar Apache para que presente el nuevo certificado a los clientes.

Una vez hecho esto dispones de un certificado de clasificación A+ para tu dominio, que además se actualizara de forma automática y de manera gratuita, este mismo procedimiento se puede repetir tantas veces como quieras en el mismo servidor VPS para cada uno de los nombres de dominio o de los servidores virtuales que este gestionando el servidor Apache de ese VPS.

¡Que tengas un Ingenioso día!

¡que tengas un ingenioso día!

Contrata tu plan Ingenios@ de Sistemas por 5€ al mes y responderé a todas tus preguntas sobre tecnología en el menor tiempo posible. Pasa a formar parte de la comunidad Ingenios@s de Sistemas y disfruta de contenido exclusivo y aprende sobre sistemas Open Source, Blockchain, SmarContract, Web3, Inteligencia Artificial y Reaidad Virtual, súbete al tren de la Revolución 4.0

Si quieres estar al día y no perderte nada Suscribete al Podcast Ingenios@s de Sistemas, un episodio diario que te mantendrá informado y formado en esta vertiginosa carrera.

Deja un comentario

Share to...