Guía detallada

Https Implementation Guide

Ver contenido

Guía de Implementación HTTPS: Configuración Completa de Seguridad

Introducción

Implementar HTTPS correctamente va más allá de simplemente instalar un certificado SSL. Una implementación apropiada requiere entender la configuración de TLS, headers de seguridad, gestión de certificados y mantenimiento continuo. Esta guía proporciona un enfoque integral para asegurar tu sitio web con HTTPS siguiendo las mejores prácticas de la industria.

Según Let’s Encrypt y el Internet Security Research Group (ISRG), la implementación adecuada de Transport Layer Security es crítica para proteger datos en tránsito y mantener la confianza del usuario.

Fundamentos de TLS

Selección de Versión TLS

TLS (Transport Layer Security) ha evolucionado a través de varias versiones. No todas las versiones se consideran seguras hoy:

Versión Estado Recomendación
SSL 2.0 Obsoleto No usar - Vulnerabilidades conocidas
SSL 3.0 Obsoleto No usar - Vulnerabilidad POODLE
TLS 1.0 Legacy Evitar - Deprecado por navegadores principales
TLS 1.1 Legacy Evitar - Deprecado por navegadores principales
TLS 1.2 Actual Aceptable - Todavía ampliamente soportado
TLS 1.3 Actual Preferido - Más reciente y más seguro

Configuración recomendada: Soportar solo TLS 1.2 y TLS 1.3.

Proceso de Handshake TLS

Entender el handshake TLS ayuda a diagnosticar problemas de conexión:

1. Client Hello
   ├── El cliente envía versiones TLS soportadas
   ├── Suites de cifrado soportadas
   └── Número aleatorio para generación de claves

2. Server Hello
   ├── El servidor selecciona versión TLS
   ├── Selecciona suite de cifrado
   └── Envía certificado

3. Verificación del Certificado
   ├── El cliente verifica la cadena de certificados
   ├── Verifica fecha de expiración
   └── Valida coincidencia de dominio

4. Intercambio de Claves
   ├── Se generan claves de sesión
   └── Se establece canal encriptado

5. Comunicación Segura
   └── Todos los datos encriptados con claves de sesión

Tipos de Certificados y Selección

Validación de Dominio (DV)

  • Verificación: Solo propiedad del dominio
  • Tiempo de emisión: Minutos a horas
  • Costo: Gratis (Let’s Encrypt) a bajo costo
  • Caso de uso: Blogs, sitios personales, sitios de pequeñas empresas
  • Indicador visual: Icono de candado

Validación de Organización (OV)

  • Verificación: Propiedad del dominio + identidad de organización
  • Tiempo de emisión: 1-3 días
  • Costo: Moderado
  • Caso de uso: Sitios web empresariales, sitios corporativos
  • Indicador visual: Icono de candado (nombre de organización en detalles del certificado)

Validación Extendida (EV)

  • Verificación: Verificación legal y física extensa
  • Tiempo de emisión: 1-2 semanas
  • Costo: Mayor
  • Caso de uso: E-commerce, banca, sitios de alta confianza
  • Indicador visual: Icono de candado (históricamente mostraba barra verde, ahora organización en certificado)

Certificados Wildcard

Los certificados wildcard aseguran un dominio y todos sus subdominios:

*.ejemplo.com cubre:
  ├── www.ejemplo.com
  ├── blog.ejemplo.com
  ├── tienda.ejemplo.com
  └── api.ejemplo.com

NO cubre:
  ├── ejemplo.com (dominio raíz - necesita entrada separada o SAN)
  └── sub.blog.ejemplo.com (subdominios multinivel)

Certificados Multi-Dominio (SAN)

Los certificados Subject Alternative Name (SAN) cubren múltiples dominios específicos:

Un solo certificado cubre:
  ├── ejemplo.com
  ├── www.ejemplo.com
  ├── ejemplo.net
  └── tienda.ejemplo.org

Configuración del Servidor

Configuración Apache

Configuración HTTPS completa para Apache:

# Habilitar módulo SSL
LoadModule ssl_module modules/mod_ssl.so

