bg-tutorials

Cómo instalar un certificado SSL en Node.js

En este tutorial aprenderás cómo instalar un certificado SSL en Node.js usando el módulo integrado https. A diferencia de un servidor web como Apache o Nginx, Node.js carga tu certificado, tu clave privada y la cadena CA directamente en JavaScript, por lo que la «instalación» ocurre dentro del código de tu aplicación.

Generar un código CSR en Node.js

Si aún no has solicitado un certificado SSL, primero debes generar un CSR (Certificate Signing Request). El CSR es un pequeño bloque de texto codificado que contiene tus datos de contacto y tu clave pública, y lo envías a la Autoridad de Certificación al hacer tu pedido. Tienes dos opciones:

Envía el CSR a la Autoridad de Certificación durante tu pedido. Después de que la CA lo valide y emita tu certificado SSL, continúa con la instalación que se detalla a continuación.

Instalar un certificado SSL en Node.js

Paso 1: Prepara los archivos de tu certificado

Tras la validación, la Autoridad de Certificación te envía por correo electrónico los archivos del certificado. Extrae el archivo comprimido. Deberías tener:

  • yourdomain.crt, el certificado de tu dominio principal.
  • yourdomain.ca-bundle, los certificados intermedios (y raíz) que forman el paquete CA.
  • yourdomain.key, la clave privada que generaste junto con el CSR.

Los navegadores deben recibir la cadena intermedia, no solo el certificado de tu dominio, o algunos clientes rechazarán la conexión. La forma más limpia de servir la cadena en Node.js es combinar tu certificado y el paquete CA en un único archivo de cadena completa:

cat yourdomain.crt yourdomain.ca-bundle > fullchain.crt

Coloca los archivos fullchain.crt y yourdomain.key en un lugar donde tu aplicación pueda leerlos, y mantén la clave privada legible únicamente por el usuario que ejecuta Node.js.

Paso 2: Crea un servidor HTTPS en Node.js

Crea un archivo de servidor. Para esta demostración lo llamamos https_server.js, pero puedes usar cualquier nombre de archivo. El ejemplo siguiente usa CommonJS (require), que funciona en todas las versiones de Node.js compatibles. Reemplaza las rutas en negrita con las tuyas:

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

const options = {
  key: fs.readFileSync('/path/to/private.key'),
  cert: fs.readFileSync('/path/to/fullchain.crt'),
  // Recommended TLS hardening (2026): never negotiate below TLS 1.2
  minVersion: 'TLSv1.2'
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('Welcome to a Node.js HTTPS servern');
}).listen(443);

Debes reemplazar las partes en negrita con tu propia información:

  • /path/to/private.key: la ruta completa a tu archivo de clave privada.
  • /path/to/fullchain.crt: la ruta completa al archivo de cadena completa que creaste en el Paso 1.

Nota sobre el puerto: HTTPS usa el puerto 443 de forma predeterminada. Vincularse a él requiere permisos elevados, por lo que detrás de un proxy inverso o en desarrollo puede que prefieras un puerto alto como 8443. Solo cambia el valor pasado a listen().

¿Prefieres módulos ES? Si tu proyecto usa "type": "module" en package.json (o un archivo .mjs), usa la sintaxis import en su lugar. Las opciones TLS son idénticas:

import https from 'node:https';
import fs from 'node:fs';

const options = {
  key: fs.readFileSync('/path/to/private.key'),
  cert: fs.readFileSync('/path/to/fullchain.crt'),
  minVersion: 'TLSv1.2'
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('Welcome to a Node.js HTTPS servern');
}).listen(443);

Alternativa: pasar la cadena con la opción ca. Si prefieres mantener los archivos separados en lugar de crear un archivo de cadena completa, deja cert apuntando a tu certificado de dominio y proporciona los intermedios mediante un array ca:

const options = {
  key: fs.readFileSync('/path/to/private.key'),
  cert: fs.readFileSync('/path/to/yourdomain.crt'),
  ca: [
    fs.readFileSync('/path/to/intermediate.crt'),
    fs.readFileSync('/path/to/ca_bundle.crt')
  ],
  minVersion: 'TLSv1.2'
};

¿Usas Express? Pasa tu app de Express como el manejador de solicitudes. Las opciones del certificado siguen siendo exactamente las mismas:

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

