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:
- 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)