<VirtualHost *:443>
    ServerName ejemplo.com
    ServerAlias www.ejemplo.com
    DocumentRoot /var/www/html

    # Certificado SSL
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/ejemplo.com.crt
    SSLCertificateKeyFile /etc/ssl/private/ejemplo.com.key
    SSLCertificateChainFile /etc/ssl/certs/chain.crt

    # Versiones de Protocolo TLS
    SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

    # Configuración de Suite de Cifrado
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
    SSLHonorCipherOrder on

    # Header HSTS
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

    # Headers de Seguridad Adicionales
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-XSS-Protection "1; mode=block"
</VirtualHost>

# Redirección HTTP a HTTPS
<VirtualHost *:80>
    ServerName ejemplo.com
    ServerAlias www.ejemplo.com
    Redirect permanent / https://ejemplo.com/
</VirtualHost>

Configuración Nginx

Configuración HTTPS completa para Nginx:

# Redirección HTTP
server {
    listen 80;
    listen [::]:80;
    server_name ejemplo.com www.ejemplo.com;
    return 301 https://ejemplo.com$request_uri;
}

# Servidor HTTPS
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name ejemplo.com www.ejemplo.com;

    # Certificado SSL
    ssl_certificate /etc/ssl/certs/ejemplo.com.crt;
    ssl_certificate_key /etc/ssl/private/ejemplo.com.key;

    # Versiones de Protocolo TLS
    ssl_protocols TLSv1.2 TLSv1.3;

    # Configuración de Suite de Cifrado
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;

    # Caché de Sesión SSL
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/ssl/certs/chain.crt;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    # Headers de Seguridad
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;

    root /var/www/html;
    index index.html;
}

HTTP Strict Transport Security (HSTS)

HSTS en Profundidad

HSTS previene ataques de degradación de protocolo y secuestro de cookies instruyendo a los navegadores a usar solo HTTPS:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Desglose de directivas:

Directiva Valor Propósito
max-age 31536000 (1 año) Cuánto tiempo los navegadores recuerdan HTTPS-only
includeSubDomains (flag) Aplicar a todos los subdominios
preload (flag) Permitir inclusión en lista de precarga del navegador

Estrategia de Implementación HSTS

Implementa HSTS gradualmente para evitar bloqueos:

Semana 1: max-age=300 (5 minutos)
   └── Probar por problemas

Semana 2: max-age=86400 (1 día)
   └── Verificar sin problemas

Semana 3: max-age=604800 (1 semana)
   └── Monitorear por problemas

Semana 4+: max-age=31536000 (1 año)
   └── Agregar includeSubDomains si aplica

Final: Agregar directiva preload
   └── Enviar a listas de precarga del navegador

Envío a HSTS Preload

Requisitos para inclusión en lista de precarga HSTS:

  1. Certificado válido: Debe tener certificado válido y confiable
  2. Redirección HTTPS: Todo HTTP debe redirigir a HTTPS
  3. Header HSTS: Debe incluir max-age de al menos 1 año (31536000)
  4. includeSubDomains: Debe estar presente
  5. preload: La directiva debe estar presente
  6. Todos los subdominios: Todos los subdominios deben soportar HTTPS

Enviar en: hstspreload.org

Advertencia: La eliminación del preload toma meses. Solo envía cuando estés completamente comprometido con HTTPS.

Gestión de Certificados

Let’s Encrypt con Certbot

Gestión automatizada de certificados con Let’s Encrypt:

# Instalar Certbot (Ubuntu/Debian)
sudo apt update
sudo apt install certbot python3-certbot-nginx

# Obtener certificado para Nginx
sudo certbot --nginx -d ejemplo.com -d www.ejemplo.com

# Obtener certificado para Apache
sudo certbot --apache -d ejemplo.com -d www.ejemplo.com

# Renovación de certificado (automático vía cron)
sudo certbot renew

# Probar renovación
sudo certbot renew --dry-run

Monitoreo de Certificados

Métricas clave a monitorear:

