Enrollment protocols
ACME, EST, SCEP, CMP — one orchestrator, every standard.
PKIFactor expose simultanément les quatre principaux protocoles d'enrôlement standardisés. Chaque protocole est une passerelle vers le moteur CLM : la politique d'émission (algorithme, durée, usages, CA backend) est définie une seule fois dans un template, indépendamment du protocole choisi par le client.
Un même template CLM (web-tls, pq-server…) peut être exposé simultanément via ACME, EST, SCEP et CMP. La politique d'émission reste unique et centralisée.
4.1. ACME (RFC 8555)
ACME (Automated Certificate Management Environment) est le standard issu de Let's Encrypt, désormais utilisé bien au-delà du Web (cert-manager, Caddy, Traefik, Apache, Nginx, AWS, Azure).
Activation d'un template ACME
curl -X PATCH https://pki.exemple.com/api/v1/clm/templates/5 \
-H "Authorization: Bearer $TOKEN" \
-d '{
"acme_enabled": true,
"acme_path": "web-tls",
"acme_http01_enabled": true,
"acme_dns01_enabled": true
}'
L'URL du directory ACME devient :
https://pki.exemple.com/acme/web-tls/directory
Exemple avec certbot
sudo certbot certonly \
--server https://pki.exemple.com/acme/web-tls/directory \
--standalone \
--email admin@acme.com \
--agree-tos \
--no-eff-email \
-d www.acme.com -d acme.com
Exemple avec acme.sh
acme.sh --issue \
--server https://pki.exemple.com/acme/web-tls/directory \
-d www.acme.com -d acme.com \
--webroot /var/www/html
Exemple avec cert-manager (Kubernetes)
# ClusterIssuer pointant vers PKIFactor ACME
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: pkifactor-acme
spec:
acme:
server: https://pki.exemple.com/acme/web-tls/directory
email: admin@acme.com
privateKeySecretRef:
name: pkifactor-acme-account-key
solvers:
- http01:
ingress:
class: nginx
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: www-acme-com
namespace: web
spec:
secretName: www-acme-com-tls
issuerRef:
name: pkifactor-acme
kind: ClusterIssuer
dnsNames:
- www.acme.com
- acme.com
4.2. EST (RFC 7030)
EST (Enrollment over Secure Transport) est le standard préféré pour les équipements réseau (Cisco, Juniper, Aruba) et les terminaux durcis (mobiles d'entreprise, IoT industriel). Il s'appuie sur HTTPS + mTLS et expose des endpoints /.well-known/est/.
Endpoints exposés
| Endpoint | Fonction |
|---|---|
GET /.well-known/est/cacerts | Récupération de la chaîne de CA |
POST /.well-known/est/simpleenroll | Enrôlement initial (CSR PKCS#10) |
POST /.well-known/est/simplereenroll | Renouvellement |
GET /.well-known/est/csrattrs | Attributs CSR attendus |
Enrôlement initial via curl
# 1. Génération de la clé privée + CSR
openssl req -new -newkey rsa:3072 -nodes \
-keyout device.key -out device.csr \
-subj "/CN=switch-01.acme.com/O=ACME"
# 2. Enrôlement (authentification basique pour le bootstrap)
curl https://pki.exemple.com/.well-known/est/simpleenroll \
-u "bootstrap-user:bootstrap-pass" \
--cacert ca-chain.pem \
-H "Content-Type: application/pkcs10" \
--data-binary @device.csr \
-o device.p7
Configuration Cisco IOS-XE (exemple)
crypto pki trustpoint PKIFACTOR
enrollment profile EST_PROFILE
fqdn switch-01.acme.com
subject-name CN=switch-01.acme.com,O=ACME
revocation-check ocsp
rsakeypair switch-01-key 3072
crypto pki profile enrollment EST_PROFILE
method-list cisco
enrollment url https://pki.exemple.com/.well-known/est
authentication trustpoint PKIFACTOR-CA
4.3. SCEP (RFC 8894)
SCEP (Simple Certificate Enrollment Protocol) reste largement utilisé pour le provisioning des terminaux mobiles (Microsoft Intune, Jamf, MobileIron) et les équipements réseau anciens.
URL SCEP exposée
https://pki.exemple.com/scep/{template_code}
Exemple Microsoft Intune (NDES connector)
SCEP URL : https://pki.exemple.com/scep/mdm-device
Challenge : (généré dynamiquement par PKIFactor pour chaque enrôlement)
Algorithme : RSA 2048 ou ECDSA P-256
Subject : CN={{DeviceName}},OU={{DepartmentName}}
Configuration challenge dynamique
PKIFactor génère un challenge à usage unique (TTL 15 min) consommé par le SCEP enroll, évitant le partage d'un secret statique :
curl -X POST https://pki.exemple.com/api/v1/scep/challenges \
-H "Authorization: Bearer $TOKEN" \
-d '{ "template_code": "mdm-device", "subject_pattern": "CN=*.acme.com" }'
{
"challenge": "scep_a1b2c3...",
"expires_at": "2026-04-18T10:17:00Z",
"single_use": true
}
4.4. CMP (RFC 4210)
CMP (Certificate Management Protocol) est utilisé dans les environnements télécoms (3GPP), l'automotive (V2X) et l'industrie où la traçabilité forte et la protection cryptographique des messages est exigée.
URL CMP
https://pki.exemple.com:8829/cmp/{template_code}
Exemple OpenSSL CMP
openssl cmp \
-cmd ir \
-server https://pki.exemple.com:8829/cmp/iot-device \
-ref device-id-001 \
-secret pass:$INITIAL_SHARED_SECRET \
-subject "/CN=iot-001.acme.com/O=ACME" \
-newkey iot-001.key \
-certout iot-001.pem \
-trusted ca-chain.pem