Generador de CSR SSL

Genera una Solicitud de Firma de Certificado (CSR) y su clave privada enteramente en tu navegador, RSA 2048/4096 o ECDSA P-256, con SAN. Nunca se sube.

🌐 English

🔒 Privado por diseño: tu texto se procesa localmente en tu navegador; nada se sube nunca a ningún servidor.

Cómo generar una CSR

  1. Pega los datos de tu certificado en el cuadro de texto, un campo por línea, como fieldName: valor, solo commonName (tu dominio, por ejemplo example.com) es obligatorio.
  2. Opcionalmente añade organization, organizationalUnit, locality, state y country (un código de 2 letras, por ejemplo US) para un Nombre Distinguido más completo.
  3. Opcionalmente añade dominios extra con san: www.example.com, api.example.com, tu Common Name se añade siempre automáticamente.
  4. Elige un tipo de clave: RSA 2048 bits (el valor por defecto, ampliamente compatible), RSA 4096 bits o ECDSA P-256.
  5. Pulsa el botón. Se genera un par de claves real y se ensambla a su alrededor una Solicitud de Firma de Certificado PKCS#10 real y autofirmada, al instante, directamente en esta pestaña del navegador.
  6. Copia el bloque CERTIFICATE SIGNING REQUEST y envíalo a tu Autoridad de Certificación. Guarda el bloque PRIVATE KEY en un archivo local y mantenlo en secreto, es lo que demuestra que controlas el certificado una vez emitido, y lo necesitarás para instalarlo en tu servidor.

Sin instalación, sin cuenta y sin subir nada sensible: la clave privada, que es lo más importante, nunca se envía a ningún sitio.

¿Por qué generar una CSR en tu navegador en lugar de en un servidor?

Una CSR siempre viaja junto a una clave privada, la clave privada es para lo que existe la CSR, demostrando a una Autoridad de Certificación (y luego a tu servidor) que realmente controlas el certificado solicitado. Si una web de “generar una CSR” calcula esa clave privada en su propio backend, la clave existió en una máquina que no controlas antes de que la vieras siquiera. Esta herramienta evita ese riesgo por completo: tanto el par de claves como la CSR se construyen usando la propia Web Crypto API de tu navegador más dos pequeñas librerías JavaScript auditadas y con licencia BSD (pkijs y asn1js) que nunca hacen ninguna petición de red. No hay ningún servidor involucrado en generar ni la clave ni la CSR, así que es matemáticamente imposible que una clave que crea esta herramienta haya tocado nada que no sea tu propio dispositivo.

Qué contiene realmente una CSR