Verificaciones de Salud del Certificado:
├── Fecha de expiración (alerta a 30, 14, 7 días)
├── Validez de cadena de certificados
├── Coincidencia de nombre de dominio
├── Fortaleza de clave (mínimo RSA 2048-bit o ECC 256-bit)
└── Estado de revocación (OCSP/CRL)

Herramientas de Monitoreo:
├── SSL Labs Server Test
├── certbot certificates (verificación local)
├── Comandos OpenSSL
└── Servicios de monitoreo de certificados

Comandos de Verificación OpenSSL

# Verificar expiración del certificado
openssl s_client -connect ejemplo.com:443 2>/dev/null | openssl x509 -noout -dates

# Ver detalles completos del certificado
openssl s_client -connect ejemplo.com:443 2>/dev/null | openssl x509 -noout -text

# Verificar cadena de certificados
openssl s_client -connect ejemplo.com:443 -showcerts

# Verificar soporte de versión TLS específica
openssl s_client -connect ejemplo.com:443 -tls1_2
openssl s_client -connect ejemplo.com:443 -tls1_3

Resolución de Contenido Mixto

Identificando Contenido Mixto

El contenido mixto ocurre cuando páginas HTTPS cargan recursos HTTP:

Contenido mixto activo (bloqueado por navegadores):

  • Scripts (<script src="http://...">)
  • Hojas de estilo (<link href="http://...">)
  • iframes (<iframe src="http://...">)
  • Solicitudes XMLHttpRequest/Fetch

Contenido mixto pasivo (advertencia, puede cargarse):

  • Imágenes (<img src="http://...">)
  • Audio (<audio src="http://...">)
  • Video (<video src="http://...">)

Encontrando Contenido Mixto

Método de Herramientas de Desarrollador del navegador:

1. Abrir Chrome DevTools (F12)
2. Ir a pestaña Console
3. Buscar advertencias de "Mixed Content"
4. Pestaña Network muestra recursos bloqueados

O usar pestaña Security:
1. DevTools > pestaña Security
2. Ver sección "Mixed Content"
3. Ver lista de recursos inseguros

Corrigiendo Contenido Mixto

Actualizar URLs hardcodeadas:

<!-- Antes -->
<img src="http://ejemplo.com/imagen.jpg">
<script src="http://cdn.ejemplo.com/app.js"></script>
<link href="http://fonts.googleapis.com/css?family=Open+Sans">

<!-- Después -->
<img src="https://ejemplo.com/imagen.jpg">
<script src="https://cdn.ejemplo.com/app.js"></script>
<link href="https://fonts.googleapis.com/css?family=Open+Sans">

URLs relativas al protocolo (usar con precaución):

<img src="//ejemplo.com/imagen.jpg">

Content Security Policy para detección:

Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-report

Headers de Seguridad Más Allá de HTTPS

Content Security Policy (CSP)

Controla qué recursos pueden cargarse:

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' https://fonts.googleapis.com

Headers de Seguridad Adicionales

# Prevenir sniffing de tipo MIME
X-Content-Type-Options: nosniff

# Protección contra clickjacking
X-Frame-Options: SAMEORIGIN

# Filtro XSS (navegadores legacy)
X-XSS-Protection: 1; mode=block

# Política de referrer
Referrer-Policy: strict-origin-when-cross-origin

# Política de permisos
Permissions-Policy: geolocation=(), microphone=(), camera=()

Optimización de Rendimiento

Reanudación de Sesión TLS

Reducir overhead del handshake con caché de sesión:

# Nginx
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;  # Deshabilitar para perfect forward secrecy

OCSP Stapling

Mejorar rendimiento de verificación de certificados:

# Nginx
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/certs/chain.crt;
resolver 8.8.8.8 8.8.4.4 valid=300s;

Beneficios de HTTP/2

HTTP/2 requiere HTTPS y proporciona:

  • Multiplexación: Múltiples solicitudes sobre una sola conexión
  • Compresión de headers: Overhead reducido
  • Server push: Entrega proactiva de recursos
  • Protocolo binario: Parsing más eficiente

Habilitar HTTP/2:

# Nginx
listen 443 ssl http2;
# Apache
Protocols h2 http/1.1

Lista de Verificación de Migración

