Tested servers¶
certrally has been run against the CMP, EST and SCEP servers below. Each section lists where the server differs from the RFCs or needs a particular setting. It also says what certrally shows in that case.
CMP¶
EJBCA Community Edition 9.6.3¶
Tested with a CMP alias in client mode that accepts the end entity password as the shared secret and end entity certificates for signed requests.
ir,cr,kur,p10crandrrwork.irwas tested with ECDSA, RSA, Ed25519 and ML-DSA-65 keys. PBMAC1 and PasswordBasedMac both work.- EJBCA signs its responses to MAC-protected requests, even with the alias response protection set to
pbe. RFC 9483 section 3.2 asks for the same kind of protection in every message of an operation, so certrally warns and--profile strictstops the enrollment. lintfound no other deviation in recordedir,p10cr,kurandrrexchanges or in rejections.- Error messages are unprotected. certrally shows the reason and marks the answer as not authenticated.
- General messages are rejected with
badRequest"Can not handle message type '21'", socacertsandcmp genmfail.pingstill reports a CMP answer, but with--ca-certit cannot check the unprotected answer and exits with status 4. - In the tested setup EJBCA signed revocation responses with its ManagementCA instead of the CA that issued the certificate. With only the issuing CA in
--ca-cert,revokeexits with status 4 although EJBCA has revoked the certificate. Put both CA certificates in--ca-cert. - A
crsigned with an end entity certificate is rejected with "Status NEW, FAILED or INPROCESS required" once the end entity has a certificate. Reset the end entity status in EJBCA first. - Composite ML-DSA keys were rejected with "Illegal key algorithm, not authorized by certificate profile", even with the composite algorithms listed in the certificate profile.
Nokia NCM 26.7¶
Tested over HTTP with a shared secret and with certificates that NCM issued.
ir,cr,p10cr,kurandrrwork, with and without--ca-cert.irwas tested with ECDSA P-256, P-384 and P-521 and RSA 2048 and 3072 keys.- NCM accepts only PasswordBasedMac. It answers a PBMAC1-protected request with
badMessageCheck"unsupported cmp header protection method". certrally then suggests--mac pbm. - Ed25519, ML-DSA-65 and composite ML-DSA keys were rejected with
badPOP"invalid PoP". - NCM needs
--recipientto choose the CA and answerswrongAuthoritywithout it. It copies the recipient of the request into the sender of its responses. Give the CA name in the order certrally prints it, such as--recipient 'CN=Issuing CA,O=Example,C=DE'. With the names in another order, signed responses fail with "sender does not match protection certificate subject" and exit status 4. - Responses to MAC-protected enrollment requests are MAC-protected, so
--profile strictaccepts them. - Signed responses carry no senderKID, although the CA certificate has a subject key identifier. certrally warns about RFC 9483 section 3.1 and
--profile strictstops a signed enrollment with exit status 6. - Error messages are signed, so
ping --ca-certcan check the answer. - NCM answers every general message with the same
signKeyPairTypes,encKeyPairTypesandpreferredSymmAlgitems instead of the requested one, socacertsandcmp genmexit with status 3. The answer is signed even for a MAC-protected request and its extraCerts do not start with the signer certificate. certrally warns about RFC 9483 sections 3.2 and 3.3. - With a rate limit configured, NCM answers requests that come too fast with HTTP 503 and no CMP message. certrally exits with status 2. Wait a few seconds between requests.
Insta Certifier 10.0.0¶
Tested over HTTPS and HTTP with a shared secret and with certificates that Certifier issued.
ir,cr,p10cr,kurandrrwork.irwas tested with ECDSA P-256 and RSA 2048 keys.- Certifier accepts only PasswordBasedMac. It answers a PBMAC1-protected request with an unprotected
notAuthorized"authentication failed", so certrally cannot suggest--mac pbm. - Signed responses copy the senderKID of the request instead of naming the key of the CA certificate. certrally warns about RFC 9483 section 3.1 and verifies the response with the CA certificate.
--profile strictstops the enrollment with exit status 6. - A
kupcarries no extraCerts. Without--ca-certcertrally cannot find its signer and exits with status 4 with a hint to pass the CA certificate. With--ca-certthe key update works and certrally warns about RFC 9483 section 3.3. - Only certificates issued by
irauthenticate a revocation request. Anrrsigned with a certificate thatcrissued gets an unprotectednotAuthorized"authentication failed". - General messages are not supported. Each gets a signed error with
notAuthorized"operation not supported", socacertsandcmp genmexit with status 3. - Unprotected requests get unprotected errors, so
ping --ca-certcannot check the answer and exits with status 4.
OpenSSL 4.0.3 openssl cmp mock server¶
- The server accepts only PasswordBasedMac. It answers a PBMAC1-protected request with
badRequest"no suitable sender cert", and certrally suggests--mac pbm. - Its
kupcarries only the server certificate. Without--ca-cert, certrally cannot verify the new certificate and asks for the issuing CA certificate. - The server process exits on
cmp genm templateandcmp genm rootupdateunless it is started with the options for them,-ref_certand-rsp_newwithnew.
EST¶
Cisco libest 3.2.0 example server¶
Tested with the estserver example of libest 3.2.0 on OpenSSL 1.1.1, with a password, a client certificate and TLS-SRP.
est cacerts,est cacerts --bootstrap,est csrattrs,est enrollandest reenrollwork.est cacertsandest enrollalso pass--profile strict.est enrollwas tested with ECDSA P-256 and P-384, RSA 2048 and Ed25519 keys and with a PKCS#10 request from--csr. ML-DSA and composite ML-DSA requests get HTTP 400 "Invalid or corrupted pkcs10 request", because OpenSSL 1.1.1 does not support these algorithms.est reenrollworks with the client certificate alone when the server runs with-o. Without-othe server also wants a password: a certificate alone gets HTTP 401 and certrally suggests--user. With--cert,--keyand--userthe renewal works.- TLS-SRP works with
--srpwhen the verifier uses a group of at least 2048 bits. Thepasswd.srpvthat comes with libest holdssrpuserwith a 1536-bit group, which certrally refuses with "server chose the 1536 bit SRP group, below the minimum of 2048 bits". - With
-tthe server requires the tls-unique binding.--tls-uniqueworks. Without it the server answers HTTP 401 "Proof of Possession Mismatch". - With
-hthe server asks for HTTP Digest authentication. certrally signs in with Basic only and gets HTTP 401. - With
-mthe server answers202 AcceptedwithRetry-After: 3600. certrally exits with status 2 unless--timeoutcovers the hour. est serverkeygenexits with status 4. The server declares aContent-Lengthshorter than its multipart response, so the response ends before its last part. certrally also warns that the response has nosmime-type=certs-onlyparameter, because the certificate part is cut off.
SCEP¶
EJBCA Community Edition 9.6.3¶
Tested over HTTP with the CA name in --ca. No end entity was registered for the requests, so no certificate was issued.
- EJBCA lists POSTPKIOperation, Renewal, SHA-512, SHA-256, SHA-1, DES3, AES and SCEPStandard.
scep caps,scep cacertandscep chainwork. GetCACert returns the issuing CA and its root. GetCACertChain returns the CA followed by its root.lintfound no deviation. - GetNextCACert gets
403 Forbiddenwith an HTML page when the CA has no rollover certificate.scep nextcaexits with status 3 and shows the text of the page. - A PKCSReq without a challenge password gets
400 Bad Requestand one for a subject without an end entity gets403 Forbidden, each with an HTML page instead of a FAILURE answer. certrally exits with status 3, shows the text of the page and suggests checking the challenge password,--subjectand--ca.
Nokia NCM 26.7¶
Tested over HTTP with two NCM installations, with a SCEP CA that issues requests without operator approval and with one that waits for it.
scep caps,scep cacert,scep chain,scep nextcaandscep enrollwork.scep enrollwas tested with RSA 2048 and ECDSA P-256 keys, with the default SHA-256 and AES-128-CBC and with--hash sha1 --cipher des3.- NCM needs
--ca. Without it, GetCACert and GetCACertChain get HTTP 200 with an empty body. certrally then exits with status 2 and suggests--ca. - NCM lists AES, SHA-1, SHA-256, SHA-512 and POSTPKIOperation and ends the list with a NUL byte. certrally warns about RFC 8894 section 3.5.2.
--profile strictstopsscep capsand every command that sends a PKIOperation, because they read the list first. scep chainreturns the CA certificate followed by its root.- GetNextCACert gets HTTP 200 with an empty body, which
scep nextcareports as no next CA certificate. - NCM signs its CertRep with SHA-1 whatever the request used, adds no senderNonce and no certificates. certrally verifies it with the certificate from GetCACert or
--ca-certand warns about RFC 8894 section 3.2.1. - A CA that issues without approval also accepts a PKCSReq whose challenge password it does not know.
- A CA that waits for approval answers PENDING with HTTP 200.
scep enroll --poll-latersaved the request,scep poll --oncegot PENDING andscep pollcollected the certificate after approval.scep enrollwithout--poll-laterpolled until the request was approved. - RenewalReq, GetCert and GetCRL get HTTP 200 with an empty body. NCM does not list Renewal. certrally exits with status 2 and says that the server may not support the message type.
OpenXPKI 3.34¶
Tested over HTTP with the generic SCEP endpoint of the OpenXPKI sample configuration. In this setup the server issued a certificate for a name in its test domain at once and kept a request for another name pending. Approval of a pending request was not tested.
- OpenXPKI lists Renewal, POSTPKIOperation, SHA-512, SHA-384, SHA-256, SHA-224, SHA-1, DES3 and AES.
scep caps,scep cacert,scep enrollandscep pollwork.lintfound no deviation. - GetCACert returns the RA certificate and the root CA but not the issuing CA, so
scep cacertshows the root as the issuing CA. - A pending request gets a PENDING CertRep with HTTP
202 Accepted. certrally treats it as any PENDING answer and saves the state file.scep poll --oncegets PENDING with HTTP 202 again. - A PKCSReq with a wrong challenge password is kept pending as well, not refused, so
scep enrollpolls until--timeout. - A RenewalReq gets a FAILURE CertRep with
badCertIdand HTTP400 Bad Request, although the server lists Renewal. certrally exits with status 3 and suggests--pkcsreq.scep renew --pkcsreqworks without a challenge password. In this setup the new certificate kept the end date of the old one. inspectverifies the signatures of the requests and of the CertReps, which the RA certificate signs.- GetCACertChain gets
400 Bad Request"Unknown operation" and GetNextCACert gets500 Internal Server Error.scep chainandscep nextcaexit with status 3.
micromdm/scep 2.3.0¶
Tested with the scepserver of micromdm/scep 2.3.0 with a challenge password and -allowrenew 0.
scep caps,scep cacert,scep enrollandscep renewwork.scep enrollwas tested with RSA 2048 and ECDSA P-256 keys, with the default SHA-256 and AES-128-CBC and with--hash sha1 --cipher des3.lintfound no deviation.- The server encrypts every CertRep with single DES, whatever the request used. Without
--allow-descertrally exits with status 4 and suggests the flag. - The server checks the challenge password in a RenewalReq as well, so
scep renewneeds--challengeor--challenge-file. Without it the renewal gets FAILURE withbadRequest. - GetCACertChain, GetNextCACert, GetCert and GetCRL get HTTP 500 "not implemented", so
scep chain,scep nextca,scep getcertandscep getcrlexit with status 3.