Una Solicitud de Firma de Certificado (definida por RFC 2986, también conocida como PKCS#10) agrupa tres cosas:

Esta herramienta también incrusta una extensión Subject Alternative Name (SAN) que lista cada dominio que debería cubrir el certificado resultante, exigida por prácticamente toda CA moderna, ya que los navegadores ya no confían solo en el Common Name para la comprobación de nombre de host.

RSA frente a ECDSA

Verificar que la CSR es realmente correcta

Como una CSR que parece correcta pero tiene una estructura sutilmente equivocada o una firma rota sería inútil (o peor, silenciosamente rechazada semanas después por una Autoridad de Certificación) el ensamblaje de la CSR de esta herramienta se comprobó contra openssl, una herramienta externa completamente independiente, para los tres tipos de clave soportados: openssl req -verify -noout confirmó una coincidencia genuina de autofirma, y openssl req -text -noout confirmó un sujeto correctamente estructurado y separado por comas y una extensión SAN correctamente decodificada. Esa comprobación detectó un fallo real de codificación durante el desarrollo (mira las preguntas frecuentes) antes de que esta herramienta se publicara.

Tu clave privada nunca sale de tu dispositivo

Cada byte tanto de la CSR como de la clave privada se produce localmente usando la fuente de números aleatorios criptográficamente segura de tu propio navegador (crypto.getRandomValues por debajo), nunca Math.random(), que no es lo bastante segura para nada criptográfico. Nada sobre tu CSR o tu clave privada, ni siquiera el hecho de que generaste una, se transmite, registra ni almacena en ningún sitio por este sitio web.

Usos habituales

Cómo funciona, en imágenes

Captura de pantalla de la herramienta Generador de CSR SSL con la entrada de ejemplo «cn: sysfenix.com country: ES state: Madrid local…», Key type en RSA 2048-bit (widely compatible, good default)
Generador de CSR SSL en pleno proceso: la entrada de ejemplo «cn: sysfenix.com country: ES state: Madrid local…», Key type en RSA 2048-bit (widely compatible, good default).
Captura de pantalla del resultado de Generador de CSR SSL mostrando la salida generada «=== CERTIFICATE SIGNING REQUEST (CSR) — submit O…»
El resultado final: la salida generada «=== CERTIFICATE SIGNING REQUEST (CSR) — submit O…». El enlace de descarga es una URL blob local: el archivo nunca sale de tu dispositivo.

Preguntas frecuentes

¿Qué formato de entrada espera esta herramienta?

Pega un campo por línea, como `fieldName: valor`. Solo `commonName` (o `cn`) es obligatorio, el resto de campos son opcionales: ``` commonName: example.com organization: Example Inc organizationalUnit: Departamento de IT locality: San Francisco state: California country: US san: www.example.com, api.example.com ``` Las líneas en blanco y las que empiezan por `#` se ignoran. También puedes repetir la línea `san:` tantas veces como quieras en lugar de (o además de) listar varios dominios en una línea separados por comas.

¿Por qué esta herramienta usa un simple cuadro de texto en lugar de campos separados para cada valor (CN, organización, etc.)?

Los componentes compartidos de este sitio solo admiten un único cuadro de texto libre más un puñado de opciones desplegables/numéricas/de casilla, no hay ningún componente de formulario multicampo para poner un campo CN, uno de organización, uno de SAN, etc., por separado. En lugar de forzar esta herramienta a un encaje incómodo o construir un componente de formulario específico para una sola herramienta, reutiliza el componente ya existente de pegar-un-bloque-de-texto con una simple convención fieldName: valor, un campo por línea, el mismo enfoque de menor interpretación razonable que usa este sitio siempre que la interfaz ideal de una herramienta aún no existe.

¿Por qué mi Common Name se añade automáticamente a la lista SAN también, aunque no lo haya escrito ahí?

Porque la mayoría de las Autoridades de Certificación lo exigen. Los navegadores modernos y las CA (incluidas Let's Encrypt y todas las CA comerciales importantes) generalmente ignoran el Common Name para la comprobación de nombre de host y solo confían en la extensión Subject Alternative Name (SAN), una CSR cuyo CN no esté también listado en SAN es una causa habitual de que una CSR sea rechazada o de que el certificado resultante no funcione como se espera. Esta herramienta añade tu Common Name a la lista SAN automáticamente (y elimina cualquier duplicado exacto) para que no tengas que recordar repetirlo tú mismo.

¿Qué tipo de clave debería elegir, RSA 2048, RSA 4096 o ECDSA P-256?

RSA 2048 bits (el valor por defecto) es la opción más segura y universalmente compatible, toda Autoridad de Certificación y todo servidor/balanceador de carga la acepta. RSA 4096 bits cambia un tiempo de generación de clave más lento (y handshakes TLS ligeramente más lentos) por un margen de seguridad mayor, útil sobre todo si una política concreta lo exige. ECDSA P-256 es la opción moderna: genera casi al instante, produce una clave y un certificado mucho más pequeños, y la aceptan prácticamente todas las CA actuales (incluida Let's Encrypt) y todos los navegadores modernos, una gran opción a menos que necesites concretamente dar soporte a clientes muy antiguos o a una CA que solo acepte RSA.

¿Se verificó de verdad que el formato de la CSR funciona con las herramientas de una Autoridad de Certificación real, o podría estar sutilmente equivocado?

Verificado de forma concreta con el propio `openssl` de esta máquina, una herramienta externa completamente independiente, no solo leyendo la especificación. Cada tipo de clave que soporta esta herramienta se comprobó con `openssl req -verify -text -noout`, que confirmó tanto "Certificate request self-signature verify OK" como un sujeto correctamente formado y separado por comas (por ejemplo, `C=US, ST=California, L=San Francisco, O=Example Inc, OU=IT, CN=example.com`) y una extensión `X509v3 Subject Alternative Name` correctamente decodificada. Esa comprobación de separación por comas realmente detectó un fallo real durante el desarrollo, mira la siguiente pregunta.

¿Qué salió mal durante el desarrollo, y cómo se detectó?

Una versión temprana metía cada campo del sujeto (Common Name, Organización, País, etc.) en la lista de atributos plana de la librería subyacente y dejaba que construyera la estructura ASN.1 automáticamente. Eso producía una CSR que *parecía* correcta en el propio código de esta herramienta pero que, al decodificarla con `openssl req -text`, resultaba ser un único grupo de atributos combinados (`CN=example.com + O=Example Inc + C=US`, unidos con `+`) en lugar de la estructura convencional de Nombre Distinguido separada por comas que espera toda CA y navegador (`C=US, O=Example Inc, CN=example.com`). Se corrigió construyendo directamente la estructura ASN.1 correcta (una secuencia de grupos separados de un solo atributo) y se volvió a verificar después con `openssl`. Este es exactamente el tipo de error de codificación sutil y fácil de pasar por alto que solo se detecta al comprobarlo contra una herramienta real e independiente, no confiando solo en la documentación de una API.

¿Esta herramienta envía algo a una Autoridad de Certificación, o comprueba la propiedad del dominio?

No. Esta herramienta solo genera la CSR y su clave privada correspondiente, ambas enteramente dentro de tu pestaña del navegador. Enviar la CSR a una Autoridad de Certificación real (o a un cliente ACME como Certbot, para Let's Encrypt), demostrar que controlas el dominio y recibir el certificado firmado de vuelta son todos pasos separados que haces después con la CA que elijas.

¿Esta herramienta cifra la clave privada con una contraseña?

No, no actualmente. La clave privada PKCS#8 generada no está cifrada, el mismo alcance honesto que usa el Generador de Claves SSH de este sitio por el mismo motivo, añadir cifrado con frase de paso correctamente necesitaría el mismo nivel de verificación externa independiente que recibió el propio formato de la CSR, y enviar una capa de cifrado sin verificar para algo tan sensible no compensa el riesgo. Si necesitas una clave protegida con frase de paso, genera aquí y luego ejecuta localmente `openssl rsa -aes256 -in key.pem -out key-encrypted.pem` (o el equivalente para ECDSA) para añadir una.

Herramientas relacionadas