Skip to content

feat(scep): serve SCEP so network devices can enrol a trustpoint #185

Closed
1 of 1 issue completed
Closed

Description

@Bugs5382

Network equipment cannot use ACME. Cisco IOS/IOS-XE, and most switch, router, firewall and VPN platforms, enrol a trustpoint over SCEP. Without it every network device certificate is a manual CSR ferry, and there is no renewal path.

Concrete driver

One estate has a Cisco C9300X stack and Dell OS10 leaves that will eventually need identity certificates for 802.1X, RADIUS/EAP and management TLS. On IOS-XE that is:

crypto pki trustpoint EXAMPLE_CA
 enrollment url http://<ca>/cgi-bin/pkiclient.exe
 subject-name CN=switch01.example.com
crypto pki authenticate EXAMPLE_CA
crypto pki enroll EXAMPLE_CA

There is no ACME client on that platform, so SCEP is the only automated option short of hand-carrying certificates.

Scope

Implement the SCEP server operations (RFC 8894):

  • GetCACaps, GetCACert, PKIOperation (PKCSReq, GetCertInitial, GetCRL)
  • CMS/PKCS#7 request and response handling
  • issue through the existing profile machinery so ca.Profile stays the single place extensions are decided
  • record issued certificates in the revocation set so SCEP-issued certs are revocable and appear on the CRL

Notes

  • SCEP is RSA-centric: most devices generate RSA keys and many cannot do EC at all. Depends on RSA subject-key support (feat(node): accept RSA subject keys in signed CSRs #182).
  • Enrolment authorisation needs deciding. SCEP traditionally uses a challenge password, which is a shared secret; that is weak but is what the devices support. Worth designing deliberately rather than defaulting to it.
  • internal/ca/doc.go already lists SCEP as anticipated adapter work, wire-format only with issuance staying in our own CA path. This issue follows that.

Out of scope

ACME (#184) and EST, tracked separately.

Activity

  1. self-assigned this
    on Sep 16, 2026
  2. added theissue type on Sep 29, 2026
  3. added this to the v1.0.0 milestone on Sep 29, 2026
  4. Bugs5382 commented on Sep 30, 2026

    @Bugs5382
    ContributorAuthor

    Design decisions (owner, 2026-09-30):

    • D1 CMS: hand-written with the standard library (wire libraries never hold keys).
    • D2 recipient: an RA certificate (RSA 3072, digitalSignature and keyEncipherment), valid for 1 year, sealed on the state partition, rotated with an overlap during which both the old and new RA can decrypt. The CA key only signs.
    • D3 authorization: one-time challenges minted by an admin RPC or cryptosctl (stored hashed, single-use, with a TTL, optionally bound to names), plus RenewalReq authenticated by the current certificate. No static shared challenge.
    • D4 approval: issue or refuse on the spot by default, with an optional per-profile PENDING queue approved in cryptosctl or the Fleet Manager. CertPoll works in both modes.
    • D5 operations: GetCACaps, GetCACert, PKCSReq, RenewalReq, CertPoll, GetCert, GetCRL. GetNextCACert waits for feat: root CA key cross-signed rollover (post-v1.0.0) #161.
    • D6 algorithms: AES and SHA-256, as RFC 8894 requires.
    • D7 key floor: RSA 2048 is allowed only on SCEP device-leaf profiles, set per profile. CA, RA and server keys stay RSA 3072+ or P-384.
    • D8 transport: HTTP per RFC 8894.
  5. Bugs5382 commented on Sep 30, 2026

    @Bugs5382
    ContributorAuthor

    Clarification on D7 (owner, 2026-09-30): the key size is a minimum per profile, not a fixed size. Cisco IOS and IOS-XE SCEP trustpoints are limited to RSA 2048, so the Cisco device profile uses the 2048 floor, and live validation on the IOS-XE trustpoint (C9300X) runs with RSA 2048. 2048 is the lowest any profile may allow. Devices that can do more (for example some MDM clients) get a profile that requires RSA 3072+ or ECDSA P-384, and stronger keys are always accepted on a lower-floor profile. CA, RA and server keys stay RSA 3072+ or P-384.

  6. Bugs5382 commented on Sep 30, 2026

    @Bugs5382
    ContributorAuthor

    Slices 3 and 4 are up as #288 (stacked on #285), with the docs page in CryptOS-PKI/docs#40. Small things found and handled there:

    Still owed before this issue closes: live validation on the C9300X (IOS-XE trustpoint with RSA 2048, enrol, rollover renewal, a PENDING profile, a revoked-device refusal).

  7. Bugs5382 commented on Sep 30, 2026

    @Bugs5382
    ContributorAuthor

    Reopened until #288 (the SCEP server) merges; that PR closes it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature (feat). Minor version bump.

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions