Referencia de API CSR.plus
Automatiza todo el ciclo de vida de certificados SSL/TLS con una única API REST abierta: generación CSR, decodificación, calificación A–F, transparencia de certificados, CAA, revocación y trazado TLS. Gratis, sin autenticación, sin claves API.
Prueba la API en vivoResumen
La API de CSR.plus es una colección de endpoints de solo lectura y generación que impulsan nuestras herramientas web. Cada endpoint devuelve JSON, soporta CORS para clientes de navegador y tiene límite de velocidad por dirección IP. Las claves y CSR se generan en memoria y nunca se almacenan.
URL base y autenticación
https://csr.plusTodos los endpoints se sirven por HTTPS. No se requiere autenticación: la API es abierta y sin autenticación por diseño. No hay claves API, tokens ni facturación. Las solicitudes se identifican por dirección IP solo para limitar la velocidad.
Todas las respuestas incluyen cabeceras CORS (Access-Control-Allow-Origin: *), por lo que puedes llamar a la API directamente desde navegadores y scripts del lado del cliente.
Límites de velocidad
| Endpoint | Límite | Ventana |
|---|---|---|
| /api/generate | 10 solicitudes | por minuto por IP |
| /api/ssl-check, /api/ct, /api/caa | 30 solicitudes | por minuto por IP |
| /api/revocation, /api/ssl-tracer | 20 solicitudes | por minuto por IP |
| /api/decode, /api/openssl-trace | Sin límite | — |
Superar un límite devuelve HTTP 429 con una cabecera Retry-After que indica cuántos segundos esperar.
/api/generateGenera una solicitud de firma de certificado y una clave privada. Límite: 10 solicitudes por minuto por IP.
Cuerpo de la solicitud
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| common_name | string | Sí | Dominio principal (p. ej. example.com) |
| sans | array | No | Nombres alternativos adicionales, p. ej. ["www.example.com"] |
| organization | string | No | Nombre de la organización (O) |
| org_unit | string | No | Unidad organizativa (OU) |
| country | string | No | Código de país de dos letras (C), p. ej. "US" |
| state | string | No | Estado o provincia (ST) |
| locality | string | No | Localidad / ciudad (L) |
| string | No | Correo electrónico de contacto | |
| key_type | string | No | "rsa" (predeterminado) o "ecdsa" |
| key_size | string|int | No | RSA: 2048 (predet.) / 3072 / 4096 · ECDSA: "P-256" (predet.) / "P-384" |
| passphrase | string | No | Cifra la clave privada como PEM PKCS#8 cifrado (máx. 200 caracteres) |
Campos de respuesta
| Campo | Descripción |
|---|---|
| csr | Solicitud de firma de certificado en formato PEM (PKCS#10, firma SHA-256) |
| private_key | Clave privada en formato PEM (PKCS#8; PKCS#8 cifrado si se proporciona frase de contraseña) |
| algorithm | Algoritmo utilizado, p. ej. "RSA-2048" o "ECDSA-P-256" |
| created_at | Marca de tiempo ISO 8601 de generación |
curl -X POST https://csr.plus/api/generate \
-H "Content-Type: application/json" \
-d '{
"common_name": "example.com",
"sans": ["www.example.com", "api.example.com"],
"organization": "Example Inc",
"country": "US",
"key_type": "rsa",
"key_size": 2048
}'{
"csr": "-----BEGIN CERTIFICATE REQUEST-----\nMIICzDCCAbQCAQAwgYwxCzAJBgNVBAYTAVVT...\n-----END CERTIFICATE REQUEST-----",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASC...\n-----END PRIVATE KEY-----",
"algorithm": "RSA-2048",
"created_at": "2026-08-14T10:30:00.000Z"
}openssl req -verify -noout -in example.com.csr
openssl req -in example.com.csr -text -noout | head -20/api/decodeAnaliza cualquier CSR PKCS#10 y devuelve su sujeto, nombres alternativos, clave pública, verificación de firma y extensiones.
Cuerpo de la solicitud
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| csr | string | Sí | El CSR en formato PEM (-----BEGIN CERTIFICATE REQUEST-----) |
curl -X POST https://csr.plus/api/decode \
-H "Content-Type: application/json" \
-d '{"csr": "-----BEGIN CERTIFICATE REQUEST-----\n..."}'{
"success": true,
"subject": {
"commonName": "example.com",
"organization": "Example Inc",
"organizationalUnit": null,
"country": "US",
"state": "California",
"locality": "San Francisco",
"email": null
},
"publicKey": { "type": "RSA", "size": 2048 },
"signature": { "algorithm": "sha256WithRSAEncryption", "verified": true },
"sanList": ["example.com", "www.example.com", "api.example.com"],
"extensions": [],
"size": 640,
"version": 0,
"timestamp": "2026-08-14T10:30:00.000Z"
}Nota: dcvInfo contiene pistas de validación de control del dominio (archivos de token HTTP y un registro CNAME) útiles al completar los pasos de validación de la CA.
/api/ssl-check?domain={domain}Comprobación SSL/TLS completa con calificación A–F estilo SSL Labs: validez del certificado, coincidencia de host, confianza de la cadena, sondeos de versiones TLS e inspección HSTS.
Parámetros de consulta
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| domain | string | Sí | Host a comprobar (se asume el puerto 443) |
curl "https://csr.plus/api/ssl-check?domain=example.com"{
"success": true,
"domain": "example.com",
"grade": {
"letter": "A+",
"score": 100,
"label": "Excellent configuration with HSTS",
"checks": [
{ "name": "Hostname match", "status": "pass", "detail": "Certificate covers the requested hostname" },
{ "name": "TLS 1.3", "status": "pass", "detail": "TLS 1.3 is supported" }
]
},
"cert": {
"subject": "CN=example.com",
"issuer": "CN=R10,O=Let's Encrypt,C=US",
"validFrom": "2026-05-14T00:00:00.000Z",
"validTo": "2026-08-12T00:00:00.000Z",
"daysRemaining": 30,
"san": ["example.com", "www.example.com"]
},
"tls": { "tls13": true, "tls12": true, "tls11": false, "tls10": false, "protocol": "TLSv1.3" },
"hsts": { "present": true, "maxAge": 31536000, "includeSubDomains": true, "preload": false }
}/api/ct?domain={domain}Busca en los registros públicos de transparencia de certificados todos los certificados emitidos para un dominio. Recurre a Cert Spotter si crt.sh no está disponible.
Parámetros de consulta
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| domain | string | Sí | Dominio a buscar en registros CT |
curl "https://csr.plus/api/ct?domain=example.com"{
"success": true,
"count": 12,
"source": "crt.sh",
"certs": [
{
"id": 123456,
"logged_at": "2026-08-01T12:00:00.000Z",
"not_before": "2026-07-15T00:00:00.000Z",
"not_after": "2026-10-13T00:00:00.000Z",
"common_name": "example.com",
"name_value": "example.com\nwww.example.com"
}
]
}La respuesta incluye source (crt.sh o certspotter) para saber qué proveedor sirvió los datos.
/api/caa?domain={domain}Devuelve los registros DNS CAA de un dominio junto con los registros A, AAAA, NS y MX, mostrando qué autoridades de certificación están autorizadas a emitir certificados.
Parámetros de consulta
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| domain | string | Sí | Dominio a consultar |
curl "https://csr.plus/api/caa?domain=example.com"{
"success": true,
"domain": "example.com",
"caa": [
{ "flags": 0, "tag": "issue", "value": "letsencrypt.org" },
{ "flags": 0, "tag": "iodef", "value": "mailto:[email protected]" }
],
"a": ["93.184.216.34"],
"aaaa": ["2606:2800:220:1:248:1893:25c8:1946"],
"ns": ["a.iana-servers.net"],
"mx": [],
"caaError": ""
}/api/revocation?domain={domain}Obtiene el certificado que sirve actualmente un dominio e informa sus puntos de distribución CRL y endpoints de respondedor OCSP.
Parámetros de consulta
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| domain | string | Sí | Dominio cuyo certificado servido se inspecciona |
curl "https://csr.plus/api/revocation?domain=example.com"{
"success": true,
"domain": "example.com",
"serial": "03F2A1B3C4D5E6F7",
"crlUrls": ["http://crl.letsencrypt.org/r3.crl"],
"ocspUrls": ["http://r3.o.lencr.org"],
"status": "good"
}/api/ssl-tracer?domain={domain}&port={port}Realiza un handshake TLS real contra cualquier host y puerto, registrando resolución DNS, conectividad TCP, versión y cifrado TLS negociados y la cadena de certificados completa.
Parámetros de consulta
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| domain | string | Sí | Host al que conectarse |
| port | int | No | Puerto TCP (predeterminado 443) |
curl "https://csr.plus/api/ssl-tracer?domain=example.com&port=443"{
"success": true,
"host": "example.com",
"port": 443,
"dns": { "ips": ["93.184.216.34"], "ms": 12 },
"tcp": { "ok": true, "ms": 38 },
"tls": { "version": "TLSv1.3", "cipher": "TLS_AES_128_GCM_SHA256", "weak": false },
"certs": [
{
"subject": { "CN": "example.com" },
"issuer": { "CN": "R10", "O": "Let's Encrypt", "C": "US" },
"serialNumber": "03F2A1B3C4D5E6F7",
"notBefore": "2026-05-14T00:00:00.000Z",
"notAfter": "2026-08-12T00:00:00.000Z",
"daysRemaining": 30,
"expired": false,
"isCA": false,
"isSelfSigned": false,
"keyType": "RSA",
"keySize": 2048,
"sha256": "E8:2F:0A:..."
}
],
"chainComplete": true,
"chainNote": "Chain resolves to a trusted root",
"errors": []
}/api/openssl-trace?domain={domain}Ejecuta un handshake openssl s_client en bruto contra un dominio y devuelve la salida detallada completa: útil para depurar problemas de cadena y protocolo.
Parámetros de consulta
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| domain | string | Sí | Dominio a trazar (se asume el puerto 443) |
curl "https://csr.plus/api/openssl-trace?domain=example.com"{
"success": true,
"output": "CONNECTED(00000005)\ndepth=2 C=US, O=Internet Security Research Group...\nverify return:1\n..."
}Códigos de error
Los errores se devuelven como JSON con un mensaje error y, cuando corresponde, un errorId para el manejo programático.
| Estado | errorId | Significado |
|---|---|---|
| 400 | invalid_json | El cuerpo de la solicitud no es JSON válido |
| 400 | invalid_common_name | common_name falta o supera los 253 caracteres |
| 400 | invalid_key_type | key_type debe ser "rsa" o "ecdsa" |
| 400 | invalid_key_size | Los tamaños RSA deben ser 2048/3072/4096; las curvas ECDSA "P-256"/"P-384" |
| 400 | invalid_passphrase | passphrase debe ser una cadena no vacía (máx. 200 caracteres) |
| 400 | invalid_json_format | El cuerpo de la solicitud o los campos están mal formados |
| 405 | method_not_allowed | Solo se acepta POST en /api/generate |
| 413 | payload_too_large | Cuerpo de solicitud demasiado grande (límite 10 KB) |
| 429 | rate_limit_exceeded | Límite de velocidad superado: reintente según la cabecera Retry-After |
| 500 | generation_failed | Error interno durante la generación de clave/CSR |
Buenas prácticas
- Genera claves privadas localmente con OpenSSL o node-forge para cargas de producción. La API está diseñada para desarrollo, pruebas y automatización ligera.
- Establece una passphrase cuando la clave deba almacenarse o transferirse entre sistemas.
- Usa RSA 2048 o ECDSA P-256 salvo que las normas de cumplimiento exijan claves más fuertes.
- Respeta la cabecera Retry-After en lugar de saturar la API tras un 429.
- Valida el parámetro domain en el cliente (máx. 253 caracteres, alfanumérico, puntos y guiones) antes de llamar a endpoints de solo lectura.
- Nunca registres el campo private_key de las respuestas de la API.
Más ejemplos
import requests
r = requests.post(
"https://csr.plus/api/generate",
json={"common_name": "example.com", "sans": ["www.example.com"]},
)
r.raise_for_status()
data = r.json()
open("example.com.csr", "w").write(data["csr"])
open("example.com.key", "w").write(data["private_key"])const res = await fetch("https://csr.plus/api/generate", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ common_name: "example.com", key_type: "ecdsa", key_size: "P-256" }),
});
const { csr, private_key } = await res.json();
console.log(csr);Prueba la API en vivo
Elige un endpoint, rellena los parámetros y envía una petición real a la API de producción.
FAQ
¿Cuál es el límite de velocidad de la API?
La generación CSR permite 10 solicitudes por minuto por dirección IP. SSL check, CT y CAA permiten 30 por minuto; revocación y tracer TLS 20 por minuto. Superar un límite devuelve HTTP 429 con cabecera Retry-After.
¿Qué tipos de clave se admiten?
RSA 2048/3072/4096 y ECDSA P-256/P-384. Pasa los parámetros key_type y key_size en el cuerpo de la solicitud.
¿Puedo cifrar la clave privada generada?
Sí. Añade un campo passphrase a la solicitud y la clave privada se devuelve cifrada como clave PEM PKCS#8 cifrada.
¿La API almacena mi clave privada?
No. Las claves y CSR se generan en memoria y nunca se persisten, registran ni almacenan en disco. Usa la API para desarrollo y pruebas.
¿Qué CAs aceptan los CSR generados por esta API?
La API produce CSR PKCS#10 estándar con firmas SHA-256 aceptados por todas las autoridades de certificación principales, incluidas Let’s Encrypt, DigiCert, Sectigo y Google Trust Services.