Certificados TLS

Última revisión: 20 de diciembre de 2021

Versiones de SSL y TLS

Los sistemas de cifrado SSL (Secure Sockets Layer) y TLS (Transport Layer Security) añaden una capa en la que la información entre dos puntos va cifrada. Esto hace que si alguien intercepta las comunicaciones tenga más difícil saber sus contenidos, ya que necesitará la clave para descifrar la información. Esta es una razón por la que si quieres mejorar la seguridad de tu WordPress deberías tener todo el sitio bajo un certificado.

En Europa, por defecto, debería ser obligatorio en todo sitio web debido al RGPD (Reglamento General de Protección de Datos).

Existen muchas versiones de estos sistemas de cifrado:

  • SSL 1.0 nunca llegó a ver la luz.
  • SSL 2.0 lanzado en 1995 y válido hasta 2014, que quedó obsoleto.
  • SSL 3.0 lanzado en 1996 y válido hasta 2015 tras la aparición de POODLE (un fallo de seguridad muy grande que afectaba a todas las versiones de SSL).
  • TLS 1.0 (RFC 2246) se consideraba una evolución de SSL 3.0 para ser compatibles. En junio de 2018 se recomendó subir a TLS 1.1.
  • TLS 1.1 (RFC 4346) incluía, principalmente, mejoras sobre los ataques CBC (Cipher Block Chaining). Apple, Google, Microsoft y Mozilla dejaron de darle soporte en marzo de 2020.
  • TLS 1.2 (RFC 5216) lanzado en 2008 incluye unas cuantas mejoras y posteriormente los TLS dejas de ser compatible con SSL (RFC 6176).
  • TLS 1.3 (RFC 8446) lanzado en agosto de 2018 y es la versión que incluye más cambios de todas las versiones en cuanto a seguridad.

Hoy en día, gracias al lanzamiento de OpenSSL 1.1.1 que da soporte a TLS 1.3, todos los sitios web deberían intentar usar esta versión del sistema. Si no se dispone de esta versión, se debe utilizar el TLS 1.2.

Si quieres analizar la versión y seguridad de tu sitio según sus certificados, puedes usar la herramienta de SSL Labs.

Gratuito vs. Pago

En los últimos tiempos se ha extendido el uso de certificados TLS gratuitos. Desde el punto de vista técnico no hay ninguna diferencia con los certificados de pago, aunque habitualmente los gratuitos se han de renovar cada 3 meses, y los de pago cada año.

Un certificado de pago suele ir asociado con un seguro de entre $10.000 y $250.000. Este seguro viene dado por si se rompe el cifrado que hay entre el servidor y el navegador del usuario.

En la mayoría de casos, a menos que gestiones información altamente sensible, no sería necesario el uso de un certificado de pago.

Creación de un certificado Let’s Encrypt

Un ejemplo para generar los certificados con validación de ficheros es:

certbot certonly --authenticator webroot -d example.com,www.example.com --webroot-path /webs/example.com/ --cert-name example.com

Configuración para Apache HTTPD

Una configuración para Apache HTTPD puede ser similar a la siguiente:

<VirtualHost *:443>
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/example.com/fullchain.pem
  SSLCipherSuite  ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
  SSLProtocol All -SSLv2 -SSLv3 -TLSv1
  BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
  BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

Configuración para nginx

Una configuración para nginx puede ser similar a la siguiente:

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  # SSL
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
  ssl_session_cache shared:example:15m;
  ssl_session_timeout 720m;
  ssl_session_tickets off;
  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers off;
  ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
  # SSL OCSP Stapling
  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 9.9.9.9 8.8.8.8 valid=300s;
  resolver_timeout 2s;