const app = express();
app.get('/', (req, res) => res.send('Hello over HTTPS'));

const options = {
  key: fs.readFileSync('/path/to/private.key'),
  cert: fs.readFileSync('/path/to/fullchain.crt'),
  minVersion: 'TLSv1.2'
};

https.createServer(options, app).listen(443);

Paso 3: Inicia tu servidor HTTPS de Node.js

Ejecuta el siguiente comando para lanzar la aplicación:

node https_server.js

Tu aplicación ahora ofrece tráfico a través de HTTPS. Para una implementación en producción, ejecútala bajo un gestor de procesos (por ejemplo PM2 o un servicio systemd) para que se reinicie automáticamente y sobreviva a los reinicios del sistema.

Paso 4: Prueba tu instalación SSL

Prueba tu instalación SSL para detectar posibles errores o vulnerabilidades con una de nuestras herramientas de verificación SSL. También puedes confirmar la cadena desde la línea de comandos:

echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -issuer -dates

Esto imprime el emisor del certificado y las fechas de validez, confirmando que tu servidor Node.js está presentando el certificado correcto.

¿Dónde comprar un certificado SSL para Node.js?

SSL Dragon es tu fuente para todas tus necesidades de SSL. Ofrecemos algunos de los precios más bajos del mercado en toda nuestra gama de productos SSL, y nos hemos asociado con las mejores marcas SSL de la industria para brindar seguridad sólida y soporte dedicado. Todos nuestros certificados SSL son totalmente compatibles con aplicaciones Node.js.

Emisión rápida, cifrado sólido, 99,99% de confianza de los navegadores, soporte dedicado y una garantía de devolución de dinero de 25 días.

Preguntas frecuentes

¿Cómo habilito HTTPS en Node.js?

Usa el módulo integrado https. Lee tu clave privada y el certificado de cadena completa con fs.readFileSync(), pásalos como las opciones key y cert a https.createServer(), y llama a .listen(443). Node.js gestiona el handshake TLS por ti; no hay un servidor web separado que configurar.

¿Necesito la opción ca en Node.js?

Necesitas que se sirva la cadena intermedia, pero no necesariamente necesitas la opción ca para hacerlo. El enfoque más simple es concatenar tu certificado de dominio y el paquete CA en un solo archivo de cadena completa y apuntar cert hacia él. Usa el array ca solo si prefieres mantener el certificado y los intermedios en archivos separados.

¿Por qué mi servidor Node.js no puede vincularse al puerto 443?

En Linux y macOS, los puertos por debajo de 1024 son privilegiados. Vincularse directamente al puerto 443 requiere permisos elevados, por lo que muchas configuraciones ejecutan Node.js en un puerto alto como 8443 detrás de un proxy inverso (Nginx o un balanceador de carga) que termina o reenvía el TLS. Para desarrollo, simplemente cambia el valor pasado a listen().

¿Puedo usar import en lugar de require para el servidor HTTPS?

Sí. CommonJS (require) funciona en todas las versiones de Node.js compatibles, pero si tu proyecto está configurado como un módulo ES («type»: «module» en package.json o un archivo .mjs), puedes usar import https from ‘node:https’ en su lugar. Las opciones TLS son idénticas en cualquier caso.

¿Cómo compruebo que el certificado SSL funciona en Node.js?

Abre tu sitio en un navegador y verifica el candado, pásalo por nuestras herramientas de verificación SSL, o consúltalo desde la terminal con echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com para inspeccionar el certificado que presenta el servidor.

Conclusión

Instalar un certificado SSL en Node.js se reduce a crear un certificado de cadena completa, leerlo junto con tu clave privada con fs.readFileSync(), pasarlos a https.createServer() con minVersion: ‘TLSv1.2’, e iniciar la aplicación con node https_server.js.

¿Necesitas un certificado primero? Explora nuestros certificados SSL.

Ahorre un 10% en certificados SSL al realizar su pedido hoy mismo.

Emisión rápida, cifrado potente, 99,99% de confianza del navegador, asistencia dedicada y garantía de devolución del dinero en 25 días. Código del cupón: SAVE10

Una imagen detallada de un dragón en vuelo
Escrito por

Redactor de contenidos experimentado especializado en Certificados SSL. Transformar temas complejos de ciberseguridad en contenido claro y atractivo. Contribuir a mejorar la seguridad digital a través de narrativas impactantes.