Pre-Migración

□ Auditar todos los enlaces internos y recursos
□ Identificar integraciones de terceros que requieren actualización
□ Obtener y probar certificado SSL
□ Configurar ambiente de staging con HTTPS
□ Probar toda funcionalidad en staging
□ Planificar implementación de redirecciones
□ Notificar a servicios terceros del cambio de URL

Migración

□ Instalar certificado SSL en producción
□ Implementar redirecciones HTTP a HTTPS
□ Actualizar todos los enlaces internos a HTTPS
□ Actualizar URLs canónicas
□ Actualizar sitemaps XML
□ Actualizar referencias en robots.txt
□ Actualizar URLs en datos estructurados
□ Probar por problemas de contenido mixto

Post-Migración

□ Enviar nuevos sitemaps a motores de búsqueda
□ Agregar propiedad HTTPS en Google Search Console
□ Monitorear errores de rastreo
□ Verificar analíticas por problemas de tracking
□ Verificar integraciones de terceros funcionando
□ Implementar header HSTS (gradualmente)
□ Monitorear expiración de certificados
□ Programar auditorías de seguridad regulares

Solución de Problemas Comunes

Errores de Cadena de Certificados

Problema: “Cadena de certificados incompleta” o “Autoridad desconocida”

Solución: Asegurar que los certificados intermedios estén incluidos:

# Orden correcto de cadena de certificados
cat dominio.crt intermedio.crt > cadena_completa.crt

Advertencias de Contenido Mixto

Problema: La página muestra “No completamente seguro”

Solución:

  1. Usar DevTools del navegador para identificar recursos HTTP
  2. Actualizar todos los recursos a HTTPS
  3. Usar modo report-only de CSP para encontrar problemas

Problemas con HSTS

Problema: No se puede acceder al sitio después de habilitar HSTS con error

Solución:

  • Limpiar caché HSTS del navegador
  • Chrome: chrome://net-internals/#hsts
  • Comenzar con valores de max-age cortos

Bucles de Redirección

Problema: “Demasiadas redirecciones”

Solución:

  • Verificar redirecciones conflictivas en config del servidor y aplicación
  • Asegurar que las reglas de redirección no creen bucles
  • Verificar configuración de redirección del CDN

Cómo Verificar con UXR SEO Analyzer

La extensión UXR SEO Analyzer proporciona verificación completa de HTTPS:

  1. Instala la extensión UXR SEO Analyzer en Chrome
  2. Navega a cualquier página de tu sitio web
  3. Abre la extensión
  4. Ve a la pestaña “Basic SEO
  5. Revisa el evaluador “HTTPS

Qué verifica la extensión:

  • Protocolo (HTTPS vs HTTP)
  • Validez del certificado
  • Presencia de contenido mixto
  • Implementación de redirección
  • Presencia de headers de seguridad

Artículos Relacionados

Recursos Adicionales


Nota: Este artículo es parte de nuestra serie de análisis SEO. Explora todos los artículos en el Hub de Fundamentos SEO Básicos.


Fuentes: Documentación de Let’s Encrypt (Internet Security Research Group Certificate Policy v3.1)

Artículos relacionados

Versión relacionada

Introducción

Https Explained

HTTPS (HyperText Transfer Protocol Secure) es la versión segura de HTTP, el protocolo utilizado para transferir datos entre tu navegador y los sitios web

Hub de categoría

Hub

Basic Seo Fundamentals Hub

Todo sitio web exitoso se construye sobre una base sólida de fundamentos SEO

En la misma categoría

Guía detallada

Canonical Url Guide

La URL canónica (etiqueta canónica) es uno de los elementos técnicos más poderosos y con frecuencia mal implementados en SEO

Guía detallada

Xml Sitemap Optimization Guide

Si ya conoces los fundamentos de los XML Sitemaps desde nuestra guía introductoria, esta guía avanzada te llevará al siguiente nivel

Otros temas

Guía detallada

Robots Txt Best Practices Guide

Esta guía técnica profundiza en las estrategias avanzadas de robots.txt para maximizar la eficiencia del rastreo y proteger tu contenido