Référence de l'API CSR.plus
Automatisez tout le cycle de vie des certificats SSL/TLS avec une seule API REST ouverte — génération CSR, décodage, notation A–F, transparence des certificats, CAA, révocation et traçage TLS. Gratuit, sans authentification, sans clé API.
Essayez l'API en directAperçu
L'API CSR.plus est un ensemble de points de terminaison en lecture seule et de génération qui alimentent nos outils web. Chaque point de terminaison renvoie du JSON, prend en charge CORS pour les navigateurs et est limité par adresse IP. Les clés et les CSR sont générés en mémoire et jamais stockés.
URL de base et authentification
https://csr.plusTous les points de terminaison sont servis en HTTPS. Aucune authentification n'est requise — l'API est ouverte et non authentifiée par conception. Pas de clés API, de jetons ni de facturation. Les requêtes sont identifiées par adresse IP uniquement pour la limitation de débit.
Toutes les réponses incluent des en-têtes CORS (Access-Control-Allow-Origin: *), vous pouvez donc appeler l'API directement depuis les navigateurs et les scripts côté client.
Limites de débit
| Point de terminaison | Limite | Fenêtre |
|---|---|---|
| /api/generate | 10 requêtes | par minute et par IP |
| /api/ssl-check, /api/ct, /api/caa | 30 requêtes | par minute et par IP |
| /api/revocation, /api/ssl-tracer | 20 requêtes | par minute et par IP |
| /api/decode, /api/openssl-trace | Non limité | — |
Dépasser une limite renvoie HTTP 429 avec un en-tête Retry-After indiquant le nombre de secondes à attendre.
/api/generateGénère une demande de signature de certificat et une clé privée. Limite : 10 requêtes par minute et par IP.
Corps de la requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
| common_name | string | Oui | Domaine principal (ex. example.com) |
| sans | array | Non | Noms alternatifs supplémentaires, ex. ["www.example.com"] |
| organization | string | Non | Nom de l'organisation (O) |
| org_unit | string | Non | Unité organisationnelle (OU) |
| country | string | Non | Code pays à deux lettres (C), ex. "US" |
| state | string | Non | État ou province (ST) |
| locality | string | Non | Localité / ville (L) |
| string | Non | Adresse e-mail de contact | |
| key_type | string | Non | "rsa" (défaut) ou "ecdsa" |
| key_size | string|int | Non | RSA : 2048 (défaut) / 3072 / 4096 · ECDSA : "P-256" (défaut) / "P-384" |
| passphrase | string | Non | Chiffre la clé privée en PEM PKCS#8 chiffré (max 200 caractères) |
Champs de réponse
| Champ | Description |
|---|---|
| csr | Demande de signature de certificat au format PEM (PKCS#10, signature SHA-256) |
| private_key | Clé privée au format PEM (PKCS#8 ; PKCS#8 chiffré si une phrase de passe est fournie) |
| algorithm | Algorithme utilisé, ex. "RSA-2048" ou "ECDSA-P-256" |
| created_at | Horodatage ISO 8601 de la génération |
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/decodeAnalyse n'importe quel CSR PKCS#10 et renvoie son sujet, ses noms alternatifs, sa clé publique, la vérification de signature et ses extensions.
Corps de la requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
| csr | string | Oui | Le CSR au format 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"
}Remarque : dcvInfo contient des indices de validation de contrôle du domaine (fichiers de jeton HTTP et enregistrement CNAME) utiles pour terminer les étapes de validation CA.
/api/ssl-check?domain={domain}Vérification SSL/TLS complète avec une note A–F de style SSL Labs : validité du certificat, correspondance du nom d'hôte, confiance de la chaîne, sondes de versions TLS et inspection HSTS.
Paramètres de requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
| domain | string | Oui | Nom d'hôte à vérifier (port 443 supposé) |
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}Recherche dans les journaux publics de transparence des certificats tous les certificats émis pour un domaine. Repli sur Cert Spotter si crt.sh est indisponible.
Paramètres de requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
| domain | string | Oui | Domaine à rechercher dans les journaux 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 réponse inclut source (crt.sh ou certspotter) pour savoir quel fournisseur a servi les données.
/api/caa?domain={domain}Renvoie les enregistrements DNS CAA d'un domaine ainsi que les enregistrements A, AAAA, NS et MX, montrant quelles autorités de certification sont autorisées à émettre des certificats.
Paramètres de requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
| domain | string | Oui | Domaine à interroger |
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}Récupère le certificat actuellement servi par un domaine et indique ses points de distribution CRL et ses points de terminaison OCSP.
Paramètres de requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
| domain | string | Oui | Domaine dont le certificat servi est inspecté |
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}Effectue une véritable poignée de main TLS avec n'importe quel hôte et port, en enregistrant la résolution DNS, la connectivité TCP, la version et le chiffrement TLS négociés, et la chaîne de certificats complète.
Paramètres de requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
| domain | string | Oui | Nom d'hôte auquel se connecter |
| port | int | Non | Port TCP (défaut 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}Exécute une poignée de main openssl s_client brute contre un domaine et renvoie la sortie détaillée complète — utile pour déboguer les problèmes de chaîne et de protocole.
Paramètres de requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
| domain | string | Oui | Domaine à tracer (port 443 supposé) |
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..."
}Codes d'erreur
Les erreurs sont renvoyées en JSON avec un message error et, le cas échéant, un errorId pour un traitement programmatique.
| Statut | errorId | Signification |
|---|---|---|
| 400 | invalid_json | Le corps de la requête n'est pas un JSON valide |
| 400 | invalid_common_name | common_name est manquant ou dépasse 253 caractères |
| 400 | invalid_key_type | key_type doit être "rsa" ou "ecdsa" |
| 400 | invalid_key_size | Les tailles RSA doivent être 2048/3072/4096 ; les courbes ECDSA "P-256"/"P-384" |
| 400 | invalid_passphrase | passphrase doit être une chaîne non vide (max 200 caractères) |
| 400 | invalid_json_format | Le corps de la requête ou les champs sont mal formés |
| 405 | method_not_allowed | Seul POST est accepté sur /api/generate |
| 413 | payload_too_large | Corps de la requête trop volumineux (limite 10 Ko) |
| 429 | rate_limit_exceeded | Limite de débit dépassée — réessayez après l'en-tête Retry-After |
| 500 | generation_failed | Erreur interne lors de la génération clé/CSR |
Bonnes pratiques
- Générez les clés privées localement avec OpenSSL ou node-forge pour les charges de production. L'API est conçue pour le développement, les tests et l'automatisation légère.
- Définissez une passphrase lorsque la clé doit être stockée ou transférée entre systèmes.
- Utilisez RSA 2048 ou ECDSA P-256 sauf si les exigences de conformité imposent des clés plus fortes.
- Respectez l'en-tête Retry-After au lieu de marteler l'API après un 429.
- Validez le paramètre domain côté client (max 253 caractères, alphanumériques, points et tirets) avant d'appeler les points de terminaison en lecture seule.
- Ne journalisez jamais le champ private_key des réponses API.
Plus d'exemples
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);Essayez l'API en direct
Choisissez un endpoint, remplissez les paramètres et envoyez une vraie requête à l'API de production.
FAQ
Quelle est la limite de débit de l'API ?
La génération CSR permet 10 requêtes par minute par adresse IP. SSL check, CT et CAA permettent 30 par minute ; révocation et traceur TLS 20 par minute. Dépasser une limite renvoie HTTP 429 avec un en-tête Retry-After.
Quels types de clés sont pris en charge ?
RSA 2048/3072/4096 et ECDSA P-256/P-384. Passez les paramètres key_type et key_size dans le corps de la requête.
Puis-je chiffrer la clé privée générée ?
Oui. Ajoutez un champ passphrase à la requête et la clé privée est renvoyée chiffrée en clé PEM PKCS#8 chiffrée.
L'API stocke-t-elle ma clé privée ?
Non. Les clés et les CSR sont générés en mémoire et ne sont jamais persistés, journalisés ni stockés sur disque. Utilisez l'API pour le développement et les tests.
Quelles CA acceptent les CSR générés par cette API ?
L'API produit des CSR PKCS#10 standard avec signatures SHA-256 acceptés par toutes les grandes autorités de certification, dont Let’s Encrypt, DigiCert, Sectigo et Google Trust Services.