Skip to content

Support matrix

What the handler, the client and the message layer support. Known limitations lists what they do not.

Operations

Operation Server handler Client
GetCACaps Lists the capabilities derived from the options and the CA. Options.Capabilities replaces the list GetCACaps, fetched once and used to pick POST, the digest and the cipher
GetCACert One DER certificate. The CA and RA certificates in a certificate-only message when there are several GetCACert, which sorts the answer into the CA, the encryption recipients and the allowed CertRep signers
GetNextCACert The next CA certificates, signed by the current CA or RA, when the CA implements NextCAGetter GetNextCACert, which verifies the signature against the current certificates
GetCACertChain The CA certificate and its issuers up to the root, when the CA implements ChainGetter GetCACertChain, which returns the chain in server order
PKIOperation GET with a base64 message parameter and POST with a binary body POST when the server lists POSTPKIOperation or SCEPStandard, GET otherwise

GetCACertChain is not part of RFC 8894. Some CAs serve it and their clients still send it. Its answer carries no RA certificates, so a client enrolls with the GetCACert answer.

Message types

Message type Built with Client Handler passes it to Possible answers
PKCSReq (19) NewCSRRequest Enroll, EnrollAndWait CA.Enroll SUCCESS, PENDING, FAILURE
RenewalReq (17) NewCSRRequest Enroll with MessageType: scep.RenewalReq CA.Enroll SUCCESS, PENDING, FAILURE
UpdateReq (18) NewCSRRequest Not sent CA.Enroll SUCCESS, PENDING, FAILURE
CertPoll (20) NewCertPollRequest Poll, EnrollAndWait CA.Poll SUCCESS, PENDING, FAILURE
GetCert (21) NewGetCertRequest GetCert CertificateGetter.GetCert SUCCESS with certificates, FAILURE
GetCRL (22) NewGetCRLRequest GetCRL CRLGetter.GetCRL SUCCESS with a CRL, FAILURE
CertRep (3) Success, SuccessCRL, Pending, Fail Parsed and matched to the request Refused with HTTP 400 None

UpdateReq comes from SCEP drafts before RFC 8894. The handler and the message layer treat it like a RenewalReq.

Algorithms

Area Supported Default
Signature digest SHA-256, SHA-384, SHA-512, SHA-224, SHA-1 and MD5 SHA-256. The client picks SHA-256 when the server lists SHA-256 or SCEPStandard, then SHA-512, then SHA-1
MD5 signatures The handler accepts them with Options.AllowMD5, the client only in the answer to a request it signed with MD5 and the message layer with ParseOptions.AllowMD5 Refused
Answer digest Any of the above The request digest when it is MD5, SHA-1, SHA-256, SHA-384 or SHA-512, otherwise SHA-256
Content cipher AES-128-CBC, AES-192-CBC, AES-256-CBC, DES-EDE3-CBC and DES-CBC AES-128-CBC. The client picks DES-EDE3-CBC when the server lists DES3 without AES or SCEPStandard
Accepted on decryption AES-CBC and DES-EDE3-CBC. DES-CBC only when Decrypt lists it. The client always accepts the cipher of its own request
Answer cipher Any of the above The request cipher
Request key transport RSA PKCS #1 v1.5 and RSAES-OAEP through Encryption.KeyEncryption PKCS #1 v1.5
Answer key transport RSA PKCS #1 v1.5

Keys

Key Supported types
Request signer, which also decrypts the answer RSA. The handler answers any other key with badAlg
CSR key Any key crypto/x509 parses and whose CSR signature it checks. x509util.CreateCertificateRequest adds a challenge password for RSA and ECDSA keys
Request recipient, the CA or RA certificate that decrypts requests RSA
Answer signer, the CA or RA certificate that signs CertRep messages RSA or ECDSA

A device with an ECDSA key signs its PKCSReq with a separate RSA key and certificate. The CSR keeps the ECDSA key and the CA issues the certificate for it. A CA with an ECDSA key needs an RSA RA certificate to decrypt requests.

Go and platforms

The module needs Go 1.27.3 or newer. CI tests every change on Linux and macOS with the Go version in go.mod and builds it on Windows.

Interoperability

The Interop workflow runs sscep v0.10.0 and the micromdm/scep v2.3.0 client against the handler, and the client against the micromdm/scep v2.3.0 server and EJBCA Community Edition 9.6.3. Tested implementations lists what each run covers.