Saltar al contenido principal

🔒 ¿Qué es HTTPS y SSL/TLS?

📖 Definición

HTTPS (HyperText Transfer Protocol Secure, Protocolo de Transferencia de Hipertexto Seguro) es un protocolo que añade una capa de seguridad a HTTP. SSL (Secure Sockets Layer, Capa de Conexión Segura) y TLS (Transport Layer Security, Seguridad de Capa de Transporte) son protocolos que cifran la comunicación por Internet, siendo TLS el sucesor de SSL. Estos cifran los datos transmitidos entre sitios web y usuarios para una transferencia segura.

🎯 Comprender con Analogía

Correo Normal vs Correo Certificado

  • HTTP: Como una postal donde cualquiera puede leer el contenido
  • HTTPS: Como correo certificado sellado que solo el destinatario puede abrir
  • Certificado SSL/TLS: Sello de certificación oficial en el correo

Si envías una contraseña por correo normal (HTTP), el personal de correos u otras personas pueden verla, pero el correo certificado sellado (HTTPS) solo puede abrirlo el destinatario.

⚙️ Cómo Funciona

1. Proceso de Handshake SSL/TLS

1. Cliente → Servidor: "Quiero iniciar una conexión segura"
- Envía lista de métodos de cifrado compatibles

2. Servidor → Cliente: "Aquí está mi certificado"
- Envía certificado SSL/TLS y clave pública

3. Cliente: Valida el certificado
- Verifica si fue emitido por una CA (Autoridad Certificadora) confiable
- Verifica la validez del certificado

4. Cliente → Servidor: Crea clave de sesión cifrada
- Cifra la clave de sesión con la clave pública del servidor y la envía

5. Servidor: Descifra la clave de sesión
- Descifra la clave de sesión con su clave privada

6. Comienza la comunicación segura
- Todos los datos se cifran con la clave de sesión para transmitirse

2. Métodos de Cifrado

Cifrado Asimétrico (Handshake)
├─ Clave pública: Cifra datos
└─ Clave privada: Descifra datos

Cifrado Simétrico (Comunicación Real)
└─ Clave de sesión: Cifrado/descifrado rápido

💡 Ejemplos Reales

Comparación HTTP vs HTTPS

// ❌ HTTP - No seguro
// http://example.com/login
// Contraseña enviada en texto plano
POST /login
Content-Type: application/json

{
"username": "user123",
"password": "mypassword123" // ¡Cualquiera puede ver!
}

// ✅ HTTPS - Seguro
// https://example.com/login
// Todos los datos cifrados
POST /login
Content-Type: application/json

{
"username": "user123",
"password": "mypassword123" // Cifrado durante la transmisión
}

Verificar Certificado SSL/TLS

Al hacer clic en el icono de candado en el navegador:

✅ Sitio seguro
- Emitido para: example.com
- Emitido por: Let's Encrypt (CA confiable)
- Válido: 2024-01-01 ~ 2024-12-31
- Cifrado: TLS 1.3

⚠️ Precaución necesaria
- Certificado expirado
- Certificado autofirmado
- El dominio del certificado y el dominio del sitio no coinciden

Crear Servidor HTTPS en Node.js

const https = require('https');
const fs = require('fs');

// Cargar certificado SSL/TLS
const options = {
key: fs.readFileSync('private-key.pem'), // Clave privada
cert: fs.readFileSync('certificate.pem') // Certificado
};

// Crear servidor HTTPS
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('¡Conexión HTTPS segura!');
}).listen(443);

console.log('Servidor HTTPS ejecutándose en puerto 443');

🤔 Preguntas Frecuentes

Q1. ¿Cuál es la diferencia entre SSL y TLS?

R: SSL es el protocolo antiguo, TLS es la versión mejorada más reciente. Sin embargo, todavía se dice comúnmente "certificado SSL" aunque en realidad se usa TLS.

SSL 1.0 (No usado)
SSL 2.0 (No usado)
SSL 3.0 (No usado)
TLS 1.0 (Legado)
TLS 1.1 (Legado)
TLS 1.2 (Actualmente usado) ✅
TLS 1.3 (Más reciente, más seguro) ✅

Q2. ¿Por qué todos los sitios deberían usar HTTPS?

R: HTTPS protege lo siguiente:

1. Confidencialidad
└─ Terceros no pueden ver los datos

2. Integridad
└─ Garantiza que los datos no sean manipulados en tránsito

3. Autenticación
└─ Prueba que el sitio accedido es genuino

4. Beneficios SEO
└─ Google da puntos extra a sitios HTTPS

Q3. ¿Qué es Let's Encrypt?

R: Una Autoridad de Certificación (CA) que emite certificados SSL/TLS gratuitos.

# Instalación automática con Certbot
sudo certbot --nginx -d example.com

# Renovación automática (cada 90 días)
sudo certbot renew --dry-run

Q4. ¿Qué es la advertencia de Contenido Mixto?

R: Advertencia de seguridad al cargar recursos HTTP en una página HTTPS.

<!-- ❌ Contenido Mixto - Advertencia de seguridad -->
<html>
<head>
<!-- Página HTTPS -->
</head>
<body>
<!-- Cargando imagen HTTP - ¡Advertencia! -->
<img src="http://example.com/image.jpg">

<!-- Script HTTP - ¡Bloqueado! -->
<script src="http://example.com/script.js"></script>
</body>
</html>

<!-- ✅ Forma correcta -->
<html>
<body>
<!-- Usar HTTPS -->
<img src="https://example.com/image.jpg">

<!-- O usar URL relativa a protocolo -->
<img src="//example.com/image.jpg">
</body>
</html>

Q5. ¿HTTPS es más lento?

R: En el pasado sí, pero el TLS 1.3 moderno y la aceleración por hardware hacen que la diferencia sea insignificante.

Handshake TLS 1.2: 2-RTT (tiempo de ida y vuelta)
Handshake TLS 1.3: 1-RTT
Reconexión TLS 1.3: 0-RTT (¡conexión instantánea!)

+ HTTP/2 solo soporta HTTPS → En realidad más rápido

🎓 Próximos Pasos

Después de entender HTTPS, aprende:

  1. ¿Qué es CORS? (documento en preparación) - Seguridad web importante junto con HTTPS
  2. Token JWT (documento en preparación) - Método de autenticación seguro
  3. ¿Qué es DNS? - Dominio y seguridad

Práctica

# 1. Crear certificado autofirmado (para desarrollo)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

# 2. Ejecutar servidor HTTPS
node https-server.js

# 3. Verificar en navegador
# https://localhost (ignorar advertencia de autofirmado y continuar)

🎬 Resumen

HTTPS y SSL/TLS son tecnologías de seguridad esenciales para la web moderna:

  • HTTPS: Protocolo que añade capa de seguridad a HTTP
  • SSL/TLS: Protocolos de seguridad que cifran datos
  • Certificado: ID digital que prueba la identidad del sitio web
  • Cifrado: Tecnología que protege los datos de forma segura

Todos los sitios web deberían usar HTTPS para proteger a los usuarios. ¡Gracias a Let's Encrypt, ahora es fácil aplicarlo gratis! 🔒✨