CSR.pluscsr.plus

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 vivo

Resumen

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.

Todo lo que necesitas: generar un CSR y una clave privada, decodificar cualquier CSR, calificar un despliegue de A a F, buscar registros de transparencia, comprobar registros CAA, verificar el estado de revocación y trazar un handshake TLS completo.

URL base y autenticación

Base URL
https://csr.plus

Todos 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

EndpointLímiteVentana
/api/generate10 solicitudespor minuto por IP
/api/ssl-check, /api/ct, /api/caa30 solicitudespor minuto por IP
/api/revocation, /api/ssl-tracer20 solicitudespor minuto por IP
/api/decode, /api/openssl-traceSin límite—

Superar un límite devuelve HTTP 429 con una cabecera Retry-After que indica cuántos segundos esperar.

POST/api/generate

Genera una solicitud de firma de certificado y una clave privada. Límite: 10 solicitudes por minuto por IP.

Cuerpo de la solicitud

ParámetroTipoRequeridoDescripción
common_namestringSíDominio principal (p. ej. example.com)
sansarrayNoNombres alternativos adicionales, p. ej. ["www.example.com"]
organizationstringNoNombre de la organización (O)
org_unitstringNoUnidad organizativa (OU)
countrystringNoCódigo de país de dos letras (C), p. ej. "US"
statestringNoEstado o provincia (ST)
localitystringNoLocalidad / ciudad (L)
emailstringNoCorreo electrónico de contacto
key_typestringNo"rsa" (predeterminado) o "ecdsa"
key_sizestring|intNoRSA: 2048 (predet.) / 3072 / 4096 · ECDSA: "P-256" (predet.) / "P-384"
passphrasestringNoCifra la clave privada como PEM PKCS#8 cifrado (máx. 200 caracteres)

Campos de respuesta

CampoDescripción
csrSolicitud de firma de certificado en formato PEM (PKCS#10, firma SHA-256)
private_keyClave privada en formato PEM (PKCS#8; PKCS#8 cifrado si se proporciona frase de contraseña)
algorithmAlgoritmo utilizado, p. ej. "RSA-2048" o "ECDSA-P-256"
created_atMarca de tiempo ISO 8601 de generación
Ejemplo de solicitud (cURL)
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
  }'
Ejemplo de respuesta
{
  "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"
}
Verificar el resultado con OpenSSL
openssl req -verify -noout -in example.com.csr
openssl req -in example.com.csr -text -noout | head -20
POST/api/decode

Analiza cualquier CSR PKCS#10 y devuelve su sujeto, nombres alternativos, clave pública, verificación de firma y extensiones.

Cuerpo de la solicitud

ParámetroTipoRequeridoDescripción
csrstringSíEl CSR en formato PEM (-----BEGIN CERTIFICATE REQUEST-----)
Ejemplo de solicitud (cURL)
curl -X POST https://csr.plus/api/decode \
  -H "Content-Type: application/json" \
  -d '{"csr": "-----BEGIN CERTIFICATE REQUEST-----\n..."}'
Ejemplo de respuesta
{
  "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.

GET/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ámetroTipoRequeridoDescripción
domainstringSíHost a comprobar (se asume el puerto 443)
Ejemplo de solicitud
curl "https://csr.plus/api/ssl-check?domain=example.com"
Ejemplo de respuesta
{
  "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 }
}
GET/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ámetroTipoRequeridoDescripción
domainstringSíDominio a buscar en registros CT
Ejemplo de solicitud
curl "https://csr.plus/api/ct?domain=example.com"
Ejemplo de respuesta
{
  "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.

GET/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ámetroTipoRequeridoDescripción
domainstringSíDominio a consultar
Ejemplo de solicitud
curl "https://csr.plus/api/caa?domain=example.com"
Ejemplo de respuesta
{
  "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": ""
}
GET/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ámetroTipoRequeridoDescripción
domainstringSíDominio cuyo certificado servido se inspecciona
Ejemplo de solicitud
curl "https://csr.plus/api/revocation?domain=example.com"
Ejemplo de respuesta
{
  "success": true,
  "domain": "example.com",
  "serial": "03F2A1B3C4D5E6F7",
  "crlUrls": ["http://crl.letsencrypt.org/r3.crl"],
  "ocspUrls": ["http://r3.o.lencr.org"],
  "status": "good"
}
GET/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ámetroTipoRequeridoDescripción
domainstringSíHost al que conectarse
portintNoPuerto TCP (predeterminado 443)
Ejemplo de solicitud
curl "https://csr.plus/api/ssl-tracer?domain=example.com&port=443"
Ejemplo de respuesta
{
  "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": []
}
GET/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ámetroTipoRequeridoDescripción
domainstringSíDominio a trazar (se asume el puerto 443)
Ejemplo de solicitud
curl "https://csr.plus/api/openssl-trace?domain=example.com"
Ejemplo de respuesta
{
  "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.

EstadoerrorIdSignificado
400invalid_jsonEl cuerpo de la solicitud no es JSON válido
400invalid_common_namecommon_name falta o supera los 253 caracteres
400invalid_key_typekey_type debe ser "rsa" o "ecdsa"
400invalid_key_sizeLos tamaños RSA deben ser 2048/3072/4096; las curvas ECDSA "P-256"/"P-384"
400invalid_passphrasepassphrase debe ser una cadena no vacía (máx. 200 caracteres)
400invalid_json_formatEl cuerpo de la solicitud o los campos están mal formados
405method_not_allowedSolo se acepta POST en /api/generate
413payload_too_largeCuerpo de solicitud demasiado grande (límite 10 KB)
429rate_limit_exceededLímite de velocidad superado: reintente según la cabecera Retry-After
500generation_failedError 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

Python (requests)
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"])
Node.js (fetch)
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.