Ver contenido
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:
- Certificado válido: Debe tener certificado válido y confiable
- Redirección HTTPS: Todo HTTP debe redirigir a HTTPS
- Header HSTS: Debe incluir
max-agede al menos 1 año (31536000) - includeSubDomains: Debe estar presente
- preload: La directiva debe estar presente
- 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:
- Usar DevTools del navegador para identificar recursos HTTP
- Actualizar todos los recursos a HTTPS
- 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:
- Instala la extensión UXR SEO Analyzer en Chrome
- Navega a cualquier página de tu sitio web
- Abre la extensión
- Ve a la pestaña “Basic SEO”
- 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
- HTTPS Explicado - Conceptos básicos de HTTPS e importancia
- URLs Canónicas Explicadas - Canonicalización de URLs después de migración
- Sitemaps XML: Guía Completa - Actualizar sitemaps para HTTPS
Recursos Adicionales
- Documentación de Let’s Encrypt - Certificados SSL/TLS gratuitos y automatizados
- Política de Certificados ISRG v3.1 - Estándares y requisitos de certificados
- SSL Labs Server Test - Prueba la configuración SSL de tu servidor
- Guía de Seguridad de web.dev - Mejores prácticas de desarrollo web de Google
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)