Este tutorial te muestra cómo generar un CSR para una aplicación Node.js. Node.js no cuenta con una herramienta integrada para la generación de CSR, por lo que debes crear la clave privada y la Solicitud de Firma de Certificado con OpenSSL en la máquina que ejecutará Node, enviar el CSR a tu Autoridad de Certificación y luego cargar el certificado emitido en tu aplicación con fs.readFileSync() y https.createServer().
Los pasos siguientes funcionan en cualquier sistema operativo que incluya OpenSSL, lo que abarca todas las distribuciones Linux actuales, macOS y Windows (a través de los binarios oficiales de OpenSSL o Git Bash). Las versiones modernas de OpenSSL firman las solicitudes con SHA-256 de forma predeterminada, por lo que no necesitas añadir un indicador de digest.
Paso 1: Asegúrate de que OpenSSL esté instalado
Comprueba que OpenSSL esté disponible en la máquina que ejecutará tu aplicación Node.js:
openssl version
Deberías ver una línea como OpenSSL 3.0.x o una versión más reciente. Si el comando no se encuentra, instálalo para tu plataforma:
- Debian, Ubuntu:
sudo apt update && sudo apt install openssl - RHEL, AlmaLinux, Rocky Linux, Amazon Linux:
sudo dnf install openssl(osudo yum install opensslen versiones más antiguas) - macOS: OpenSSL (LibreSSL en algunas versiones, OpenSSL 3 si se instaló mediante Homebrew) ya está presente en Terminal. Para instalar la versión original:
brew install openssl@3. - Windows: instala los binarios oficiales de OpenSSL, o utiliza Git Bash, que ya incluye OpenSSL preinstalado.
Paso 2: Genera la clave privada y el CSR
Genera la clave y el CSR en la máquina que ejecutará Node.js. La clave privada se crea junto al CSR y debe permanecer en esa máquina. Ejecutar estos comandos en otro lugar y luego copiar la clave a otro sitio anula el propósito de tener una clave privada en primer lugar.
Ejecuta el siguiente comando. Este crea una clave privada RSA de 2048 bits y un CSR correspondiente en un solo paso, con el subject y los Nombres Alternativos del Sujeto (SAN) proporcionados en línea, para que OpenSSL no se detenga a hacer preguntas:
openssl req -new -newkey rsa:2048 -nodes
-keyout yourdomain.key
-out yourdomain.csr
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=yourdomain.com"
-addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"
Qué hace cada parte:
- -newkey rsa:2048 genera una nueva clave RSA de 2048 bits. 2048 bits es el mínimo actual que aceptan las CA públicas; puedes usar rsa:4096 para una clave más grande, o cambiar a ECDSA (ver más abajo).
- -nodes deja la clave privada sin cifrar para que Node.js pueda leerla al iniciarse sin solicitar una contraseña. El módulo https de Node sí admite una opción passphrase para una clave cifrada, pero esa contraseña de todos modos tiene que provenir de algún lugar de la máquina (un archivo de configuración, una variable de entorno o un gestor de secretos).
- -keyout y -out nombran los archivos de la clave privada y del CSR.
- -subj proporciona el subject del certificado. Coloca aquí el nombre real de tu empresa, tu estado y tu ciudad, no los marcadores de posición. CN (Common Name) es tu dominio principal.
- -addext «subjectAltName=…» enumera todos los nombres de host que el certificado debe cubrir. Las CA públicas validan contra la lista de SAN, así que incluye también aquí el Common Name. El indicador -addext requiere OpenSSL 1.1.1 o posterior, versión que ya incluye cualquier sistema operativo actual.
Reemplaza yourdomain.com por tu dominio real en todo el comando. Para cubrir nombres de host adicionales, añádelos a la lista de SAN separados por comas, por ejemplo DNS:api.yourdomain.com. Para un comodín (wildcard), incluye tanto el comodín como el dominio simple: DNS:*.yourdomain.com,DNS:yourdomain.com.
Si prefieres una clave ECDSA (más pequeña y rápida, con P-256 ampliamente compatible), genera la clave y el CSR de la siguiente manera:
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -pkeyopt ec_param_enc:named_curve -nodes
-keyout yourdomain.key
-out yourdomain.csr
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=yourdomain.com"
-addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"
Modo interactivo (sin -subj)
Si prefieres que OpenSSL te solicite cada campo, omite el indicador -subj:
openssl req -new -newkey rsa:2048 -nodes
-keyout yourdomain.key -out yourdomain.csr
-addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"
OpenSSL solicitará los siguientes datos:
- Country Name (C): el código de país ISO de dos letras de tu organización (por ejemplo, US).
- State or Province Name (S): el nombre completo del estado o provincia donde está registrada tu empresa (por ejemplo, California). No lo abrevies.
- Locality Name (L): la ciudad donde está registrado tu negocio (por ejemplo, San Jose).
- Organization Name (O): el nombre legal de tu empresa (por ejemplo, GPI Holding LLC). Para un certificado DV (Domain Validated), déjalo en blanco y pulsa Enter.
- Organizational Unit Name (OU): quedó obsoleto desde septiembre de 2022 y las CA públicas lo ignoran. Déjalo en blanco.
- Common Name (CN): el nombre de dominio completamente calificado (FQDN) que estás protegiendo, por ejemplo yourdomain.com. Para un comodín, usa *.yourdomain.com.
- Email Address: opcional. Déjalo en blanco.
- A challenge password: obsoleto. Déjalo en blanco.
Paso 3: Localiza y protege tus archivos
Enumera el directorio actual para confirmar que se crearon ambos archivos:
ls
Deberías ver dos archivos nuevos:
- yourdomain.key: tu clave privada. Consérvala en el servidor, haz una copia de seguridad segura y nunca la envíes a nadie, incluida la Autoridad de Certificación. Quien posea la clave puede suplantar tu sitio.
- yourdomain.csr: tu Solicitud de Firma de Certificado. Este es el archivo que envías al proveedor de SSL.
En Linux o macOS, establece de inmediato permisos estrictos en la clave privada para que solo el usuario que ejecuta Node.js pueda leerla:
chmod 600 yourdomain.key
Si Node.js se ejecuta bajo una cuenta de servicio dedicada (por ejemplo, node o www-data), establece también el propietario para que el proceso pueda leer la clave:
sudo chown node:node yourdomain.key
Paso 4: Verifica el CSR (opcional, pero recomendado)
Antes de enviarlo, comprueba que el CSR contenga el subject y los SAN correctos, y que su firma sea válida. Esto decodifica la solicitud localmente con OpenSSL:
openssl req -noout -text -verify -in yourdomain.csr
Confirma que la línea Subject muestra tus datos, que X509v3 Subject Alternative Name enumera cada nombre de host que esperas, y que la verificación de la firma imprime verify OK. El algoritmo de firma debería mostrar sha256WithRSAEncryption (o ecdsa-with-SHA256 para una clave ECDSA). Si prefieres no usar la línea de comandos, pega el CSR en nuestro decodificador de CSR en línea para leer los mismos campos en un navegador.
Paso 5: Envía tu CSR
Para copiar el CSR para tu pedido, imprime su contenido:
cat yourdomain.csr
Verás un bloque de texto como este:
-----BEGIN CERTIFICATE REQUEST-----
MIIBozCB... (a long string of characters)
-----END CERTIFICATE REQUEST-----
Copia todo el bloque, incluidas las líneas —–BEGIN CERTIFICATE REQUEST—– y —–END CERTIFICATE REQUEST—– (cada marcador tiene cinco guiones a cada lado). Todo ese bloque es tu CSR. Pégalo en el formulario de pedido durante tu compra, y mantén la clave privada correspondiente en su lugar en el servidor.
Si prefieres no usar la línea de comandos, también puedes generar la solicitud con nuestro Generador de CSR en línea. Ten en cuenta que este genera la clave privada en tu navegador, así que guarda esa clave tú mismo y muévela al servidor Node.js.
Qué sucede después de que la CA emite el certificado
Una vez que la CA valida el CSR y emite el certificado, normalmente recibirás tu certificado de servidor (un archivo .crt con el nombre de tu dominio) junto con uno o más certificados intermedios, a veces agrupados en un archivo .ca-bundle. Node.js carga estos archivos en JavaScript: concatena el certificado del servidor y los intermedios en un único archivo fullchain.crt, luego léelo con fs.readFileSync() y pásalo a https.createServer():
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('/path/to/yourdomain.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);
Ese patrón de fullchain es el que utilizan la mayoría de las configuraciones de producción. La guía completa (incluyendo un ejemplo con módulos ES, un enfoque alternativo con un arreglo ca: y un ejemplo con Express) se explica en nuestro tutorial de instalación de SSL para Node.js.
Una nota sobre los despliegues en producción. En 2026, la mayoría de las aplicaciones Node.js que gestionan tráfico público se ejecutan detrás de un proxy inverso o un balanceador de carga en la nube (NGINX, HAProxy, Caddy, AWS ALB, Cloudflare, Fastly) que termina el TLS en el borde y reenvía HTTP simple o HTTP/2 a Node en un puerto local alto. En ese patrón, el certificado (y el CSR que generaste anteriormente) reside en el proxy o en el balanceador de carga, no en el propio proceso de Node. Dejar que Node.js termine el TLS directamente está perfectamente bien para desarrollo, servicios internos y despliegues pequeños; para una aplicación pública en producción, terminar el TLS en el borde es la forma más habitual.
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


