rfc8894xml2.original.xml | rfc8894.xml | |||
---|---|---|---|---|
<?xml version="1.0"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<?xml-stylesheet type='text/xsl' href='./rfc2629.xslt' ?> | ||||
<?rfc toc="yes"?> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<?rfc tocdepth='5'?> | ||||
<?rfc symrefs="no"?> | ||||
<?rfc compact="no" ?> | ||||
<?rfc sortrefs="yes" ?> | ||||
<?rfc strict="yes" ?> | ||||
<?rfc linkmailto="yes" ?> | ||||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" > | ||||
<?xml-stylesheet type='text/xsl' href='./rfc2629.xslt' ?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" | |||
category="info" consensus="true" ipr="pre5378Trust200902" | ||||
docName="draft-gutmann-scep-16" number="8894" obsoletes="" updates="" | ||||
xml:lang="en" tocInclude="true" tocDepth="5" symRefs="true" | ||||
sortRefs="true" version="3"> | ||||
<?rfc toc="yes"?> | <!-- xml2rfc v2v3 conversion 2.42.0 --> | |||
<?rfc symrefs="yes"?> | ||||
<?rfc compact="no" ?> | ||||
<?rfc subcompact="yes" ?> | ||||
<?rfc sortrefs="yes" ?> | ||||
<rfc category="info" ipr="pre5378Trust200902" docName="draft-gutmann-scep-16"> | ||||
<!-- ======================================================================== --> | ||||
<front> | <front> | |||
<title abbrev="SCEP">Simple Certificate Enrolment Protocol</title> | <title abbrev="SCEP">Simple Certificate Enrolment Protocol</title> | |||
<seriesInfo name="RFC" value="8894" /> | ||||
<author initials="P." surname="Gutmann" fullname="Peter Gutmann"> | <author initials="P." surname="Gutmann" fullname="Peter Gutmann"> | |||
<organization abbrev="University of Auckland">University of Auckland</orga nization> | <organization abbrev="University of Auckland">University of Auckland</orga nization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Department of Computer Science</street> | <street>Department of Computer Science</street> | |||
<city>Auckland</city> | <city>Auckland</city> | |||
<country>New Zealand</country> | <country>New Zealand</country> | |||
</postal> | </postal> | |||
<email>pgut001@cs.auckland.ac.nz</email> | <email>pgut001@cs.auckland.ac.nz</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2020"/> | <date month="September" year="2020" /> | |||
<area>Security Area</area> | <area>Security Area</area> | |||
<keyword>Internet-Draft</keyword> | ||||
<abstract> | <abstract> | |||
<t> | <t> | |||
This document specifies the Simple Certificate Enrolment Protocol (SCEP), a | This document specifies the Simple Certificate Enrolment Protocol (SCEP), a | |||
PKI protocol that leverages existing technology by using CMS (formerly known | PKI protocol that leverages existing technology by using Cryptographic Message | |||
as PKCS #7) and PKCS #10 over HTTP. SCEP is the evolution of the enrolment | Syntax (CMS, formerly known as PKCS #7) and PKCS #10 over HTTP. SCEP is the | |||
evolution of the enrolment | ||||
protocol sponsored by Cisco Systems, which enjoys wide support in both client | protocol sponsored by Cisco Systems, which enjoys wide support in both client | |||
and server implementations, as well as being relied upon by numerous other | and server implementations, as well as being relied upon by numerous other | |||
industry standards that work with certificates. | industry standards that work with certificates. | |||
</t> | </t> | |||
</abstract> | </abstract> | |||
<!-- | ||||
Status of this Memo | ||||
<t> | ||||
This document is not an Internet Standards Track specification; it is | ||||
published for informational purposes. | ||||
</t> | ||||
<t> | ||||
This document is a product of the Internet Engineering Task Force (IETF). The | ||||
consensus of the IETF community is that this document should be published | ||||
because it describes a protocol that is in wide use. However, the design of | ||||
the protocol itself does not represent the consensus of the IETF community. | ||||
The document has received public review and has been approved for publication | ||||
by the Internet Engineering Steering Group (IESG). Not all documents approved | ||||
by the IESG are a candidate for any level of Internet Standard; see Section 2 | ||||
of RFC 7841. | ||||
</t> | ||||
</front> | </front> | |||
<!-- ======================================================================== --> | ||||
<middle> | <middle> | |||
<!-- ====================================================================== | <section anchor="introduction" numbered="true" toc="default"> | |||
--> | <name>Introduction</name> | |||
<section anchor="introduction" title="Introduction"> | ||||
<t> | <t> | |||
X.509 certificates serve as the basis for several standardised security | X.509 certificates serve as the basis for several standardised security | |||
protocols such as <xref target="TLS">TLS</xref>, <xref target="SMIME"> | protocols such as <xref target="RFC8446" format="default">TLS</xref>, <xref | |||
S/MIME</xref>, and <xref target="IKEv2">IKE/IPsec</xref>. When an X.509 | target="RFC8551" format="default">S/MIME</xref>, and <xref target="RFC7296" | |||
certificate is issued there typically is a need for a certificate management | format="default">IKE/IPsec</xref>. When an X.509 | |||
certificate is issued, there typically is a need for a certificate management | ||||
protocol to enable a PKI client to request or renew a certificate from a | protocol to enable a PKI client to request or renew a certificate from a | |||
Certificate Authority (CA). This specification defines a protocol, Simple | Certificate Authority (CA). This specification defines a protocol, the Simple | |||
Certificate Enrolment Protocol (SCEP), for certificate management and | Certificate Enrolment Protocol (SCEP), for certificate management and | |||
certificate and CRL queries. | certificate and CRL queries. | |||
</t> | </t> | |||
<t> | <t> | |||
The SCEP protocol supports the following general operations: | The SCEP protocol supports the following general operations: | |||
</t> | </t> | |||
<ul spacing="compact"> | ||||
<li>CA public key distribution</li> | ||||
<li>Certificate enrolment and issue</li> | ||||
<li>Certificate renewal</li> | ||||
<li>Certificate query</li> | ||||
<li>CRL query</li> | ||||
</ul> | ||||
<t> | <t> | |||
<list style="symbols"> | SCEP makes extensive use of <xref target="RFC5652" format="default">CMS</xref> | |||
and <xref target="RFC2986" format="default">PKCS #10</xref>. | ||||
<t>CA public key distribution.</t> | ||||
<t>Certificate enrolment and issue.</t> | ||||
<t>Certificate renewal.</t> | ||||
<t>Certificate query.</t> | ||||
<t>CRL query.</t> | ||||
</list> | ||||
</t> | </t> | |||
<t> | ||||
SCEP makes extensive use of <xref target="CMS">CMS</xref> and <xref | ||||
target="PKCS10">PKCS #10</xref>. | ||||
</t> | <section anchor="mustshouldmay" numbered="true" toc="default"> | |||
<section anchor="mustshouldmay" title="Conventions Used in This Document"> | <name>Conventions Used in This Document</name> | |||
<t> The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | <t> | |||
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
"MAY", and "OPTIONAL" in this document are to be interpreted as | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
described in <xref target="RFC2119"/> and <xref target="RFC8174 | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | |||
"/> | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
when, and only when, they appear in all capitals, as shown here | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document | |||
.</t> | are to be interpreted as | |||
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174 | ||||
"/> | ||||
when, and only when, they appear in all capitals, as shown here. | ||||
</t> | ||||
<t>This document uses the Augmented Backus-Naur Form (ABNF) notat | <t>This document uses the Augmented Backus-Naur Form (ABNF) notation | |||
ion | as specified in <xref target="RFC5234" format="default"/> for defining f | |||
as specified in <xref target="ABNF"/> for defining formal syntax of | ormal syntax of | |||
commands. Non-terminals not defined in <xref target="ABNF"/> a | commands. Non-terminals not defined in <xref target="RFC5234" format="de | |||
re | fault"/> are | |||
defined in <xref target="HTTP-GET-POST"/>.</t> | defined in <xref target="HTTP-GET-POST" format="default"/>.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- ====================================================================== | ||||
--> | <section anchor="overview" numbered="true" toc="default"> | |||
<section anchor="overview" title="SCEP Overview"> | <name>SCEP Overview</name> | |||
<t> | <t> | |||
This section provides an overview of the functionality of SCEP. | This section provides an overview of the functionality of SCEP. | |||
</t> | </t> | |||
<section anchor="overview-entities" title="SCEP Entities"> | <section anchor="overview-entities" numbered="true" toc="default"> | |||
<name>SCEP Entities</name> | ||||
<t> | <t> | |||
The entity types defined in SCEP are a client requesting a certificate and a | The entity types defined in SCEP are a client requesting a certificate and a | |||
Certificate Authority (CA) that issues the certificate. These are described | Certificate Authority (CA) that issues the certificate. These are described | |||
in the following sections. | in the following sections. | |||
</t> | </t> | |||
<section anchor="overview-client" title="Client"> | <section anchor="overview-client" numbered="true" toc="default"> | |||
<name>Client</name> | ||||
<t> | <t> | |||
A client MUST have the following information locally configured: | A client <bcp14>MUST</bcp14> have the following information locally configured: | |||
</t> | </t> | |||
<t> | <ol type="1"> | |||
<li>The CA's fully qualified domain name or IP address.</li> | ||||
<list style="numbers"> | <li>Any identification and/or authorisation information required by | |||
<t>The CA's fully qualified domain name or IP address.</t | ||||
> | ||||
<t>Any identification and/or authorisation information re | ||||
quired by | ||||
the CA before a certificate will be issued, as described in | the CA before a certificate will be issued, as described in | |||
<xref target="PKCSReq"/>.</t> | <xref target="PKCSReq" format="default"/>.</li> | |||
<li>The identifying information that is used for authentication of | ||||
<t>The identifying information that is used for authentic | the CA in <xref target="GetCACert-resp" format="default"/ | |||
ation of | >, typically a certificate | |||
the CA in <xref target="GetCACert-resp"/>, typically a ce | fingerprint.</li> | |||
rtificate | </ol> | |||
fingerprint.</t> | </section> | |||
<section anchor="overview-ca" numbered="true" toc="default"> | ||||
</list> | <name>Certificate Authority</name> | |||
</t> | ||||
</section> | ||||
<section anchor="overview-ca" title="Certificate Authority"> | ||||
<t> | <t> | |||
A SCEP CA is the entity that signs client certificates. A CA may enforce | A SCEP CA is the entity that signs client certificates. A CA may enforce | |||
policies and apply them to certificate requests, and may reject a request for | policies and apply them to certificate requests, and it may reject a request for | |||
any reason. | any reason. | |||
</t> | </t> | |||
<t> | ||||
<t> | ||||
Since the client is expected to perform signature verification and optionally | Since the client is expected to perform signature verification and optionally | |||
encryption using the CA certificate, the keyUsage extension in the CA | encryption using the CA certificate, the keyUsage extension in the CA | |||
certificate MUST indicate that it is valid for digitalSignature and | certificate <bcp14>MUST</bcp14> indicate that it is valid for digitalSignature a nd | |||
keyEncipherment (if the key is to be used for en/decryption) alongside the | keyEncipherment (if the key is to be used for en/decryption) alongside the | |||
usual CA usages of keyCertSign and/or cRLSign. | usual CA usages of keyCertSign and/or cRLSign. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="overview-cert-dist" title="CA Certificate Distribution"> | <section anchor="overview-cert-dist" numbered="true" toc="default"> | |||
<t> | <name>CA Certificate Distribution</name> | |||
<t> | ||||
If the CA certificate(s) have not previously been acquired by the client | If the CA certificate(s) have not previously been acquired by the client | |||
through some other means, the client MUST retrieve them before any PKI | through some other means, the client <bcp14>MUST</bcp14> retrieve them before an | |||
operation (<xref target="message-obj"/>) can be started. Since no public key | y PKI | |||
operation (<xref target="message-obj" format="default"/>) can be started. Since | ||||
no public key | ||||
has yet been exchanged between the client and the CA, the messages cannot be | has yet been exchanged between the client and the CA, the messages cannot be | |||
secured using CMS, and the CA certificate request and response data is instead | secured using CMS, and the CA certificate request and response data is instead | |||
transferred in the clear. | transferred in the clear. | |||
</t> | </t> | |||
<t> | <t> | |||
If an intermediate CA is in use, a certificates-only CMS SignedData message | ||||
If an intermediate CA is in use, a certificates-only CMS Signed-Data message | ||||
with a certificate chain consisting of all CA certificates is returned. | with a certificate chain consisting of all CA certificates is returned. | |||
Otherwise the CA certificate itself is returned. | Otherwise, the CA certificate itself is returned. | |||
</t> | </t> | |||
<t> | <t> | |||
The CA certificate <bcp14>MAY</bcp14> be provided out of band to the client. Al | ||||
The CA certificate MAY be provided out-of-band to the client. Alternatively, | ternatively, | |||
the CA certificate fingerprint MAY be used to authenticate a CA Certificate | the CA certificate fingerprint <bcp14>MAY</bcp14> be used to authenticate a CA c | |||
distributed by the GetCACert response (<xref target="GetCACert"/>) or via | ertificate | |||
<xref target="HTTP-certstore">HTTP certificate-store access</xref>. The | distributed by the GetCACert response (<xref target="GetCACert" format="default" | |||
/>) or via | ||||
<xref target="RFC4387" format="default">HTTP certificate-store access</xref>. T | ||||
he | ||||
fingerprint is created by calculating a SHA-256 hash over the whole CA | fingerprint is created by calculating a SHA-256 hash over the whole CA | |||
certificate (for legacy reasons, a SHA-1 hash may be used by some | certificate. (For legacy reasons, a SHA-1 hash may be used by some | |||
implementations). | implementations.) | |||
</t> | </t> | |||
<t> | <t> | |||
After the client gets the CA certificate, it SHOULD authenticate it in some | After the client gets the CA certificate, it <bcp14>SHOULD</bcp14> authenticate | |||
manner unless this is deemed unnecessary, for example because the device is | it in some | |||
being provisioned inside a trusted environment. For example it could compare | manner unless this is deemed unnecessary, for example, because the device is | |||
its fingerprint with locally configured, out-of-band distributed, identifying | being provisioned inside a trusted environment. For example, the client could c | |||
ompare | ||||
the certificate's fingerprint with locally configured, out-of-band distributed, | ||||
identifying | ||||
information, or by some equivalent means such as a direct comparison with a | information, or by some equivalent means such as a direct comparison with a | |||
locally-stored copy of the certificate. | locally stored copy of the certificate. | |||
</t> | </t> | |||
<t> | <t> | |||
Intermediate CA certificates, if any, are signed by a higher-level CA so there | Intermediate CA certificates, if any, are signed by a higher-level CA, so there | |||
is no need to authenticate them against the out-of-band data. Since | is no need to authenticate them against the out-of-band data. Since | |||
intermediate CA certificates are rolled over more frequently than long-lived | intermediate CA certificates are rolled over more frequently than long-lived | |||
top-level CA certificates, clients MUST verify intermediate-level CA | top-level CA certificates, clients <bcp14>MUST</bcp14> verify intermediate-level CA | |||
certificates before use during protocol exchanges in case the intermediate CA | certificates before use during protocol exchanges in case the intermediate CA | |||
certificate has expired or otherwise been invalidated. | certificate has expired or otherwise been invalidated. | |||
</t> | </t> | |||
<t> | <t> | |||
When a CA certificate expires, certificates that have been signed by it may no | When a CA certificate expires, certificates that have been signed by it may no | |||
longer be regarded as valid. CA key rollover provides a mechanism by which | longer be regarded as valid. CA key rollover provides a mechanism by which | |||
the CA can distribute a new CA certificate which is valid in the future once | the CA can distribute a new CA certificate that will be valid in the future once | |||
the current certificate has expired. This is done via the GetNextCACert | the current certificate has expired. This is done via the GetNextCACert | |||
message (section <xref target="get-next-CA"/>). | message (<xref target="get-next-CA" format="default"/>). | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="overview-req-auth" title="Client authentication"> | <section anchor="overview-req-auth" numbered="true" toc="default"> | |||
<name>Client Authentication</name> | ||||
<t> | <t> | |||
As with every protocol that uses public-key cryptography, the association | As with every protocol that uses public-key cryptography, the association | |||
between the public keys used in the protocol and the identities with which | between the public keys used in the protocol and the identities with which | |||
they are associated must be authenticated in a cryptographically secure | they are associated must be authenticated in a cryptographically secure | |||
manner. Communications between the client and the CA are secured using SCEP | manner. Communications between the client and the CA are secured using SCEP | |||
Secure Message Objects as explained in <xref target="message-obj"/>, which | Secure Message Objects as explained in <xref target="message-obj" format="defaul t"/>, which | |||
specifies how CMS is used to encrypt and sign the data. In order to perform | specifies how CMS is used to encrypt and sign the data. In order to perform | |||
the signing operation the client uses an appropriate local certificate: | the signing operation, the client uses an appropriate local certificate: | |||
</t> | </t> | |||
<t> | <ol type="1"> | |||
<li>If the client does not have an appropriate existing certificate, | ||||
<list style="numbers"> | then a locally generated self-signed certificate <bcp14>MUST</b | |||
cp14> be used. The | ||||
<t>If the client does not have an appropriate existing certific | keyUsage extension in the certificate <bcp14>MUST</bcp14> indic | |||
ate | ate that it is valid | |||
then a locally generated self-signed certificate MUST be used. | ||||
The | ||||
keyUsage extension in the certificate MUST indicate that it is | ||||
valid | ||||
for digitalSignature and keyEncipherment (if available). The | for digitalSignature and keyEncipherment (if available). The | |||
self-signed certificate SHOULD use the same subject name and ke | self-signed certificate <bcp14>SHOULD</bcp14> use the same subj | |||
y as | ect name and key as | |||
in the PKCS #10 request. In this case the messageType is PKCSR | in the PKCS #10 request. In this case, the messageType is PKCS | |||
eq | Req | |||
(see <xref target="messageType"/>).</t> | (see <xref target="messageType" format="default"/>).</li> | |||
<li>If the client already has a certificate issued by the SCEP CA, and | ||||
<t>If the client already has a certificate issued by the SCEP C | the CA supports renewal (see <xref target="overview-cert-enrol" | |||
A and | format="default"/>), | |||
the CA supports renewal (see <xref target="overview-cert-enrol" | that certificate <bcp14>SHOULD</bcp14> be used. In this case, t | |||
/>), | he messageType is | |||
that certificate SHOULD be used. In this case the messageType i | RenewalReq (see <xref target="messageType" format="default"/>). | |||
s | </li> | |||
RenewalReq (see <xref target="messageType"/>).</t> | <li>Alternatively, if the client has no certificate issued by the | |||
SCEP CA but has credentials from an alternate CA, then the | ||||
<t>Alternatively, if the client has no certificate issued by th | certificate issued by the alternate CA <bcp14>MAY</bcp14> be us | |||
e | ed in a renewal | |||
SCEP CA but has credentials from an alternate CA then the | ||||
certificate issued by the alternate CA MAY be used in a renewal | ||||
request as described above. The SCEP CA's policy will determin e | request as described above. The SCEP CA's policy will determin e | |||
whether the request can be accepted or not.</t> | whether the request can be accepted or not.</li> | |||
</ol> | ||||
</list> | ||||
</t> | ||||
<t> | <t> | |||
Note that although the above text describes several different types of | Note that although the above text describes several different types of | |||
operations, for historical reasons most implementations always apply the first | operations, for historical reasons, most implementations always apply the first | |||
one even if an existing certificate already exists. For this reason support | one, even if an existing certificate already exists. For this reason, support | |||
for the first case is mandatory while support for the latter ones are optional | for the first case is mandatory while support for the latter ones are optional | |||
(see <xref target="MTI"/>). | (see <xref target="MTI" format="default"/>). | |||
</t> | </t> | |||
<t> | <t> | |||
During the certificate-enrolment process, the client <bcp14>MUST</bcp14> use | ||||
During the certificate enrolment process, the client MUST use the selected | the selected certificate's key when signing the CMS envelope (see <xref | |||
certificate's key when signing the CMS envelope (see <xref | target="message-obj" format="default"/>). This certificate will be either the | |||
target="message-obj"/>). This certificate will be either the self-signed one | self-signed one matching the PKCS #10 request or the CA-issued one used to | |||
matching the PKCS #10 request or the CA-issued one used to authorise a | authorise a renewal, and it <bcp14>MUST</bcp14> be included in the signedData | |||
renewal, and MUST be included in the signedData certificates field (possibly | certificates field (possibly as part of a full certificate chain). If the key | |||
as part of a full certificate chain). If the key being certified allows | being certified allows encryption, then the CA's CertResp will use the same | |||
encryption then the CA's CertResp will use the same certificate's public key | certificate's public key when encrypting the response. | |||
when encrypting the response. | ||||
</t> | </t> | |||
<t> | <t> | |||
Note that, in the case of renewal operations, this means that the request will | ||||
Note that in the case of renewal operations this means that the request will | be signed and authenticated with the key in the previously issued certificate | |||
be signed and authenticated with the key in the previously-issued certificate | ||||
rather than the key in the PKCS #10 request, and the response may similarly be | rather than the key in the PKCS #10 request, and the response may similarly be | |||
returned encrypted with the key in the previously-issued certificate. This | returned encrypted with the key in the previously issued certificate. This | |||
has security implications, see <xref target="security-no-pop"/>. | has security implications; see <xref target="security-no-pop" format="default"/> | |||
. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="overview-enrol-auth" title="Enrolment authorisation"> | ||||
<section anchor="overview-enrol-auth" numbered="true" toc="default"> | ||||
<name>Enrolment Authorisation</name> | ||||
<t> | <t> | |||
<xref target="PKCS10">PKCS #10</xref> specifies a <xref target="PKCS9">PKCS | <xref target="RFC2986" format="default">PKCS #10</xref> specifies a <xref target ="RFC2985" format="default">PKCS | |||
#9</xref> challengePassword attribute to be sent as part of the enrolment | #9</xref> challengePassword attribute to be sent as part of the enrolment | |||
request. When utilizing the challengePassword, the CA distributes a shared | request. When utilising the challengePassword, the CA distributes a shared | |||
secret to the client which will be used to authenticate the request from the | secret to the client, which will be used to authenticate the request from the | |||
the client. It is RECOMMENDED that the challengePassword be a one-time | client. It is <bcp14>RECOMMENDED</bcp14> that the challengePassword be a | |||
one-time | ||||
authenticator value to limit the ability of an attacker who can capture the | authenticator value to limit the ability of an attacker who can capture the | |||
authenticator from the client or CA to re-use it to request further | authenticator from the client or CA and reuse it to request further | |||
certificates. | certificates. | |||
</t> | </t> | |||
<t> | <t> | |||
Inclusion of the challengePassword by the SCEP client is RECOMMENDED, however | Inclusion of the challengePassword by the SCEP client is | |||
<bcp14>RECOMMENDED</bcp14>; however, | ||||
its omission allows for unauthenticated authorisation of enrolment requests | its omission allows for unauthenticated authorisation of enrolment requests | |||
(which may, however, require manual approval of each certificate issue if | (which may, however, require manual approval of each certificate issue if | |||
other security measures to control issue aren't in place, see below). | other security measures to control issue aren't in place; see below). | |||
Inclusion is OPTIONAL for renewal requests that are authenticated by being | Inclusion is <bcp14>OPTIONAL</bcp14> for renewal requests that are authenticated | |||
by being | ||||
signed with an existing certificate. The CMS envelope protects the privacy of | signed with an existing certificate. The CMS envelope protects the privacy of | |||
the challengePassword. | the challengePassword. | |||
</t> | </t> | |||
<t> | <t> | |||
A client that is performing certificate renewal as per <xref | A client that is performing certificate renewal as per <xref target="overview-ce | |||
target="overview-cert-enrol"/> SHOULD omit the challengePassword but MAY send | rt-enrol" format="default"/> <bcp14>SHOULD</bcp14> omit the challengePassword bu | |||
t <bcp14>MAY</bcp14> send | ||||
the originally distributed shared secret in the challengePassword attribute. | the originally distributed shared secret in the challengePassword attribute. | |||
The SCEP CA MAY use the challengePassword in addition to the previously issued | The SCEP CA <bcp14>MAY</bcp14> authenticate the request using the | |||
certificate that signs the request to authenticate the request. The SCEP CA | challengePassword in addition to the previously issued certificate that signs | |||
MUST NOT attempt to authenticate a client based on a self-signed certificate | the request. The SCEP CA <bcp14>MUST NOT</bcp14> attempt to authenticate a | |||
unless it has been verified through out-of-band means such as a certificate | client based on a self-signed certificate unless it has been verified through | |||
fingerprint. | out-of-band means such as a certificate fingerprint. | |||
</t> | </t> | |||
<t> | <t> | |||
To perform the authorisation in manual mode the client's request is placed in | To perform the authorisation in manual mode, the client's request is placed in | |||
the PENDING state until the CA operator authorises or rejects it. Manual | the PENDING state until the CA operator authorises or rejects it. Manual | |||
authorisation is used when the client has only a self-signed certificate that | authorisation is used when the client has only a self-signed certificate that | |||
hasn't been previously authenticated by the CA and/or a challengePassword is | hasn't been previously authenticated by the CA and/or a challengePassword is | |||
not available. The SCEP CA MAY either reject unauthorised requests or mark | not available. The SCEP CA <bcp14>MAY</bcp14> either reject unauthorised reques ts or mark | |||
them for manual authorisation according to CA policy. | them for manual authorisation according to CA policy. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="overview-cert-enrol" title="Certificate Enrolment/Renewal | <section anchor="overview-cert-enrol" numbered="true" toc="default"> | |||
"> | <name>Certificate Enrolment/Renewal</name> | |||
<t> | ||||
A client starts an enrolment transaction (<xref target="PKCSReq" format="default | ||||
"/>) by creating a | ||||
certificate request using PKCS #10 and sends the request to the CA enveloped | ||||
using CMS (<xref target="message-obj" format="default"/>). | ||||
</t> | ||||
<t> | <t> | |||
A client starts an enrolment transaction (<xref target="PKCSReq"/>) by | If the CA supports certificate renewal and the CA policy permits, then a new | |||
creating a certificate request using PKCS #10 and sends it to the CA enveloped | certificate with new validity dates can be issued, even though the old one is | |||
using CMS (<xref target="message-obj"/>). | ||||
</t> | ||||
<t> | ||||
If the CA supports certificate renewal and if the CA policy permits then a new | ||||
certificate with new validity dates can be issued even though the old one is | ||||
still valid. To renew an existing certificate, the client uses the RenewalReq | still valid. To renew an existing certificate, the client uses the RenewalReq | |||
message (see <xref target="pkiMessage-types"/>) and signs it with the existing | message (see <xref target="pkiMessage-types" format="default"/>) and signs it wi | |||
client certificate. The client SHOULD use a new keypair when requesting a new | th the existing | |||
certificate, but MAY request a new certificate using the old keypair. | client certificate. The client <bcp14>SHOULD</bcp14> use a new keypair when req | |||
uesting a new | ||||
certificate but <bcp14>MAY</bcp14> request a new certificate using the old keypa | ||||
ir. | ||||
</t> | </t> | |||
<t> | <t> | |||
If the CA returns a CertRep message (<xref target="CertRep"/>) with status set | If the CA returns a CertRep message (<xref target="CertRep" format="default"/>) with status set | |||
to PENDING, the client enters into polling mode by periodically sending a | to PENDING, the client enters into polling mode by periodically sending a | |||
CertPoll message (<xref target="CertPoll"/>) to the CA until the CA operator | CertPoll message (<xref target="CertPoll" format="default"/>) to the CA until th | |||
completes the manual authentication (approving or denying the request). The | e CA operator | |||
frequency of the polling operation is a CA/client configuration issue, and may | completes the manual authentication (approving or denying the request). The | |||
frequency of the polling operation is a CA/client configuration issue and may | ||||
range from seconds or minutes when the issue process is automatic but not | range from seconds or minutes when the issue process is automatic but not | |||
instantaneous, through to hours or days if the certificate issue operation | instantaneous, through to hours or days if the certificate-issue operation | |||
requires manual approval. | requires manual approval. | |||
</t> | </t> | |||
<t> | <t> | |||
If polling mode is being used then the client will send a single | If polling mode is being used, then the client will send a single | |||
PKCSReq/RenewalReq message (<xref target="PKCSReq"/>), followed by 0 or more | PKCSReq/RenewalReq message (<xref target="PKCSReq" format="default"/>), followed | |||
CertPoll messages (<xref target="CertPoll"/>). The CA will in return send 0 | by 0 or more | |||
or more CertRep messages (<xref target="CertRep"/>) with status set to PENDING | CertPoll messages (<xref target="CertPoll" format="default"/>). The CA will, in | |||
return, send 0 | ||||
or more CertRep messages (<xref target="CertRep" format="default"/>) with status | ||||
set to PENDING | ||||
in response to CertPolls, followed by a single CertRep message (<xref | in response to CertPolls, followed by a single CertRep message (<xref | |||
target="CertRep"/>) with status set to either SUCCESS or FAILURE. | target="CertRep" format="default"/>) with status set to either SUCCESS or | |||
FAILURE. | ||||
</t> | </t> | |||
<section anchor="overview-client-state" title="Client State Trans | <section anchor="overview-client-state" numbered="true" toc="default"> | |||
itions"> | <name>Client State Transitions</name> | |||
<t> | <t> | |||
The client state transitions during the SCEP process are indicated in <xref | ||||
target="state-diagram"/>. | ||||
</t> | The client state transitions during the SCEP process are indicated in <xref targ | |||
<figure anchor="state-diagram" title="State Transition Diagram" | et="state-diagram" format="default"/>. | |||
> | ||||
<artwork><![CDATA[ | ||||
</t> | ||||
<figure anchor="state-diagram"> | ||||
<name>State Transition Diagram</name> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
CertPoll | CertPoll | |||
+-----<----+ | +-----<----+ | |||
| | | | | | |||
| | CertRep(PENDING) | | | CertRep(PENDING) | |||
| | | | | | |||
[CERT-NONEXISTENT] ------> [CERT-REQ-PENDING] ---------> [CERT-ISSUED] | [CERT-NONEXISTENT] ------> [CERT-REQ-PENDING] --------> [CERT-ISSUED] | |||
^ PKCSReq | CertRep(SUCCESS) | ^ PKCSReq | CertRep(SUCCESS) | |||
| RenewalReq | | | RenewalReq | | |||
| | | | | | |||
+-----------------------+ | +-----------------------+ | |||
CertRep(FAILURE) or | CertRep(FAILURE) or | |||
Max-time/max-polls exceeded | Max-time/max-polls exceeded | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t> | <t> | |||
The certificate issue process starts at state CERT-NONEXISTENT. Sending a | The certificate-issue process starts at state CERT-NONEXISTENT. Sending a | |||
PKCSReq/RenewalReq message changes the state to CERT-REQ-PENDING. | PKCSReq/RenewalReq message changes the state to CERT-REQ-PENDING. | |||
</t> | </t> | |||
<t> | <t> | |||
If the CA returns a CertRep message with pkiStatus set to SUCCESS then the | If the CA returns a CertRep message with pkiStatus set to SUCCESS, then the | |||
state changes to CERT-ISSUED. | state changes to CERT-ISSUED. | |||
</t> | </t> | |||
<t> | <t> | |||
If the CA returns a CertRep message with pkiStatus set to FAILURE or there is | If the CA returns a CertRep message with pkiStatus set to FAILURE or there is | |||
no response then the state reverts back to CERT-NONEXISTENT. | no response, then the state reverts back to CERT-NONEXISTENT. | |||
</t> | </t> | |||
<t> | <t> | |||
If the CA returns a CertRep message with pkiStatus set to PENDING then the | If the CA returns a CertRep message with pkiStatus set to PENDING, then the | |||
client will keep polling by sending a CertPoll message until either a CertRep | client will keep polling by sending a CertPoll message until either a CertRep | |||
message with status set to SUCCESS or FAILURE is received or a timeout occurs | message with status set to SUCCESS or FAILURE is received, a timeout occurs, | |||
or the maximum number of polls has been exceeded. | or the maximum number of polls has been exceeded. | |||
</t> | </t> | |||
<figure> | <t><xref target="automatic" /> shows a successful transaction in | |||
<preamble>A successful transaction in automatic mode:</pr | automatic mode</t> | |||
eamble> | <figure anchor="automatic"> | |||
<artwork><![CDATA[ | <name>Automatic Mode</name> | |||
<artwork type="" align="left" alt=""><![CDATA[ | ||||
CLIENT CA SERVER | CLIENT CA SERVER | |||
PKCSReq: PKI cert. enrolment message | PKCSReq: PKI cert. enrolment message | |||
--------------------------------> CertRep: pkiStatus = SUCCESS | --------------------------------> CertRep: pkiStatus = SUCCESS | |||
Certificate attached | Certificate attached | |||
<------------------------------ | <------------------------------ | |||
Receive issued certificate. | Receive issued certificate. | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<figure> | ||||
<preamble>A successful transaction in manual mode:</pream | ||||
ble> | ||||
<artwork><![CDATA[ | ||||
<t><xref target="manual"/> shows a successful transaction in manual | ||||
mode:</t> | ||||
<figure anchor="manual"> | ||||
<name>Manual Mode</name> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
CLIENT CA SERVER | CLIENT CA SERVER | |||
PKCSReq: PKI cert. enrolment message | PKCSReq: PKI cert. enrolment message | |||
--------------------------------> CertRep: pkiStatus = PENDING | --------------------------------> CertRep: pkiStatus = PENDING | |||
<------------------------------ | <------------------------------ | |||
CertPoll: Polling message | CertPoll: Polling message | |||
--------------------------------> CertRep: pkiStatus = PENDING | --------------------------------> CertRep: pkiStatus = PENDING | |||
<------------------------------ | <------------------------------ | |||
................ <Manual identity authentication> ............... | ................ <Manual identity authentication> ............... | |||
skipping to change at line 493 ¶ | skipping to change at line 436 ¶ | |||
CertPoll: Polling message | CertPoll: Polling message | |||
--------------------------------> CertRep: pkiStatus = PENDING | --------------------------------> CertRep: pkiStatus = PENDING | |||
<------------------------------ | <------------------------------ | |||
................ <Manual identity authentication> ............... | ................ <Manual identity authentication> ............... | |||
CertPoll: Polling message | CertPoll: Polling message | |||
--------------------------------> CertRep: pkiStatus = SUCCESS | --------------------------------> CertRep: pkiStatus = SUCCESS | |||
Certificate attached | Certificate attached | |||
<------------------------------ | <------------------------------ | |||
Receive issued certificate. | Receive issued certificate. | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="overview-cert-access" title="Certificate Access"> | <section anchor="overview-cert-access" numbered="true" toc="default"> | |||
<name>Certificate Access</name> | ||||
<t> | <t> | |||
A certificate query message is defined for clients to retrieve a copy of their | A certificate query message is defined for clients to retrieve a copy of their | |||
own certificate from the CA. It allows clients that do not store their | own certificate from the CA. It allows clients that do not store their | |||
certificates locally to obtain a copy when needed. This functionality is not | certificates locally to obtain a copy when needed. This functionality is not | |||
intended to provide a general purpose certificate access service, which may be | intended to provide a general-purpose certificate-access service, which may be | |||
instead be achieved via <xref target="HTTP-certstore">HTTP certificate-store | achieved instead via <xref target="RFC4387" format="default">HTTP certificate-st | |||
access</xref> or LDAP. | ore | |||
access</xref> or Lightweight Directory Access Protocol (LDAP). | ||||
</t> | </t> | |||
<t> | <t> | |||
To retrieve a certificate from the CA, a client sends a request consisting of | To retrieve a certificate from the CA, a client sends a request consisting of | |||
the certificate's issuer name and serial number. This assumes that the client | the certificate's issuer name and serial number. This assumes that the client | |||
has saved the issuer name and the serial number of the issued certificate from | has saved the issuer name and the serial number of the issued certificate from | |||
the previous enrolment transaction. The transaction to retrieve a certificate | the previous enrolment transaction. The transaction to retrieve a certificate | |||
consists of one GetCert (<xref target="GetCertCRL"/>) message and one CertRep | consists of one GetCert (<xref target="GetCertCRL" format="default"/>) message a | |||
(<xref target="CertRep"/>) message, as shown below. | nd one CertRep | |||
(<xref target="CertRep" format="default"/>) message, as shown in <xref target="r | ||||
etrieve"/>. | ||||
</t> | </t> | |||
<figure> | <figure anchor="retrieve"> | |||
<artwork><![CDATA[ | <name>Retrieving a Certificate</name> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
CLIENT CA SERVER | CLIENT CA SERVER | |||
GetCert: PKI certificate query message | GetCert: PKI certificate query message | |||
-------------------------------> CertRep: pkiStatus = SUCCESS | -------------------------------> CertRep: pkiStatus = SUCCESS | |||
Certificate attached | Certificate attached | |||
<----------------------------- | <----------------------------- | |||
Receive the certificate. | Receive the certificate. | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="overview-CRL-access" title="CRL Access"> | <section anchor="overview-CRL-access" numbered="true" toc="default"> | |||
<name>CRL Access</name> | ||||
<t> | <t> | |||
SCEP clients MAY request a CRL via one of three methods: | SCEP clients <bcp14>MAY</bcp14> request a CRL via one of three methods: | |||
</t> | </t> | |||
<t> | <ol type="1"> | |||
<li>If the CA supports the <xref target="RFC5280" format="default">CRL | ||||
<list style="numbers"> | Distribution | |||
<t>If the CA supports the <xref target="PKIX">CRL Distribution | ||||
Points (CRLDPs) extension</xref> in issued certificates, then t he | Points (CRLDPs) extension</xref> in issued certificates, then t he | |||
CRL MAY be retrieved via the mechanism specified in the CRDLP.< | CRL <bcp14>MAY</bcp14> be retrieved via the mechanism specified | |||
/t> | in the CRLDP.</li> | |||
<li>If the CA supports <xref target="RFC4387" format="default">HTTP | ||||
<t>If the CA supports <xref target="HTTP-certstore">HTTP | certificate-store access</xref>, then the CRL <bcp14>MAY</bcp14 | |||
certificate-store access</xref>, then the CRL MAY be retrieved | > be retrieved via | |||
via | the <xref target="RFC5280" format="default">AuthorityInfoAcces< | |||
the <xref target="PKIX">AuthorityInfoAcces</xref> location spec | /xref> location specified | |||
ified | in the certificate.</li> | |||
in the certificate.</t> | <li>Only if the CA does not support CRLDPs or HTTP access should a | |||
<t>Only if the CA does not support CRDLPs or HTTP access should | ||||
a | ||||
CRL query be composed by creating a GetCRL message consisting o f the | CRL query be composed by creating a GetCRL message consisting o f the | |||
issuer name and serial number from the certificate whose revoca tion | issuer name and serial number from the certificate whose revoca tion | |||
status is being queried.</t> | status is being queried.</li> | |||
</ol> | ||||
</list> | <t> | |||
</t> | ||||
<t> | ||||
The message is sent to the SCEP CA in the same way as the other SCEP requests. | The message is sent to the SCEP CA in the same way as the other SCEP requests. | |||
The transaction to retrieve a CRL consists of one GetCRL PKI message and one | The transaction to retrieve a CRL consists of one GetCRL PKI message and one | |||
CertRep PKI message, which contains only the CRL (no certificates) in a | CertRep PKI message, which contains only the CRL (no certificates) in a | |||
degenerate certificates-only CMS Signed-Data message | degenerate certificates-only CMS SignedData message | |||
(<xref target="certs-only"/>), as shown below. | (<xref target="certs-only" format="default"/>), as shown in <xref target="retrie | |||
ve-CRL"/>. | ||||
</t> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
</t> | ||||
<figure anchor="retrieve-CRL"> | ||||
<name>Retrieving a CRL</name> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
CLIENT CA SERVER | CLIENT CA SERVER | |||
GetCRL: PKI CRL query message | GetCRL: PKI CRL query message | |||
----------------------------------> | ----------------------------------> | |||
CertRep: CRL attached | CertRep: CRL attached | |||
<----------------------------- | <----------------------------- | |||
Receive the CRL | Receive the CRL | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="overview-cert-rev" title="Certificate Revocation"> | <section anchor="overview-cert-rev" numbered="true" toc="default"> | |||
<name>Certificate Revocation</name> | ||||
<t> | <t> | |||
SCEP does not specify a method to request certificate revocation. In order to | SCEP does not specify a method to request certificate revocation. In order to | |||
revoke a certificate, the client must contact the CA using a non-SCEP defined | revoke a certificate, the client must contact the CA using a non-SCEP-defined me | |||
mechanism. | chanism. | |||
</t> | ||||
</t> | </section> | |||
</section> | <section anchor="MTI" numbered="true" toc="default"> | |||
<section anchor="MTI" title="Mandatory-to-Implement Functionality"> | <name>Mandatory-to-Implement Functionality</name> | |||
<t> | <t> | |||
At a minimum, all SCEP implementations compliant with this specification MUST | At a minimum, all SCEP implementations compliant with this specification <bcp14> | |||
support <xref target="CA-caps-HTTP">GetCACaps</xref>, | MUST</bcp14> | |||
<xref target="GetCACert">GetCACert</xref>, | support <xref target="CA-caps-HTTP" format="default">GetCACaps</xref>, | |||
<xref target="PKCSReq">PKCSReq</xref> (and its associated response messages), | <xref target="GetCACert" format="default">GetCACert</xref>, | |||
communication of binary data via <xref target="HTTP-GET-POST">HTTP | <xref target="PKCSReq" format="default">PKCSReq</xref> (and its associated respo | |||
POST</xref>, and the <xref target="AES">AES128-CBC</xref> and | nse messages), | |||
<xref target="SHA2">SHA-256</xref> algorithms to secure | communication of binary data via <xref target="HTTP-GET-POST" format="default">H | |||
<xref target="pkiMessage">pkiMessages</xref>. | TTP | |||
POST</xref>, and the <xref target="AES" format="default">AES128-CBC</xref> and | ||||
<xref target="SHA2" format="default">SHA-256</xref> algorithms to secure | ||||
<xref target="pkiMessage" format="default">pkiMessages</xref>. | ||||
</t> | </t> | |||
<t> | <t> | |||
For historical reasons implementations MAY support communications of binary | For historical reasons, implementations <bcp14>MAY</bcp14> support communication | |||
data via <xref target="HTTP-GET-POST">HTTP GET</xref>, and the triple DES-CBC | s of binary | |||
and SHA-1 algorithms to secure <xref target="pkiMessage">pkiMessages</xref>. | data via <xref target="HTTP-GET-POST" format="default">HTTP GET</xref>, and the | |||
Implementations MUST NOT support the obsolete and/or insecure single DES and | triple DES-CBC | |||
and SHA-1 algorithms to secure <xref target="pkiMessage" format="default">pkiMes | ||||
sages</xref>. | ||||
Implementations <bcp14>MUST NOT</bcp14> support the obsolete and/or insecure sin | ||||
gle DES and | ||||
MD5 algorithms used in earlier versions of this specification, since the | MD5 algorithms used in earlier versions of this specification, since the | |||
unsecured nature of GetCACaps means that an in-path attacker can trivially | unsecured nature of GetCACaps means that an in-path attacker can trivially | |||
roll back the encryption used to these insecure algorithms, see <xref | roll back the encryption used to these insecure algorithms; see <xref | |||
target="security-getcacaps"/>. | target="security-getcacaps" format="default"/>. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- ====================================================================== | ||||
--> | <section anchor="message-obj" numbered="true" toc="default"> | |||
<section anchor="message-obj" title="SCEP Secure Message Objects"> | <name>SCEP Secure Message Objects</name> | |||
<t> | <t> | |||
CMS is a general enveloping mechanism that enables both signed and encrypted | CMS is a general enveloping mechanism that enables both signed and encrypted | |||
transmission of arbitrary data. SCEP messages that require confidentiality | transmission of arbitrary data. SCEP messages that require confidentiality | |||
use two layers of CMS, as shown using ASN.1-like pseudocode in | use two layers of CMS, as shown using ASN.1-like pseudocode in | |||
<xref target="cms-layering"/>. By applying both enveloping and signing | <xref target="cms-layering" format="default"/>. By applying both enveloping and signing | |||
transformations, the SCEP message is protected both for the integrity of its | transformations, the SCEP message is protected both for the integrity of its | |||
end-to-end transaction information and the confidentiality of its information | end-to-end transaction information and the confidentiality of its information | |||
portion. | portion. | |||
</t> | </t> | |||
<figure anchor="cms-layering" title="CMS Layering"> | <figure anchor="cms-layering"> | |||
<artwork><![CDATA[ | <name>CMS Layering</name> | |||
<sourcecode type="pseudocode"> | ||||
pkiMessage { | pkiMessage { | |||
contentType = signedData { pkcs-7 2 }, | contentType = signedData { pkcs-7 2 }, | |||
content { | content { | |||
digestAlgorithms, | digestAlgorithms, | |||
encapsulatedContentInfo { | encapsulatedContentInfo { | |||
eContentType = data { pkcs-7 1 }, | eContentType = data { pkcs-7 1 }, | |||
eContent { -- pkcsPKIEnvelope, optional | eContent { -- pkcsPKIEnvelope, optional | |||
contentType = envelopedData { pkcs-7 3 }, | contentType = envelopedData { pkcs-7 3 }, | |||
content { | content { | |||
recipientInfo, | recipientInfo, | |||
skipping to change at line 669 ¶ | skipping to change at line 604 ¶ | |||
transactionID, | transactionID, | |||
messageType, | messageType, | |||
pkiStatus, | pkiStatus, | |||
failInfo, -- Optional | failInfo, -- Optional | |||
senderNonce / recipientNonce, | senderNonce / recipientNonce, | |||
}, | }, | |||
signature | signature | |||
} | } | |||
} | } | |||
} | } | |||
</sourcecode> | ||||
]]></artwork> | </figure> | |||
</figure> | ||||
<t> | <t> | |||
When a particular SCEP message carries data, this data is carried in the | When a particular SCEP message carries data, this data is carried in the | |||
messageData. CertRep messages will lack any signed content and consist only | messageData. CertRep messages will lack any signed content and consist only | |||
of a pkcsPKIEnvelope (<xref target="pkcsPKIEnvelope"/>). | of a pkcsPKIEnvelope (<xref target="pkcsPKIEnvelope" format="default"/>). | |||
</t> | </t> | |||
<t> | <t> | |||
The remainder of this document will refer only to 'messageData', but it is | The remainder of this document will refer only to "messageData", but it is | |||
understood to always be encapsulated in the pkcsPKIEnvelope (<xref | understood to always be encapsulated in the pkcsPKIEnvelope (<xref target="pkcsP | |||
target="pkcsPKIEnvelope"/>). The format of the data in the messageData is | KIEnvelope" format="default"/>). The format of the data in the messageData is | |||
defined by the messageType attribute (see <xref target="pkiMessage"/>) of the | defined by the messageType attribute (see <xref target="pkiMessage" format="defa | |||
Signed-Data. If there is no messageData to be transmitted, the entire | ult"/>) of the | |||
pkcsPKIEnvelope MUST be omitted. | SignedData. If there is no messageData to be transmitted, the entire | |||
pkcsPKIEnvelope <bcp14>MUST</bcp14> be omitted. | ||||
</t> | </t> | |||
<t> | <t> | |||
Samples of SCEP messages are available through the | Samples of SCEP messages are available through the | |||
<xref target="JSCEP">JSCEP project</xref> in the src/samples directory. | <xref target="JSCEP" format="default">JSCEP project</xref> in the src/samples di rectory. | |||
</t> | </t> | |||
<section anchor="message-processing" title="SCEP Message Object Process | <section anchor="message-processing" numbered="true" toc="default"> | |||
ing"> | <name>SCEP Message Object Processing</name> | |||
<t> | <t> | |||
Creating a SCEP message consists of several stages. The content to be | Creating a SCEP message consists of several stages. The content to be | |||
conveyed (in other words the messageData) is first encrypted, and the | conveyed (in other words, the messageData) is first encrypted, and the | |||
encrypted content is then signed. | encrypted content is then signed. | |||
</t> | </t> | |||
<t> | <t> | |||
The form of encryption to be applied depends on the capabilities of the | The form of encryption to be applied depends on the capabilities of the | |||
recipient's public key. If the key is encryption-capable (for example RSA) | recipient's public key. If the key is encryption capable (for example, RSA), | |||
then the messageData is encrypted using the recipient's public key with the | then the messageData is encrypted using the recipient's public key with the | |||
CMS KeyTransRecipientInfo mechanism. If the key is not encryption-capable | CMS KeyTransRecipientInfo mechanism. If the key is not encryption capable | |||
(for example DSA or ECDSA) then the messageData is encrypted using the | (for example, DSA or ECDSA), then | |||
the messageData is encrypted using the | ||||
challengePassword with the CMS PasswordRecipientInfo mechanism. | challengePassword with the CMS PasswordRecipientInfo mechanism. | |||
</t> | </t> | |||
<t> | <t> | |||
Once the messageData has been encrypted, it is signed with the sender's public | Once the messageData has been encrypted, it is signed with the sender's public | |||
key. This completes the SCEP message that is then sent to the recipient. | key. This completes the SCEP message, which is then sent to the recipient. | |||
</t> | </t> | |||
<t> | <t> | |||
Note that some early implementations of this specification dealt with | Note that some early implementations of this specification dealt with keys | |||
non-encryption-capable keys by omitting the encryption stage, based on the | that were not encryption capable by omitting the encryption stage, based on the | |||
text in <xref target="message-obj"/> that indicated that "the EnvelopedData is | text in <xref target="message-obj" format="default"/> that indicated that "the E | |||
omitted". This alternative processing mechanism SHOULD NOT be used since it | nvelopedData is | |||
omitted". This alternative processing mechanism <bcp14>SHOULD NOT</bcp14> be us | ||||
ed since it | ||||
exposes in cleartext the challengePassword used to authorise the certificate | exposes in cleartext the challengePassword used to authorise the certificate | |||
issue. | issue. | |||
</t> | </t> | |||
<t> | <t> | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="pkiMessage" title="SCEP pkiMessage"> | <section anchor="pkiMessage" numbered="true" toc="default"> | |||
<t> | <name>SCEP pkiMessage</name> | |||
<t> | ||||
The basic building block of all secured SCEP messages is the SCEP pkiMessage. | The basic building block of all secured SCEP messages is the SCEP pkiMessage. | |||
It consists of a CMS Signed-Data content type. The following restrictions | It consists of a CMS SignedData content type. The following restrictions | |||
apply: | apply: | |||
</t> | </t> | |||
<t> | <ul spacing="compact"> | |||
<li>The eContentType in encapsulatedContentInfo <bcp14>MUST</bcp14> be | ||||
<list style="symbols"> | data ({pkcs-7 | |||
1}).</li> | ||||
<t>The eContentType in encapsulatedContentInfo MUST be data ({p | <li>The signed content, if present (FAILURE and PENDING CertRep | |||
kcs-7 | messages will lack any signed content), | |||
1}).</t> | <bcp14>MUST</bcp14> be a pkcsPKIEnvelope | |||
(<xref target="pkcsPKIEnvelope" format="default"/>) | ||||
<t>The signed content, if present (FAILURE and PENDING CertRep | and <bcp14>MUST</bcp14> match the | |||
messages will lack any signed content), MUST be a pkcsPK | messageType attribute.</li> | |||
IEnvelope | <li>The SignerInfo <bcp14>MUST</bcp14> contain a set of authenticatedA | |||
(<xref target="pkcsPKIEnvelope"/>), and MUST match the | ttributes | |||
messageType attribute.</t> | (<xref target="signed-attrs" format="default"/>).</li> | |||
</ul> | ||||
<t>The SignerInfo MUST contain a set of authenticatedAttributes | <section anchor="signed-attrs" numbered="true" toc="default"> | |||
(<xref target="signed-attrs"/>).</t> | <name>Signed Transaction Attributes</name> | |||
<t> | ||||
</list> | ||||
</t> | ||||
<section anchor="signed-attrs" title="Signed Transaction Attribut | ||||
es"> | ||||
<t> | ||||
At a minimum, all messages MUST contain the following authenticatedAttributes: | ||||
</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>A transactionID attribute (see <xref | ||||
target="transactionID"/>).</t> | ||||
<t>A messageType attribute (see <xref target="messageType | ||||
"/>).</t> | ||||
<t>A fresh senderNonce attribute (see <xref | ||||
target="nonces"/>). Note however the comment about | ||||
senderNonces and polling in <xref target="CertRep"/> < | ||||
/t> | ||||
<t>Any attributes required by CMS.</t> | ||||
</list> | At a minimum, all messages <bcp14>MUST</bcp14> contain the following authenticat edAttributes: | |||
</t> | </t> | |||
<t> | <ul spacing="compact"> | |||
<li>A transactionID attribute (see <xref target="transactionID" form | ||||
at="default"/>).</li> | ||||
<li>A messageType attribute (see <xref target="messageType" format=" | ||||
default"/>).</li> | ||||
<li>A fresh senderNonce attribute (see <xref target="nonces" | ||||
format="default"/>). However, note the comment about | ||||
senderNonces and polling in <xref target="CertRep" format="default"/> | ||||
</li> | ||||
<li>Any attributes required by CMS.</li> | ||||
</ul> | ||||
<t> | ||||
If the message is a CertRep, it MUST also include the following | If the message is a CertRep, it <bcp14>MUST</bcp14> also include the following | |||
authenticatedAttributes: | authenticatedAttributes: | |||
</t> | </t> | |||
<t> | <ul spacing="compact"> | |||
<li>A pkiStatus attribute (see <xref target="pkiStatus" format="defa | ||||
<list style="symbols"> | ult"/>).</li> | |||
<li>failInfo and optional failInfoText attributes (see <xref | ||||
<t>A pkiStatus attribute (see <xref target="pkiStatus"/>) | target="failInfo" format="default"/>) if pkiStatus = FAILURE.</li> | |||
.</t> | <li>A recipientNonce attribute (see <xref target="nonces" format="de | |||
fault"/>) copied | ||||
<t>A failInfo and optional failInfotext attribute (see <x | from the senderNonce in the request that this is a response | |||
ref | to.</li> | |||
target="failInfo"/>) if pkiStatus = FAILURE.</t> | </ul> | |||
<t> | ||||
<t>A recipientNonce attribute (see <xref target="nonces"/ | ||||
>) copied | ||||
from the senderNonce in the request that this is a res | ||||
ponse | ||||
to.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
The following transaction attributes are encoded as authenticated attributes, | ||||
and are carried in the SignerInfo for this Signed-Data. | ||||
</t> | ||||
<texttable align="left"> | ||||
<ttcol>Attribute</ttcol> | ||||
<ttcol>Encoding</ttcol> | ||||
<ttcol>Comment</ttcol> | ||||
<c>transactionID</c><c>PrintableString</c><c>Unique ID fo | ||||
r this | ||||
transaction as a text string</c> | ||||
<c>messageType</c><c>PrintableString</c><c>Decimal value | ||||
as a | ||||
numeric text string</c> | ||||
<c>pkiStatus</c><c>PrintableString</c><c>Decimal value as | ||||
a | ||||
numeric text string</c> | ||||
<c>failInfo</c><c>PrintableString</c><c>Decimal value as | ||||
a | ||||
numeric text string</c> | ||||
<c>failInfoText</c><c>UTF8String</c><c>Descriptive text f | ||||
or the | ||||
failInfo value</c> | ||||
<c>senderNonce</c><c>OCTET STRING</c><c>Random nonce as a | ||||
16-byte | ||||
binary data string</c> | ||||
<c>recipientNonce</c><c>OCTET STRING</c><c>Random nonce a | ||||
s a | ||||
16-byte binary data string</c> | ||||
</texttable> | ||||
<texttable align="left"> | ||||
<preamble>The OIDs used for these attributes are as | ||||
follows:</preamble> | ||||
<ttcol>Name</ttcol> | ||||
<ttcol>ASN.1 Definition</ttcol> | ||||
<c>id-VeriSign</c><c>OBJECT_IDENTIFIER ::= {2 16 US(840) | ||||
1 | ||||
VeriSign(113733)}</c> | ||||
<c>id-pki</c><c>OBJECT_IDENTIFIER ::= {id-VeriSign pki(1) | ||||
}</c> | ||||
<c>id-attributes</c><c>OBJECT_IDENTIFIER ::= {id-pki | ||||
attributes(9)}</c> | ||||
<c>id-transactionID</c><c>OBJECT_IDENTIFIER ::= {id-attri | ||||
butes | ||||
transactionID(7)}</c> | ||||
<c>id-messageType</c><c>OBJECT_IDENTIFIER ::= {id-attribu | ||||
tes | ||||
messageType(2)}</c> | ||||
<c>id-pkiStatus</c><c>OBJECT_IDENTIFIER ::= {id-attribute | ||||
s | ||||
pkiStatus(3)}</c> | ||||
<c>id-failInfo</c><c>OBJECT_IDENTIFIER ::= {id-attributes | ||||
failInfo(4)}</c> | ||||
<c>id-senderNonce</c><c>OBJECT_IDENTIFIER ::= {id-attribu | ||||
tes | ||||
senderNonce(5)}</c> | ||||
<c>id-recipientNonce</c><c>OBJECT_IDENTIFIER ::= {id-attr | ||||
ibutes | ||||
recipientNonce(6)}</c> | ||||
<c>id-scep</c><c>OBJECT IDENTIFIER ::= {id-pkix TBD1}</c> | The following transaction attributes are encoded as authenticated attributes | |||
and carried in the SignerInfo for this SignedData. | ||||
<c>id-scep-failInfoText</c><c>OBJECT IDENTIFIER ::= {id-s | </t> | |||
cep 1}</c> | <table align="left"> | |||
<name>SCEP Attributes</name> | ||||
<thead> | ||||
<tr> | ||||
<th align="left">Attribute</th> | ||||
<th align="left">Encoding</th> | ||||
<th align="left">Comment</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left">transactionID</td> | ||||
<td align="left">PrintableString</td> | ||||
<td align="left">Unique ID for this | ||||
transaction as a text string</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">messageType</td> | ||||
<td align="left">PrintableString</td> | ||||
<td align="left">Decimal value as a | ||||
numeric text string</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">pkiStatus</td> | ||||
<td align="left">PrintableString</td> | ||||
<td align="left">Decimal value as a | ||||
numeric text string</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">failInfo</td> | ||||
<td align="left">PrintableString</td> | ||||
<td align="left">Decimal value as a | ||||
numeric text string</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">failInfoText</td> | ||||
<td align="left">UTF8String</td> | ||||
<td align="left">Descriptive text for the | ||||
failInfo value</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">senderNonce</td> | ||||
<td align="left">OCTET STRING</td> | ||||
<td align="left">Random nonce as a 16-byte | ||||
binary data string</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">recipientNonce</td> | ||||
<td align="left">OCTET STRING</td> | ||||
<td align="left">Random nonce as a | ||||
16-byte binary data string</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>The OIDs used for these attributes are as | ||||
follows:</t> | ||||
</texttable> | <table align="left"> | |||
<t> | <name>SCEP Attribute OIDs</name> | |||
<thead> | ||||
<tr> | ||||
<th align="left">Name</th> | ||||
<th align="left">ASN.1 Definition</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left">id-VeriSign</td> | ||||
<td align="left">OBJECT_IDENTIFIER ::= {2 16 US(840) 1 | ||||
VeriSign(113733)}</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">id-pki</td> | ||||
<td align="left">OBJECT_IDENTIFIER ::= {id-VeriSign pki(1)}</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">id-attributes</td> | ||||
<td align="left">OBJECT_IDENTIFIER ::= {id-pki | ||||
attributes(9)}</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">id-transactionID</td> | ||||
<td align="left">OBJECT_IDENTIFIER ::= {id-attributes | ||||
transactionID(7)}</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">id-messageType</td> | ||||
<td align="left">OBJECT_IDENTIFIER ::= {id-attributes | ||||
messageType(2)}</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">id-pkiStatus</td> | ||||
<td align="left">OBJECT_IDENTIFIER ::= {id-attributes | ||||
pkiStatus(3)}</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">id-failInfo</td> | ||||
<td align="left">OBJECT_IDENTIFIER ::= {id-attributes | ||||
failInfo(4)}</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">id-senderNonce</td> | ||||
<td align="left">OBJECT_IDENTIFIER ::= {id-attributes | ||||
senderNonce(5)}</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">id-recipientNonce</td> | ||||
<td align="left">OBJECT_IDENTIFIER ::= {id-attributes | ||||
recipientNonce(6)}</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">id-scep</td> | ||||
<td align="left">OBJECT IDENTIFIER ::= {id-pkix 24}</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">id-scep-failInfoText</td> | ||||
<td align="left">OBJECT IDENTIFIER ::= {id-scep 1}</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t> | ||||
The attributes are detailed in the following sections. | The attributes are detailed in the following sections. | |||
</t> | </t> | |||
<section anchor="transactionID" title="transactionID"> | <section anchor="transactionID" numbered="true" toc="default"> | |||
<t> | <name>transactionID</name> | |||
<t> | ||||
A PKI operation is a transaction consisting of the messages exchanged between | A PKI operation is a transaction consisting of the messages exchanged between | |||
a client and the CA. The transactionID is a text string provided by the | a client and the CA. The transactionID is a text string provided by the | |||
client when starting a transaction. The client MUST use a unique string as | client when starting a transaction. The client <bcp14>MUST</bcp14> use a unique | |||
the transaction identifier, encoded as a PrintableString, which MUST be used | string as | |||
for all PKI messages exchanged for a given operation such as a certificate | the transaction identifier, encoded as a PrintableString, which <bcp14>MUST</bcp | |||
14> be used | ||||
for all PKI messages exchanged for a given operation, such as a certificate | ||||
issue. | issue. | |||
</t> | </t> | |||
<t> | <t> | |||
Note that the transactionID must be unique, but not necessarily randomly | Note that the transactionID must be unique, but not necessarily randomly | |||
generated. For example it may be a value assigned by the CA to allow the | generated. For example, it may be a value assigned by the CA to allow the | |||
client to be identified by their transactionID, using a value such as the | client to be identified by their transactionID, using a value such as the | |||
client device's EUI or RTU ID or a similar unique identifier. This can be | client device's Extended Unique Identifier (EUI), Remote Terminal Unit (RTU) ID, | |||
useful when the client doesn't have a pre-assigned Distinguished Name that the | or a similar unique | |||
CA can identify their request through, for example when enrolling SCADA | identifier. This can be | |||
devices. | useful when the client doesn't have a preassigned Distinguished Name through | |||
which the CA can identify their request -- for example, when enrolling | ||||
</t> | Supervisory Control and Data Acquisition (SCADA) devices. | |||
</section> | ||||
<section anchor="messageType" title="messageType"> | ||||
<t> | ||||
</t> | ||||
</section> | ||||
<section anchor="messageType" numbered="true" toc="default"> | ||||
<name>messageType</name> | ||||
<t> | ||||
The messageType attribute specifies the type of operation performed by the | The messageType attribute specifies the type of operation performed by the | |||
transaction. This attribute MUST be included in all PKI messages. The | transaction. This attribute <bcp14>MUST</bcp14> be included in all PKI messages . The | |||
following message types are defined: | following message types are defined: | |||
</t> | ||||
</t> | <table anchor="scep-message-types"> | |||
<t> | <name>SCEP Message Types</name> | |||
<thead> | ||||
<list style="symbols"> | <tr> | |||
<th>Value</th> | ||||
<t>CertRep ("3") -- Response to certificate or CRL requ | <th>Name</th> | |||
est.</t> | <th>Description</th> | |||
</tr> | ||||
<t>RenewalReq ("17") -- PKCS #10 certificate request | </thead> | |||
authenticated with an existing certificate.</t> | <tbody> | |||
<t>PKCSReq ("19") -- PKCS #10 certificate request authe | ||||
nticated | ||||
with a shared secret.</t> | ||||
<t>CertPoll ("20") -- Certificate polling in manual enr | ||||
olment.</t> | ||||
<t>GetCert ("21") -- Retrieve a certificate.</t> | ||||
<t>GetCRL ("22") -- Retrieve a CRL.</t> | ||||
</list> | ||||
</t> | <tr> | |||
<t> | <td>0</td> | |||
<td>Reserved</td> | ||||
<td></td> | ||||
</tr> | ||||
<tr> | ||||
<td>3</td> | ||||
<td>CertRep</td> | ||||
<td>Response to certificate or CRL request.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>17</td> | ||||
<td>RenewalReq</td> | ||||
<td>PKCS #10 certificate request authenticated with an existing certificat | ||||
e.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>19</td> | ||||
<td>PKCSReq</td> | ||||
<td>PKCS #10 certificate request authenticated with a shared secret.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>20</td> | ||||
<td>CertPoll</td> | ||||
<td>Certificate polling in manual enrolment.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>21</td> | ||||
<td>GetCert</td> | ||||
<td>Retrieve a certificate.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>22</td> | ||||
<td>GetCRL</td> | ||||
<td>Retrieve a CRL.</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
Message types not defined above MUST be treated as an error unless their use | <t> | |||
has been negotiated through <xref target="CA-caps-HTTP">GetCACaps</xref>. | Message types not defined above <bcp14>MUST</bcp14> be treated as errors unless | |||
their use | ||||
has been negotiated through <xref target="CA-caps-HTTP" format="default">GetCACa | ||||
ps</xref>. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="pkiStatus" title="pkiStatus"> | <section anchor="pkiStatus" numbered="true" toc="default"> | |||
<t> | <name>pkiStatus</name> | |||
<t> | ||||
All response messages MUST include transaction status information, which is | All response messages <bcp14>MUST</bcp14> include transaction status information , which is | |||
defined as a pkiStatus attribute: | defined as a pkiStatus attribute: | |||
</t> | ||||
</t> | <table anchor="tab-pkiStatus"> | |||
<t> | <name>pkiStatus Attributes</name> | |||
<thead> | ||||
<list style="symbols"> | <tr> | |||
<th>Value</th> | ||||
<t>SUCCESS ("0") -- Request granted.</t> | <th>Name</th> | |||
<th>Description</th> | ||||
<t>FAILURE ("2") -- Request rejected. In this case the | </tr> | |||
failInfo | </thead> | |||
attribute, as defined in <xref target="failInfo" | <tbody> | |||
/>, MUST also | <tr> | |||
be present.</t> | <td>0</td> | |||
<td>SUCCESS</td> | ||||
<t>PENDING ("3") -- Request pending for manual approval | <td>Request granted.</td> | |||
.</t> | </tr> | |||
<tr> | ||||
</list> | <td>2</td> | |||
<td>FAILURE</td> | ||||
</t> | <td>Request rejected. In this case, the failInfo attribute, as defined | |||
<t> | in <xref target="failInfo" format="default"/>, <bcp14>MUST</bcp14> also | |||
be present.</td> | ||||
PKI status values not defined above MUST be treated as an error unless their | </tr> | |||
use has been negotiated through <xref target="CA-caps-HTTP">GetCACaps</xref>. | <tr> | |||
<td>3</td> | ||||
</t> | <td>PENDING</td> | |||
</section> | <td>Request pending for manual approval.</td> | |||
<section anchor="failInfo" title="failInfo and failInfoText"> | </tr> | |||
<t> | </tbody> | |||
</table> | ||||
The failInfo attribute MUST contain one of the following failure reasons: | ||||
</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>badAlg ("0") -- Unrecognized or unsupported algorith | ||||
m.</t> | ||||
<t>badMessageCheck ("1") -- Integrity check (meaning si | ||||
gnature | ||||
verification of the CMS message) failed.</t> | ||||
<t>badRequest ("2") -- Transaction not permitted or | ||||
supported.</t> | ||||
<t>badTime ("3") -- The signingTime attribute from the | ||||
CMS | ||||
authenticatedAttributes was not sufficiently clo | ||||
se to the | ||||
system time. This condition may occur if the CA | ||||
is concerned | ||||
about replays of old messages.</t> | ||||
<t>badCertId ("4") -- No certificate could be identifie | ||||
d | ||||
matching the provided criteria.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
Failure reasons not defined above MUST be treated as an error unless their use | <t> | |||
has been negotiated through <xref target="CA-caps-HTTP">GetCACaps</xref>. | PKI status values not defined above <bcp14>MUST</bcp14> be treated as errors unl | |||
ess their | ||||
use has been negotiated through <xref target="CA-caps-HTTP" format="default">Get | ||||
CACaps</xref>. | ||||
</t> | ||||
</section> | ||||
<section anchor="failInfo" numbered="true" toc="default"> | ||||
<name>failInfo and failInfoText</name> | ||||
<t> | ||||
The failInfo attribute <bcp14>MUST</bcp14> contain one of the following failure | ||||
reasons: | ||||
</t> | ||||
</t> | <table anchor="tab-failInfo"> | |||
<t> | <name>failInfo Attributes</name> | |||
<thead> | ||||
<tr> | ||||
<th>Value</th> | ||||
<th>Name</th> | ||||
<th>Description</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td>0</td> | ||||
<td>badAlg</td> | ||||
<td>Unrecognised or unsupported algorithm.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>1</td> | ||||
<td>badMessageCheck</td> | ||||
<td>Integrity check (meaning signature verification of the CMS message) fa | ||||
iled.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>2</td> | ||||
<td>badRequest</td> | ||||
<td>Transaction not permitted or supported.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>3</td> | ||||
<td>badTime</td> | ||||
<td>The signingTime attribute from the CMS authenticatedAttributes was | ||||
not sufficiently close to the system time. This condition may occur if | ||||
the CA is concerned about replays of old messages.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>4</td> | ||||
<td>badCertId</td> | ||||
<td>No certificate could be identified matching the provided criteria.</td | ||||
> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t> | ||||
Failure reasons not defined above <bcp14>MUST</bcp14> be treated as errors unles | ||||
s their use | ||||
has been negotiated through <xref target="CA-caps-HTTP" format="default">GetCACa | ||||
ps</xref>. | ||||
</t> | ||||
<t> | ||||
The failInfoText is a free-form UTF-8 text string that provides further | The failInfoText is a free-form UTF-8 text string that provides further | |||
information in the case of pkiStatus = FAILURE. In particular it may be used | information in the case of pkiStatus = FAILURE. In particular, it may be used | |||
to provide details on why a certificate request was not granted that go beyond | to provide details on why a certificate request was not granted that go beyond | |||
what's provided by the near-universal failInfo = badRequest status. Since | what's provided by the near-universal failInfo = badRequest status. Since | |||
this is a free-form text string intended for interpretation by humans, | this is a free-form text string intended for interpretation by humans, | |||
implementations SHOULD NOT assume that it has any type of machine-processable | implementations <bcp14>SHOULD NOT</bcp14> assume that it has any type of machine -processable | |||
content. | content. | |||
</t> | ||||
</t> | </section> | |||
</section> | <section anchor="nonces" numbered="true" toc="default"> | |||
<section anchor="nonces" title="senderNonce and recipientNonce" | <name>senderNonce and recipientNonce</name> | |||
> | <t> | |||
<t> | The senderNonce and recipientNonce attributes are each a 16-byte random number | |||
The senderNonce and recipientNonce attributes are a 16 byte random number | ||||
generated for each transaction. These are intended to prevent replay attacks. | generated for each transaction. These are intended to prevent replay attacks. | |||
</t> | ||||
</t> | <t> | |||
<t> | When a sender sends a PKI message to a recipient, a fresh senderNonce <bcp14>MUS | |||
T</bcp14> be | ||||
When a sender sends a PKI message to a recipient, a fresh senderNonce MUST be | included in the message. The recipient <bcp14>MUST</bcp14> copy the senderNonce | |||
included in the message. The recipient MUST copy the senderNonce into the | into the | |||
recipientNonce of the reply as a proof of liveliness. The original sender | recipientNonce of the reply as a proof of liveliness. The original sender | |||
MUST verify that the recipientNonce of the reply matches the senderNonce it | <bcp14>MUST</bcp14> verify that the recipientNonce of the reply matches the send | |||
sent in the request. If the nonce does not match then the message MUST be | erNonce it | |||
sent in the request. If the nonce does not match, then the message <bcp14>MUST< | ||||
/bcp14> be | ||||
rejected. | rejected. | |||
</t> | ||||
</t> | <t> | |||
<t> | ||||
Note that since SCEP exchanges consist of a single request followed by a | Note that since SCEP exchanges consist of a single request followed by a | |||
single response, the use of distinct sender and recipient nonces is redundant | single response, the use of distinct sender and recipient nonces is redundant, | |||
since the client sends a nonce in its request and the CA responds with the | since the client sends a nonce in its request and the CA responds with the | |||
same nonce in its reply. In effect there's just a single nonce, identified as | same nonce in its reply. In effect, there's just a single nonce, identified as | |||
senderNonce in the client's request and recipientNonce in the CA's reply. | senderNonce in the client's request and recipientNonce in the CA's reply. | |||
</t> | ||||
</t> | </section> | |||
</section> | </section> | |||
</section> | <section anchor="pkcsPKIEnvelope" numbered="true" toc="default"> | |||
<section anchor="pkcsPKIEnvelope" title="SCEP pkcsPKIEnvelope"> | <name>SCEP pkcsPKIEnvelope</name> | |||
<t> | <t> | |||
The information portion of a SCEP message is carried inside an EnvelopedData | The information portion of a SCEP message is carried inside an EnvelopedData | |||
content type, as defined in CMS, with the following restrictions: | content type, as defined in CMS, with the following restrictions: | |||
</t> | </t> | |||
<t> | <ul spacing="compact"> | |||
<li>contentType in encryptedContentInfo <bcp14>MUST</bcp14> be data | ||||
<list style="symbols"> | ({pkcs-7 | |||
1}).</li> | ||||
<t>contentType in encryptedContentInfo MUST be data ({pkc | ||||
s-7 | ||||
1}).</t> | ||||
<t>encryptedContent MUST be the SCEP message being transp | ||||
orted | ||||
(see <xref target="SCEP-trans"/>), and must match the | ||||
messageType authenticated Attribute in the pkiMessage. | ||||
</t> | ||||
</list> | ||||
</t> | <li>encryptedContent <bcp14>MUST</bcp14> be the SCEP message being t | |||
</section> | ransported | |||
</section> | (see <xref target="SCEP-trans" format="default"/>) | |||
<section anchor="pkiMessage-types" title="SCEP pkiMessage types"> | and <bcp14>MUST</bcp14> match the | |||
<t> | messageType authenticated Attribute in the pkiMessage. | |||
</li> | ||||
</ul> | ||||
</section> | ||||
</section> | ||||
<section anchor="pkiMessage-types" numbered="true" toc="default"> | ||||
<name>SCEP pkiMessage types</name> | ||||
<t> | ||||
All of the messages in this section are pkiMessages (<xref | All of the messages in this section are pkiMessages (<xref target="pkiMessage" f | |||
target="pkiMessage"/>), where the type of the message MUST be specified in the | ormat="default"/>), where the type of the message <bcp14>MUST</bcp14> be specifi | |||
'messageType' authenticated Attribute. Each section defines a valid message | ed in the | |||
"messageType" authenticated Attribute. Each section defines a valid message | ||||
type, the corresponding messageData formats, and mandatory authenticated | type, the corresponding messageData formats, and mandatory authenticated | |||
attributes for that type. | attributes for that type. | |||
</t> | </t> | |||
<section anchor="PKCSReq" title="PKCSReq/RenewalReq"> | <section anchor="PKCSReq" numbered="true" toc="default"> | |||
<t> | <name>PKCSReq/RenewalReq</name> | |||
<t> | ||||
The messageData for this type consists of a PKCS #10 Certificate Request. The | The messageData for this type consists of a PKCS #10 Certificate Request. The | |||
certificate request MUST contain at least the following items: | certificate request <bcp14>MUST</bcp14> contain at least the following items: | |||
</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>The subject Distinguished Name.</t> | ||||
<t>The subject public key.</t> | ||||
<t>For a PKCSReq and if authorisation based on a shared s | ||||
ecret is | ||||
being used, a challengePassword attribute.</t> | ||||
</list> | ||||
</t> | </t> | |||
<t> | <ul spacing="compact"> | |||
<li>The subject Distinguished Name.</li> | ||||
<li>The subject public key.</li> | ||||
<li>For a PKCSReq, if authorisation based on a shared secret is | ||||
being used, a challengePassword attribute.</li> | ||||
</ul> | ||||
<t> | ||||
In addition the message must contain the the authenticatedAttributes specified i | In addition, the message must contain the authenticatedAttributes specified in | |||
n | <xref target="signed-attrs" format="default"/>. | |||
<xref target="signed-attrs"/>. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="CertRep" title="CertRep"> | <section anchor="CertRep" numbered="true" toc="default"> | |||
<t> | <name>CertRep</name> | |||
<t> | ||||
The messageData for this type consists of a degenerate certificates-only CMS | The messageData for this type consists of a degenerate certificates-only CMS | |||
Signed-Data message (<xref target="certs-only"/>). The exact content required | SignedData message (<xref target="certs-only" format="default"/>). The exact co ntent required | |||
for the reply depends on the type of request that this message is a response | for the reply depends on the type of request that this message is a response | |||
to. The request types are detailed in <xref target="CertRep-success"/> and in | to. The request types are detailed in Sections <xref target="CertRep-success" | |||
<xref target="SCEP-trans"/>. In addition the message must contain the the | format="counter"/> and <xref target="SCEP-trans" format="counter"/>. In | |||
authenticatedAttributes specified in <xref target="signed-attrs"/>. | addition, the message must contain the | |||
authenticatedAttributes specified in <xref target="signed-attrs" format="default | ||||
</t> | "/>. | |||
<t> | ||||
Earlier versions of this specification required that this message include a | </t> | |||
<t> | ||||
Earlier draft versions of this specification required that this message include | ||||
a | ||||
senderNonce alongside the recipientNonce, which was to be used to chain to | senderNonce alongside the recipientNonce, which was to be used to chain to | |||
subsequent polling operations. However if a single message was lost during | subsequent polling operations. However, if a single message was lost during | |||
the potentially extended interval over which polling could take place (see | the potentially extended interval over which polling could take place (see | |||
<xref target="state-trans"/> for an example of this) then if the | <xref target="state-trans" format="default"/> for an example of this), then if t | |||
implementation were to enforce this requirement the overall transaction would | he | |||
fail even though nothing had actually gone wrong. Because of this issue, | implementation were to enforce this requirement, the overall transaction would | |||
implementations mostly ignored the requirement to carry this nonce over to | fail, even though nothing had actually gone wrong. Because of this issue, | |||
subsequent polling messages or to verify its presence. More recent versions | implementations mostly ignored the requirement to either carry this nonce over t | |||
o | ||||
subsequent polling messages or verify its presence. More recent versions | ||||
of the specification no longer require the chaining of nonces across polling | of the specification no longer require the chaining of nonces across polling | |||
operations. | operations. | |||
</t> | </t> | |||
<section anchor="CertRep-success" title="CertRep SUCCESS"> | <section anchor="CertRep-success" numbered="true" toc="default"> | |||
<t> | <name>CertRep SUCCESS</name> | |||
<t> | ||||
When the pkiStatus attribute is set to SUCCESS, the messageData for this | When the pkiStatus attribute is set to SUCCESS, the messageData for this | |||
message consists of a degenerate certificates-only CMS Signed-Data message | message consists of a degenerate certificates-only CMS SignedData message | |||
(<xref target="certs-only"/>). The content of this degenerate | (<xref target="certs-only" format="default"/>). The content of this degenerate | |||
certificates-only Signed-Data depends on what the original request was, as | certificates-only SignedData message depends on what the original request was, a | |||
outlined below. | s | |||
outlined in <xref target="success"/>. | ||||
</t> | ||||
<texttable align="left"> | ||||
<ttcol>Request-type</ttcol> | ||||
<ttcol>Reply-contents</ttcol> | ||||
<c>PKCSReq</c><c>The reply MUST contain at least the is | ||||
sued | ||||
certificate in the certificates field of the Sig | ||||
ned-Data. | ||||
The reply MAY contain additional certificates, b | ||||
ut the issued | ||||
certificate MUST be the leaf certificate.</c> | ||||
<c>RenewalReq</c><c>Same as PKCSReq</c> | ||||
<c>CertPoll</c><c>Same as PKCSReq</c> | ||||
<c>GetCert</c><c>The reply MUST contain at least the re | ||||
quested | ||||
certificate in the certificates field of the Sig | ||||
ned-Data. | ||||
The reply MAY contain additional certificates, b | ||||
ut the | ||||
requested certificate MUST be the leaf certifica | ||||
te.</c> | ||||
<c>GetCRL</c><c>The reply MUST contain the CRL in the c | ||||
rls field | ||||
of the Signed-Data.</c> | ||||
</texttable> | </t> | |||
</section> | <table align="left" anchor="success"> | |||
<section anchor="CertRep-failure" title="CertRep FAILURE"> | <name>CertRep Response Types</name> | |||
<t> | <thead> | |||
<tr> | ||||
<th align="left">Request-type</th> | ||||
<th align="left">Reply-contents</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left">PKCSReq</td> | ||||
<td align="left">The reply <bcp14>MUST</bcp14> contain at leas | ||||
t the issued | ||||
certificate in the certificates field of the SignedData. | ||||
The reply <bcp14>MAY</bcp14> contain additional certificates, b | ||||
ut the issued | ||||
certificate <bcp14>MUST</bcp14> be the leaf certificate.</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">RenewalReq</td> | ||||
<td align="left">Same as PKCSReq</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">CertPoll</td> | ||||
<td align="left">Same as PKCSReq</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">GetCert</td> | ||||
<td align="left">The reply <bcp14>MUST</bcp14> contain at leas | ||||
t the requested | ||||
certificate in the certificates field of the Sig | ||||
nedData. | ||||
The reply <bcp14>MAY</bcp14> contain additional | ||||
certificates, but the | ||||
requested certificate <bcp14>MUST</bcp14> be the | ||||
leaf certificate.</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">GetCRL</td> | ||||
<td align="left">The reply <bcp14>MUST</bcp14> contain the | ||||
CRL in the crls field of the SignedData.</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | ||||
<section anchor="CertRep-failure" numbered="true" toc="default"> | ||||
<name>CertRep FAILURE</name> | ||||
<t> | ||||
When the pkiStatus attribute is set to FAILURE, the reply MUST also contain a | When the pkiStatus attribute is set to FAILURE, the reply <bcp14>MUST</bcp14> al | |||
failInfo (<xref target="failInfo"/>) attribute set to the appropriate error | so contain a | |||
condition describing the failure. The reply MAY also contain a failInfoText | failInfo (<xref target="failInfo" format="default"/>) attribute set to the appro | |||
priate error | ||||
condition describing the failure. The reply <bcp14>MAY</bcp14> also contain a f | ||||
ailInfoText | ||||
attribute providing extended details on why the operation failed, typically to | attribute providing extended details on why the operation failed, typically to | |||
expand on the catch-all failInfo = badRequest status. The pkcsPKIEnvelope | expand on the catchall failInfo = badRequest status. The pkcsPKIEnvelope | |||
(<xref target="pkcsPKIEnvelope"/>) MUST be omitted. | (<xref target="pkcsPKIEnvelope" format="default"/>) <bcp14>MUST</bcp14> be omitt | |||
ed. | ||||
</t> | ||||
</section> | ||||
<section anchor="CertRep-pending" title="CertRep PENDING"> | ||||
<t> | ||||
When the pkiStatus attribute is set to PENDING, the pkcsPKIEnvelope (<xref | </t> | |||
target="pkcsPKIEnvelope"/>) MUST be omitted. | </section> | |||
<section anchor="CertRep-pending" numbered="true" toc="default"> | ||||
<name>CertRep PENDING</name> | ||||
<t> | ||||
</t> | When the pkiStatus attribute is set to PENDING, the pkcsPKIEnvelope (<xref targe | |||
</section> | t="pkcsPKIEnvelope" format="default"/>) <bcp14>MUST</bcp14> be omitted. | |||
</section> | ||||
<section anchor="CertPoll" title="CertPoll (GetCertInitial)"> | ||||
<t> | ||||
This message is used for certificate polling. For unknown reasons it was | </t> | |||
referred to as "GetCertInitial" in earlier versions of this specification. | </section> | |||
</section> | ||||
<section anchor="CertPoll" numbered="true" toc="default"> | ||||
<name>CertPoll (GetCertInitial)</name> | ||||
<t> | ||||
This message is used for certificate polling. For unknown reasons, it was | ||||
referred to as "GetCertInitial" in earlier draft versions of this specification. | ||||
The messageData for this type consists of an IssuerAndSubject: | The messageData for this type consists of an IssuerAndSubject: | |||
</t> | ||||
</t> | <sourcecode> | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
issuerAndSubject ::= SEQUENCE { | issuerAndSubject ::= SEQUENCE { | |||
issuer Name, | issuer Name, | |||
subject Name | subject Name | |||
} | } | |||
</sourcecode> | ||||
]]></artwork> | <t> | |||
</figure> | The issuer is set to the subjectName of the CA (in other words, the intended | |||
<t> | ||||
The issuer is set to the subjectName of the CA (in other words the intended | ||||
issuerName of the certificate that's being requested). The subject is set to | issuerName of the certificate that's being requested). The subject is set to | |||
the subjectName used when requesting the certificate. | the subjectName used when requesting the certificate. | |||
</t> | ||||
</t> | <t> | |||
<t> | Note that both of these fields are redundant; the CA is identified by the | |||
recipientInfo in the pkcsPKIEnvelope (or in most cases, simply by the server | ||||
Note that both of these fields are redundant, the CA is identified by the | that the message is being sent to), and the client/transaction being polled is | |||
recipientInfo in the pkcsPKIEnvelope (or in most cases simply by the server | ||||
that the message is being sent to) and the client/transaction being polled is | ||||
identified by the transactionID. Both of these fields can be processed by the | identified by the transactionID. Both of these fields can be processed by the | |||
CA without going through the cryptographically expensive process of unwrapping | CA without going through the cryptographically expensive process of unwrapping | |||
and processing the issuerAndSubject. For this reason implementations SHOULD | and processing the issuerAndSubject. For this reason, implementations <bcp14>SH OULD</bcp14> | |||
assume that the polling operation will be controlled by the recipientInfo and | assume that the polling operation will be controlled by the recipientInfo and | |||
transactionID rather than the contents of the messageData. In addition the | transactionID rather than the contents of the messageData. In addition, the | |||
message must contain the the authenticatedAttributes specified in <xref | message must contain the authenticatedAttributes specified in <xref | |||
target="signed-attrs"/>. | target="signed-attrs" format="default"/>. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="GetCertCRL" title="GetCert and GetCRL"> | <section anchor="GetCertCRL" numbered="true" toc="default"> | |||
<t> | <name>GetCert and GetCRL</name> | |||
<t> | ||||
The messageData for these types consist of an IssuerAndSerialNumber as defined | The messageData for these types consist of an IssuerAndSerialNumber, as defined | |||
in CMS which uniquely identifies the certificate being requested, either the | in CMS, that uniquely identifies the certificate being requested, either the | |||
certificate itself for GetCert or its revocation status via a CRL for GetCRL. | certificate itself for GetCert or its revocation status via a CRL for GetCRL. | |||
In addition the message must contain the the authenticatedAttributes specified | In addition, the message must contain the authenticatedAttributes specified | |||
in <xref target="signed-attrs"/>. | in <xref target="signed-attrs" format="default"/>. | |||
</t> | </t> | |||
<t> | <t> | |||
These message types, while included here for completeness, apply unnecessary | These message types, while included here for completeness, apply unnecessary | |||
cryptography and messaging overhead to the simple task of transferring a | cryptography and messaging overhead to the simple task of transferring a | |||
certificate or CRL (see <xref target="security-unnecessary"/>). | certificate or CRL (see <xref target="security-unnecessary" format="default"/>). | |||
Implementations SHOULD prefer | Implementations <bcp14>SHOULD</bcp14> prefer | |||
<xref target="HTTP-certstore">HTTP certificate-store access</xref> or LDAP | <xref target="RFC4387" format="default">HTTP certificate-store access</xref> or | |||
LDAP | ||||
over the use of these messages. | over the use of these messages. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="certs-only" title="Degenerate certificates-only CMS Signe | <section anchor="certs-only" numbered="true" toc="default"> | |||
d-Data"> | <name>Degenerate certificates-only CMS SignedData</name> | |||
<t> | ||||
CMS includes a degenerate case of the Signed-Data content type in which there | <t> | |||
CMS includes a degenerate case of the SignedData content type in which there | ||||
are no signers. The use of such a degenerate case is to disseminate | are no signers. The use of such a degenerate case is to disseminate | |||
certificates and CRLs. For SCEP the content field of the ContentInfo value of | certificates and CRLs. For SCEP, the content field of the ContentInfo value of | |||
a degenerate certificates-only Signed-Data MUST be omitted. When carrying | a degenerate certificates-only SignedData <bcp14>MUST</bcp14> be omitted. When | |||
certificates, the certificates are included in the 'certificates' field of the | carrying | |||
Signed-Data. When carrying a CRL, the CRL is included in the 'crls' field of | certificates, the certificates are included in the certificates field of the | |||
the Signed-Data. | SignedData. When carrying a CRL, the CRL is included in the crls field of | |||
the SignedData. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="CA-caps" title="CA Capabilities"> | <section anchor="CA-caps" numbered="true" toc="default"> | |||
<name>CA Capabilities</name> | ||||
<t> | <t> | |||
In order to provide support for future enhancements to the protocol, CAs MUST | In order to provide support for future enhancements to the protocol, CAs <bcp14> MUST</bcp14> | |||
implement the GetCACaps message to allow clients to query which functionality | implement the GetCACaps message to allow clients to query which functionality | |||
is available from the CA. | is available from the CA. | |||
</t> | </t> | |||
<section anchor="CA-caps-HTTP" title="GetCACaps HTTP Message Format"> | <section anchor="CA-caps-HTTP" numbered="true" toc="default"> | |||
<name>GetCACaps HTTP Message Format</name> | ||||
<figure> | <t>This message requests capabilities from a CA, with the | |||
<preamble>This message requests capabilities from a CA, with | format as described in <xref target="HTTP-GET-POST" format="default"/>: | |||
the | </t> | |||
format:</preamble> | ||||
<artwork><![CDATA[ | ||||
<sourcecode type=""> | ||||
"GET" SP SCEPPATH "?operation=GetCACaps" SP HTTP-version CRLF | "GET" SP SCEPPATH "?operation=GetCACaps" SP HTTP-version CRLF | |||
</sourcecode> | ||||
]]></artwork> | </section> | |||
</figure> | ||||
<t> | ||||
as described in <xref target="HTTP-GET-POST"/>. | ||||
</t> | ||||
</section> | ||||
<section anchor="CA-caps-resp" title="CA Capabilities Response Format | ||||
"> | ||||
<texttable align="left"> | <section anchor="CA-caps-resp" numbered="true" toc="default"> | |||
<preamble>The response for a GetCACaps message is a list of C | <name>CA Capabilities Response Format</name> | |||
A | <t>The response for a GetCACaps message is a list of CA | |||
capabilities, in plain text and in any order, separated | capabilities, in plain text and in any order, separated | |||
by <CR><LF> or <LF> c haracters. This | by <CR><LF> or <LF> c haracters. This | |||
specification defines the following key words (quotation | specification defines the following key words (quotation | |||
marks are not sent):</preamble> | marks are not sent):</t> | |||
<ttcol>Keyword</ttcol> | <table align="left" anchor="keywords"> | |||
<ttcol>Description</ttcol> | <name>GetCACaps Response Keywords</name> | |||
<thead> | ||||
<c>"AES"</c><c>CA supports the AES128-CBC encryption | <tr> | |||
algorithm.</c> | <th align="left">Keyword</th> | |||
<th align="left">Description</th> | ||||
<c>"DES3"</c><c>CA supports the triple DES-CBC encryption | </tr> | |||
algorithm.</c> | </thead> | |||
<tbody> | ||||
<c>"GetNextCACert"</c><c>CA supports the GetNextCACert | <tr> | |||
message.</c> | <td align="left">AES</td> | |||
<td align="left">CA supports the AES128-CBC encryption | ||||
<c>"POSTPKIOperation"</c><c>CA supports PKIOPeration messages | algorithm.</td> | |||
sent | </tr> | |||
via HTTP POST.</c> | <tr> | |||
<td align="left">DES3</td> | ||||
<c>"Renewal"</c><c>CA supports the Renewal CA operation.</c> | <td align="left">CA supports the triple DES-CBC encryption | |||
algorithm.</td> | ||||
<c>"SHA-1"</c><c>CA supports the SHA-1 hashing algorithm.</c> | </tr> | |||
<tr> | ||||
<c>"SHA-256"</c><c>CA supports the SHA-256 hashing algorithm. | <td align="left">GetNextCACert</td> | |||
</c> | <td align="left">CA supports the GetNextCACert | |||
message.</td> | ||||
<c>"SHA-512"</c><c>CA supports the SHA-512 hashing algorithm. | </tr> | |||
</c> | <tr> | |||
<td align="left">POSTPKIOperation</td> | ||||
<c>"SCEPStandard"</c><c>CA supports all mandatory-to-implemen | <td align="left">CA supports PKIOPeration messages sent | |||
t | via HTTP POST.</td> | |||
</tr> | ||||
<tr> | ||||
<td align="left">Renewal</td> | ||||
<td align="left">CA supports the Renewal CA operation.</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">SHA-1</td> | ||||
<td align="left">CA supports the SHA-1 hashing algorithm.</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">SHA-256</td> | ||||
<td align="left">CA supports the SHA-256 hashing algorithm.</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">SHA-512</td> | ||||
<td align="left">CA supports the SHA-512 hashing algorithm.</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">SCEPStandard</td> | ||||
<td align="left">CA supports all mandatory-to-implement | ||||
sections of the SCEP standard. This keyword implies "AES ", | sections of the SCEP standard. This keyword implies "AES ", | |||
"POSTPKIOperation", and "SHA-256", as well as the provisi ons of | "POSTPKIOperation", and "SHA-256", as well as the provisi ons of | |||
<xref target="MTI"/>.</c> | <xref target="MTI" format="default"/>.</td> | |||
</tr> | ||||
</texttable> | </tbody> | |||
</table> | ||||
<t> | <t> | |||
The table above lists all of the keywords that are defined in this | <xref target="keywords" /> lists all of the keywords that are defined in this | |||
specification. A CA MAY provide additional keywords advertising further | specification. A CA <bcp14>MAY</bcp14> provide additional keywords advertising | |||
capabilities and functionality. A client MUST be able to accept and ignore | further | |||
capabilities and functionality. A client <bcp14>MUST</bcp14> be able to accept | ||||
and ignore | ||||
any unknown keywords that might be sent by a CA. | any unknown keywords that might be sent by a CA. | |||
</t> | ||||
</t> | <t> | |||
<t> | The CA <bcp14>MUST</bcp14> use the text case specified here, but clients | |||
<bcp14>SHOULD</bcp14> ignore the text case when processing this message. | ||||
The CA MUST use the text case specified here, but clients SHOULD ignore the | Clients <bcp14>MUST</bcp14> accept the standard | |||
text case when processing this message. Clients MUST accept the standard | HTTP-style text delimited by <CR><LF> as well as the | |||
HTTP-style <CR><LF>-delimited text as well as the <LF>- | text delimited by <LF> specified in an earlier draft version of this | |||
delimited text specified in an earlier version of this specification. | specification. | |||
</t> | ||||
</t> | <t> | |||
<t> | The client <bcp14>SHOULD</bcp14> use SHA-256 in preference to SHA-1 hashing and | |||
AES128-CBC in | ||||
The client SHOULD use SHA-256 in preference to SHA-1 hashing and AES128-CBC in | ||||
preference to triple DES-CBC if they are supported by the CA. Although the | preference to triple DES-CBC if they are supported by the CA. Although the | |||
CMS format allows any form of AES and SHA-2 to be specified, in the interests | CMS format allows any form of AES and SHA-2 to be specified, in the interests | |||
of interoperability the de facto universal standards of AES128-CBC and SHA-256 | of interoperability the de facto universal standards of AES128-CBC and SHA-256 | |||
SHOULD be used. | <bcp14>SHOULD</bcp14> be used. | |||
</t> | ||||
</t> | <t> | |||
<t> | Announcing some of these capabilities individually is redundant, since they're | |||
required as mandatory-to-implement functionality (see <xref target="MTI" format= | ||||
Announcing some of these capabilities individually is redundant since they're | "default"/>) | |||
required as mandatory-to-implement functionality (see <xref target="MTI"/>) | whose presence as a whole is signalled by the "SCEPStandard" capability. However | |||
whose presence as a whole is signalled by the "SCEPStandard" capability, but | , | |||
it may be useful to announce them in order to deal with older implementations | it may be useful to announce them in order to deal with older implementations | |||
that would otherwise default to obsolete, insecure algorithms and mechanisms. | that would otherwise default to obsolete, insecure algorithms and mechanisms. | |||
</t> | </t> | |||
<t> | <t> | |||
If the CA supports none of the above capabilities it SHOULD return an empty | If the CA supports none of the above capabilities, it <bcp14>SHOULD</bcp14> retu | |||
message. A CA MAY simply return an HTTP error. A client that receives an | rn an empty | |||
empty message or an HTTP error SHOULD interpret the response as if none of the | message. A CA <bcp14>MAY</bcp14> simply return an HTTP error. A client that re | |||
ceives an | ||||
empty message or an HTTP error <bcp14>SHOULD</bcp14> interpret the response as i | ||||
f none of the | ||||
capabilities listed are supported by the CA. | capabilities listed are supported by the CA. | |||
</t> | </t> | |||
<t> | <t> | |||
Note that at least one widely-deployed server implementation supports several | Note that at least one widely deployed server implementation supports several | |||
of the above operations but doesn't support the GetCACaps message to indicate | of the above operations but doesn't support the GetCACaps message to indicate | |||
that it supports them, and will close the connection if sent a GetCACaps | that it supports them, and it will close the connection if sent a GetCACaps | |||
message. This means that the equivalent of GetCACaps must be performed | message. This means that the equivalent of GetCACaps must be performed | |||
through server fingerprinting, which can be done using the ID string | through server fingerprinting, which can be done using the ID string | |||
"Microsoft-IIS". Newer versions of the same server, if sent a SCEP request | "Microsoft-IIS". Newer versions of the same server, if sent a SCEP request | |||
using AES and SHA-2, will respond with an invalid response that can't be | using AES and SHA-2, will respond with an invalid response that can't be | |||
decrypted, requiring the use of 3DES and SHA-1 in order to obtain a response | decrypted, requiring the use of 3DES and SHA-1 in order to obtain a response | |||
that can be processed even if AES and/or SHA-2 are allegedly supported. In | that can be processed, even if AES and/or SHA-2 are allegedly supported. In | |||
addition the server will generate CA certificates that only have one, but not | addition, the server will generate CA certificates that only have one, but not | |||
both, of the keyEncipherment and digitalSignature keyUsage flags set, | both, of the keyEncipherment and digitalSignature keyUsage flags set, | |||
requiring that the client ignore the keyUsage flags in order to use the | requiring that the client ignore the keyUsage flags in order to use the | |||
certificates for SCEP. | certificates for SCEP. | |||
</t> | </t> | |||
<t> | <t> | |||
The Content-type of the reply SHOULD be "text/plain". Clients SHOULD ignore | The Content-type of the reply <bcp14>SHOULD</bcp14> be "text/plain". Clients | |||
<bcp14>SHOULD</bcp14> ignore | ||||
the Content-type, as older implementations of SCEP may send various | the Content-type, as older implementations of SCEP may send various | |||
Content-types. | Content-types. | |||
</t> | ||||
</t> | <t>Example:</t> | |||
<figure> | <sourcecode> | |||
<preamble>Example:</preamble> | ||||
<artwork><![CDATA[ | ||||
GET /cgi-bin/pkiclient.exe?operation=GetCACaps HTTP/1.1 | GET /cgi-bin/pkiclient.exe?operation=GetCACaps HTTP/1.1 | |||
</sourcecode> | ||||
]]></artwork> | <t>might return:</t> | |||
</figure> | <sourcecode> | |||
<figure> | ||||
<preamble>might return:</preamble> | ||||
<artwork><![CDATA[ | ||||
AES | AES | |||
GetNextCACert | GetNextCACert | |||
POSTPKIOperation | POSTPKIOperation | |||
SCEPStandard | SCEPStandard | |||
SHA-256 | SHA-256 | |||
</sourcecode> | ||||
<t> | ||||
]]></artwork> | This means that the CA supports modern crypto algorithms, and the GetNextCACert | |||
</figure> | message allows PKIOperation messages (PKCSReq/RenewalReq, GetCert, CertPoll, | |||
<t> | ...) to be sent using HTTP POST and is compliant with the final version of | |||
This means that the CA supports modern crypto algorithms, the GetNextCACert | ||||
message, allows PKIOperation messages (PKCSReq/RenewalReq, GetCert, CertPoll, | ||||
...) to be sent using HTTP POST, and is compliant with the final version of | ||||
the SCEP standard. | the SCEP standard. | |||
</t> | </t> | |||
</section> | ||||
</section> | </section> | |||
</section> | </section> | |||
</section> | <section anchor="SCEP-trans" numbered="true" toc="default"> | |||
<section anchor="SCEP-trans" title="SCEP Transactions"> | <name>SCEP Transactions</name> | |||
<t> | <t> | |||
This section describes the SCEP Transactions and their | This section describes the SCEP Transactions and their | |||
<xref target="HTTP">HTTP</xref> transport mechanism. | <xref target="RFC7230" format="default">HTTP</xref> transport mechanism. | |||
</t> | </t> | |||
<t> | <t> | |||
Note that SCEP doesn't follow best current practices on usage of HTTP. In | Note that SCEP doesn't follow best current practices on usage of HTTP. In | |||
particular it recommends ignoring some Media Types and hardcodes specific URI | particular, it recommends ignoring some media types and hard-codes specific URI | |||
paths. Guidance on the appropriate application of HTTP in these circumstances | paths. Guidance on the appropriate application of HTTP in these circumstances | |||
may be found in <xref target="BCP56bis"/>. | may be found in <xref target="I-D.ietf-httpbis-bcp56bis" format="default"/>. | |||
</t> | </t> | |||
<section anchor="HTTP-GET-POST" title="HTTP POST and GET Message Format | <section anchor="HTTP-GET-POST" numbered="true" toc="default"> | |||
s"> | <name>HTTP POST and GET Message Formats</name> | |||
<t> | <t> | |||
SCEP uses the HTTP "POST" and "GET" HTTP methods <xref target="HTTP"/> to | SCEP uses the HTTP POST and GET methods <xref target="RFC7230" format="default"/ > to | |||
exchange information with the CA. The following defines the ABNF syntax of | exchange information with the CA. The following defines the ABNF syntax of | |||
HTTP POST and GET methods sent from a client to a CA: | HTTP POST and GET methods sent from a client to a CA: | |||
</t> | </t> | |||
<figure> | <sourcecode type="abnf"> | |||
<artwork><![CDATA[ | ||||
POSTREQUEST = "POST" SP SCEPPATH "?operation=" OPERATION | POSTREQUEST = "POST" SP SCEPPATH "?operation=" OPERATION | |||
SP HTTP-version CRLF | SP HTTP-version CRLF | |||
GETREQUEST = "GET" SP SCEPPATH "?operation=" OPERATION | GETREQUEST = "GET" SP SCEPPATH "?operation=" OPERATION | |||
"&message=" MESSAGE SP HTTP-version CRLF | "&message=" MESSAGE SP HTTP-version CRLF | |||
</sourcecode> | ||||
]]></artwork> | ||||
</figure> | ||||
<t> | ||||
where: | ||||
</t> | ||||
<t> | <t> | |||
where: | ||||
<list style="symbols"> | ||||
<t>SCEPPATH is the HTTP URL path for accessing the CA. Clients | ||||
SHOULD set SCEPPATH to the fixed string "/cgi-bin/pkiclient.exe | ||||
" | ||||
unless directed to do otherwise by the CA.</t> | ||||
<t>OPERATION depends on the SCEP transaction and is defined in | ||||
the | ||||
following sections.</t> | ||||
<t>HTTP-version is the HTTP version string, which is "HTTP/1.1" | ||||
for | ||||
<xref target="HTTP"/>.</t> | ||||
<t>SP and CRLF are space and carriage return/linefeed as define | ||||
d in | ||||
<xref target="ABNF"/>.</t> | ||||
</list> | ||||
</t> | </t> | |||
<ul spacing="compact"> | ||||
<li>SCEPPATH is the HTTP URL path for accessing the CA. Clients | ||||
<bcp14>SHOULD</bcp14> set SCEPPATH to the fixed string "/cgi-bi | ||||
n/pkiclient.exe" | ||||
unless directed to do otherwise by the CA.</li> | ||||
<li>OPERATION depends on the SCEP transaction and is defined in the | ||||
following sections.</li> | ||||
<li>HTTP-version is the HTTP version string, which is "HTTP/1.1" for | ||||
<xref target="RFC7230" format="default"/>.</li> | ||||
<li>SP and CRLF are space and carriage return/linefeed, as defined in | ||||
<xref target="RFC5234" format="default"/>.</li> | ||||
</ul> | ||||
<t> | <t> | |||
The CA will typically ignore SCEPPATH since it's unlikely to be issuing | The CA will typically ignore SCEPPATH, since it's unlikely to be issuing | |||
certificates via a web server. Clients SHOULD set SCEPPATH to the fixed | certificates via a web server. Clients <bcp14>SHOULD</bcp14> set SCEPPATH to th | |||
e fixed | ||||
string "/cgi-bin/pkiclient.exe" unless directed to do otherwise by the CA. | string "/cgi-bin/pkiclient.exe" unless directed to do otherwise by the CA. | |||
The CA SHOULD ignore the SCEPPATH unless its precise format is critical to the | The CA <bcp14>SHOULD</bcp14> ignore the SCEPPATH unless its precise format is cr itical to the | |||
CA's operation. | CA's operation. | |||
</t> | </t> | |||
<t> | <t> | |||
Early SCEP drafts performed all communications via GET messages, including | ||||
Early SCEP drafts performed all communications via "GET" messages, including | non-idempotent ones that should have been sent via POST messages; see | |||
non-idempotent ones that should have been sent via "POST" messages, see | <xref target="I-D.ietf-httpbis-bcp56bis" format="default"/> for details. This h | |||
<xref target="BCP56bis"/> for details. This has caused problems because of | as caused problems because of | |||
the way that the (supposedly) idempotent GET interacts with caches and | the way that the (supposedly) idempotent GET interacts with caches and | |||
proxies, and because the extremely large GET requests created by encoding CMS | proxies, and because the extremely large GET requests created by encoding CMS | |||
messages may be truncated in transit. These issues are typically not visible | messages may be truncated in transit. These issues are typically not visible | |||
when testing on a LAN, but crop up during deployment over WANs. If the remote | when testing on a LAN, but crop up during deployment over WANs. If the remote | |||
CA supports POST, the CMS-encoded SCEP messages MUST be sent via HTTP POST | CA supports POST, the CMS-encoded SCEP messages <bcp14>MUST</bcp14> be sent via HTTP POST | |||
instead of HTTP GET. This applies to any SCEP message except GetCACert, | instead of HTTP GET. This applies to any SCEP message except GetCACert, | |||
GetNextCACert, and GetCACaps, and avoids the need for base64- and URL-encoding | GetNextCACert, and GetCACaps and avoids the need for base64 and URL encoding | |||
that's required for GET messaging. The client can verify that the CA supports | that's required for GET messaging. The client can verify that the CA supports | |||
SCEP messages via POST by looking for the "SCEPStandard" or "POSTPKIOperation" | SCEP messages via POST by looking for the "SCEPStandard" or "POSTPKIOperation" | |||
capability (See <xref target="CA-caps-resp"/>). | capability (see <xref target="CA-caps-resp" format="default"/>). | |||
</t> | </t> | |||
<t> | <t> | |||
If a client or CA uses HTTP GET and encounters HTTP-related problems such as | If a client or CA uses HTTP GET and encounters HTTP-related problems such as | |||
messages being truncated, seeing errors such as HTTP 414 ("Request URI too | messages being truncated, seeing errors such as HTTP 414 ("Request-URI too | |||
long"), or simply having the message not sent/received at all, when standard | long"), or simply having the message not sent/received at all when standard | |||
requests to the server (for example via a web browser) work, then this is a | requests to the server (for example, via a web browser) work, then this is a | |||
symptom of the problematic use of HTTP GET. The solution to this problem is | symptom of the problematic use of HTTP GET. The solution to this problem is | |||
to update the implementation to use HTTP POST instead. In addition when using | to update the implementation to use HTTP POST instead. In addition, when using | |||
GET it's recommended to test the implementation from as many different network | GET, it's recommended to test the implementation from as many different network | |||
locations as possible to determine whether the use of GET will cause problems | locations as possible to determine whether the use of GET will cause problems | |||
with communications. | with communications. | |||
</t> | </t> | |||
<t> | <t> | |||
When using GET messages to communicate binary data, base64 encoding as | When using GET messages to communicate binary data, base64 encoding as | |||
specified in <xref target="Base64"/> Section 4 MUST be used. The base64 | specified in <xref target="RFC4648" sectionFormat="of" section="4"/> | |||
encoded data is distinct from "base64url" and may contain URI reserved | <bcp14>MUST</bcp14> be used. The base64-encoded data is distinct from | |||
characters, thus it MUST be escaped as specified in <xref target="URI"/> in | "base64url" and may contain URI reserved | |||
addition to being base64 encoded. Finally, the encoded data is inserted into | characters; thus, it <bcp14>MUST</bcp14> be escaped as specified in <xref | |||
target="RFC3986" format="default"/> in addition to being base64 encoded. | ||||
Finally, the encoded data is inserted into | ||||
the MESSAGE portion of the HTTP GET request. | the MESSAGE portion of the HTTP GET request. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="GetCACert" title="Get CA Certificate"> | <section anchor="GetCACert" numbered="true" toc="default"> | |||
<t> | <name>Get CA Certificate</name> | |||
<t> | ||||
To get the CA certificate(s), the client sends a GetCACert message to the CA. | To get the CA certificate(s), the client sends a GetCACert message to the CA. | |||
The OPERATION MUST be set to "GetCACert". There is no request data associated | The OPERATION <bcp14>MUST</bcp14> be set to "GetCACert". There is no request da ta associated | |||
with this message. | with this message. | |||
</t> | </t> | |||
<section anchor="GetCACert-resp" title="Get CA Certificate Respon | <section anchor="GetCACert-resp" numbered="true" toc="default"> | |||
se Message Format"> | <name>Get CA Certificate Response Message Format</name> | |||
<t> | <t> | |||
The response for GetCACert is different between the case where the CA directly | The response for GetCACert is different between the case where the CA directly | |||
communicates with the client during the enrolment and the case where an | communicates with the client during the enrolment and the case where an | |||
intermediate CA exists and the client communicates with this CA during the | intermediate CA exists and the client communicates with this CA during the | |||
enrolment. | enrolment. | |||
</t> | </t> | |||
<section anchor="GetCACert-resp-format" title="CA Certificate R | <section anchor="GetCACert-resp-format" numbered="true" toc="default"> | |||
esponse Message Format"> | <name>CA Certificate Response Message Format</name> | |||
<t> | <t> | |||
If the CA does not have any intermediate CA certificates, the response | If the CA does not have any intermediate CA certificates, the response | |||
consists of a single X.509 CA certificate. The response will have a | consists of a single X.509 CA certificate. The response will have a | |||
Content-Type of "application/x-x509-ca-cert". | Content-Type of "application/x-x509-ca-cert". | |||
</t> | </t> | |||
<figure> | <sourcecode> | |||
<artwork><![CDATA[ | ||||
"Content-Type: application/x-x509-ca-cert" | "Content-Type: application/x-x509-ca-cert" | |||
<binary X.509> | <binary X.509> | |||
</sourcecode> | ||||
]]></artwork> | </section> | |||
</figure> | <section anchor="GetCACertChain-resp-format" numbered="true" toc="defa | |||
</section> | ult"> | |||
<section anchor="GetCACertChain-resp-format" title="CA Certific | <name>CA Certificate Chain Response Message Format</name> | |||
ate Chain Response Message Format"> | <t> | |||
<t> | ||||
If the CA has intermediate CA certificates, the response consists of a | If the CA has intermediate CA certificates, the response consists of a | |||
degenerate certificates-only CMS Signed-Data message (<xref | degenerate certificates-only CMS SignedData message (<xref target="certs-only" f | |||
target="certs-only"/>) containing the certificates, with the intermediate CA | ormat="default"/>) containing the certificates, with the intermediate CA | |||
certificate(s) as the leaf certificate(s). The response will have a | certificate(s) as the leaf certificate(s). The response will have a | |||
Content-Type of "application/x-x509-ca-ra-cert". Note that this designation | Content-Type of "application/x-x509-ca-ra-cert". Note that this designation | |||
is used for historical reasons due to its use in older versions of this | is used for historical reasons due to its use in older versions of this | |||
specification, no special meaning should be attached to the label. | specification -- no special meaning should be attached to the label. | |||
</t> | ||||
</t> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
<sourcecode> | ||||
"Content-Type: application/x-x509-ca-ra-cert" | "Content-Type: application/x-x509-ca-ra-cert" | |||
<binary CMS> | <binary CMS> | |||
</sourcecode> | ||||
]]></artwork> | </section> | |||
</figure> | </section> | |||
</section> | </section> | |||
</section> | <section anchor="cert-enrolment" numbered="true" toc="default"> | |||
</section> | <name>Certificate Enrolment/Renewal</name> | |||
<section anchor="cert-enrolment" title="Certificate Enrolment/Renewal"> | <t> | |||
<t> | A PKCSReq/RenewalReq (<xref target="PKCSReq" format="default"/>) message is used | |||
to perform a | ||||
A PKCSReq/RenewalReq (<xref target="PKCSReq"/>) message is used to perform a | certificate enrolment or renewal transaction. The OPERATION <bcp14>MUST</bcp14> | |||
certificate enrolment or renewal transaction. The OPERATION MUST be set to | be set to | |||
"PKIOperation". Note that when used with HTTP POST, the only OPERATION | "PKIOperation". Note that when used with HTTP POST, the only OPERATION | |||
possible is "PKIOperation", so many CAs don't check this value or even notice | possible is "PKIOperation", so many CAs don't check this value or even notice | |||
its absence. When implemented using HTTP POST the message is sent with a | its absence. When implemented using HTTP POST, the message is sent with a | |||
Content-Type of "application/x-pki-message" and might look as follows: | Content-Type of "application/x-pki-message" and might look as follows: | |||
</t> | ||||
</t> | <sourcecode> | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
POST /cgi-bin/pkiclient.exe?operation=PKIOperation HTTP/1.1 | POST /cgi-bin/pkiclient.exe?operation=PKIOperation HTTP/1.1 | |||
Content-Length: <length of data> | Content-Length: <length of data> | |||
Content-Type: application/x-pki-message | Content-Type: application/x-pki-message | |||
<binary CMS data> | <binary CMS data> | |||
</sourcecode> | ||||
]]></artwork> | <t> | |||
</figure> | When implemented using HTTP GET, this might look as follows: | |||
<t> | </t> | |||
When implemented using HTTP GET this might look as follows: | ||||
</t> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
GET /cgi-bin/pkiclient.exe?operation=PKIOperation& \ | <sourcecode> | |||
GET /cgi-bin/pkiclient.exe?operation=PKIOperation& \ | ||||
message=MIAGCSqGSIb3DQEHA6CAMIACAQAxgDCBzAIBADB2MG \ | message=MIAGCSqGSIb3DQEHA6CAMIACAQAxgDCBzAIBADB2MG \ | |||
IxETAPBgNVBAcTCE......AAAAAA== HTTP/1.1 | IxETAPBgNVBAcTCE......AAAAAA== HTTP/1.1 | |||
</sourcecode> | ||||
]]></artwork> | <section anchor="cert-enrolment-resp" numbered="true" toc="default"> | |||
</figure> | <name>Certificate Enrolment/Renewal Response Message</name> | |||
<section anchor="cert-enrolment-resp" title="Certificate Enrolmen | <t> | |||
t/Renewal Response Message"> | ||||
<t> | ||||
If the request is granted, a CertRep SUCCESS message | If the request is granted, a CertRep SUCCESS message | |||
(<xref target="CertRep-success"/>) is returned. If the request is rejected, a | (<xref target="CertRep-success" format="default"/>) is returned. If the request | |||
CertRep FAILURE message (<xref target="CertRep-failure"/>) is returned. If | is rejected, a | |||
CertRep FAILURE message (<xref target="CertRep-failure" format="default"/>) is r | ||||
eturned. If | ||||
the CA is configured to manually authenticate the client, a CertRep PENDING | the CA is configured to manually authenticate the client, a CertRep PENDING | |||
message (<xref target="CertRep-pending"/>) MAY be returned. The CA MAY return | message (<xref target="CertRep-pending" format="default"/>) <bcp14>MAY</bcp14> b e returned. The CA <bcp14>MAY</bcp14> return | |||
a PENDING for other reasons. | a PENDING for other reasons. | |||
</t> | </t> | |||
<t> | <t> | |||
The response will have a Content-Type of "application/x-pki-message". | The response will have a Content-Type of "application/x-pki-message". | |||
</t> | ||||
</t> | <sourcecode> | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
"Content-Type: application/x-pki-message" | "Content-Type: application/x-pki-message" | |||
<binary CertRep message> | <binary CertRep message> | |||
</sourcecode> | ||||
]]></artwork> | </section> | |||
</figure> | </section> | |||
</section> | <section anchor="poll-resp" numbered="true" toc="default"> | |||
</section> | <name>Poll for Client Initial Certificate</name> | |||
<section anchor="poll-resp" title="Poll for Client Initial Certificate" | <t> | |||
> | ||||
<t> | ||||
When the client receives a CertRep message with pkiStatus set to PENDING, it | When the client receives a CertRep message with pkiStatus set to PENDING, it | |||
will enter the polling state by periodically sending CertPoll messages to the | will enter the polling state by periodically sending CertPoll messages to the | |||
CA until either the request is granted and the certificate is sent back or the | CA until either the request is granted and the certificate is sent back or the | |||
request is rejected or some preconfigured time limit for polling or maximum | request is rejected or some preconfigured time limit for polling or maximum | |||
number of polls is exceeded. The OPERATION MUST be set to "PKIOperation". | number of polls is exceeded. The OPERATION <bcp14>MUST</bcp14> be set to "PKIOp eration". | |||
</t> | </t> | |||
<t> | <t> | |||
CertPoll messages exchanged during the polling period MUST carry the same | CertPoll messages exchanged during the polling period <bcp14>MUST</bcp14> carry the same | |||
transactionID attribute as the previous PKCSReq/RenewalReq. A CA receiving a | transactionID attribute as the previous PKCSReq/RenewalReq. A CA receiving a | |||
CertPoll for which it does not have a matching PKCSReq/RenewalReq MUST reject | CertPoll for which it does not have a matching PKCSReq/RenewalReq <bcp14>MUST</b cp14> reject | |||
this request. | this request. | |||
</t> | </t> | |||
<t> | <t> | |||
Since at this time the certificate has not been issued, the client can only | Since at this time the certificate has not been issued, the client can only | |||
use its own subject name (which was contained in the original PKCS# 10 sent | use its own subject name (which was contained in the original PKCS# 10 sent | |||
via PKCSReq/RenewalReq) to identify the polled certificate request (but see | via PKCSReq/RenewalReq) to identify the polled certificate request (but see | |||
the note on identification during polling in <xref target="CertPoll"/>). In | the note on identification during polling in <xref target="CertPoll" | |||
theory there can be multiple outstanding requests from one client (for | format="default"/>). In | |||
example, if different keys and different key-usages were used to request | theory, there can be multiple outstanding requests from one client (for | |||
example, if different keys and different key usages were used to request | ||||
multiple certificates), so the transactionID must also be included to | multiple certificates), so the transactionID must also be included to | |||
disambiguate between multiple requests. In practice however the client SHOULD | disambiguate between multiple requests. In practice, however, the client <bcp14 | |||
NOT have multiple requests outstanding at any one time, since this tends to | >SHOULD | |||
NOT</bcp14> have multiple requests outstanding at any one time, since this tends | ||||
to | ||||
confuse some CAs. | confuse some CAs. | |||
</t> | </t> | |||
<section anchor="poll-resp-format" title="Polling Response Messag | <section anchor="poll-resp-format" numbered="true" toc="default"> | |||
e Format"> | <name>Polling Response Message Format</name> | |||
<t> | <t> | |||
The response messages for CertPoll are the same as in <xref | The response messages for CertPoll are the same as in <xref target="cert-enrolme | |||
target="cert-enrolment-resp"/>. | nt-resp" format="default"/>. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="cert-access" title="Certificate Access"> | <section anchor="cert-access" numbered="true" toc="default"> | |||
<t> | <name>Certificate Access</name> | |||
<t> | ||||
A client can query an issued certificate from the SCEP CA, as long as the | A client can query an issued certificate from the SCEP CA, as long as the | |||
client knows the issuer name and the issuer assigned certificate serial | client knows the issuer name and the issuer-assigned certificate serial | |||
number. | number. | |||
</t> | </t> | |||
<t> | <t> | |||
This transaction consists of one GetCert (<xref target="GetCertCRL"/>) message | This transaction consists of one GetCert (<xref target="GetCertCRL" format="defa | |||
sent to the CA by a client, and one CertRep (<xref target="CertRep"/>) message | ult"/>) message | |||
sent back from the CA. The OPERATION MUST be set to "PKIOperation". | sent to the CA by a client and one CertRep (<xref target="CertRep" format="defau | |||
lt"/>) message | ||||
sent back from the CA. The OPERATION <bcp14>MUST</bcp14> be set to "PKIOperatio | ||||
n". | ||||
</t> | </t> | |||
<section anchor="cert-access-resp" title="Certificate Access Resp | <section anchor="cert-access-resp" numbered="true" toc="default"> | |||
onse Message Format"> | <name>Certificate Access Response Message Format</name> | |||
<t> | <t> | |||
In this case, the CertRep from the CA is same as in <xref | In this case, the CertRep from the CA is same as in <xref target="cert-enrolment | |||
target="cert-enrolment-resp"/>, except that the CA will either grant the | -resp" format="default"/>, except that the CA will either grant the | |||
request (SUCCESS) or reject it (FAILURE). | request (SUCCESS) or reject it (FAILURE). | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="CRL-access" title="CRL Access"> | <section anchor="CRL-access" numbered="true" toc="default"> | |||
<t> | <name>CRL Access</name> | |||
<t> | ||||
Clients can request a CRL from the SCEP CA as described in <xref | Clients can request a CRL from the SCEP CA, as described in <xref | |||
target="overview-CRL-access"/>. The OPERATION MUST be set to "PKIOperation". | target="overview-CRL-access" format="default"/>. The OPERATION | |||
<bcp14>MUST</bcp14> be set to "PKIOperation". | ||||
</t> | </t> | |||
<section anchor="CRL-access-resp" title="CRL Access Response Mess | <section anchor="CRL-access-resp" numbered="true" toc="default"> | |||
age Format"> | <name>CRL Access Response Message Format</name> | |||
<t> | <t> | |||
The CRL is sent back to the client in a CertRep (<xref target="CertRep"/>) | The CRL is sent back to the client in a CertRep (<xref target="CertRep" format=" default"/>) | |||
message. The information portion of this message is a degenerate | message. The information portion of this message is a degenerate | |||
certificates-only Signed-Data (<xref target="certs-only"/>) that contains only | certificates-only SignedData (<xref target="certs-only" | |||
the most recent CRL in the crls field of the Signed-Data. | format="default"/>) that contains only | |||
the most recent CRL in the crls field of the SignedData. | ||||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="get-next-CA" title="Get Next Certificate Authority Cer | <section anchor="get-next-CA" numbered="true" toc="default"> | |||
tificate"> | <name>Get Next Certificate Authority Certificate</name> | |||
<t> | <t> | |||
When a CA certificate is about to expire, clients need to retrieve the CA's | When a CA certificate is about to expire, clients need to retrieve the CA's | |||
next CA certificate (i.e. the rollover certificate). This is done via the | next CA certificate (i.e., the rollover certificate). This is done via the | |||
GetNextCACert message. The OPERATION MUST be set to "GetNextCACert". There | GetNextCACert message. The OPERATION <bcp14>MUST</bcp14> be set to "GetNextCACe | |||
rt". There | ||||
is no request data associated with this message. | is no request data associated with this message. | |||
</t> | </t> | |||
<section anchor="get-next-CA-format" title="Get Next CA Response | <section anchor="get-next-CA-format" numbered="true" toc="default"> | |||
Message Format"> | <name>Get Next CA Response Message Format</name> | |||
<t> | <t> | |||
The response consists of a Signed-Data CMS message, signed by the current CA | The response consists of a SignedData CMS message, signed by the current CA | |||
signing key. Clients MUST validate the signature on the message before | signing key. Clients <bcp14>MUST</bcp14> validate the signature on the message | |||
before | ||||
trusting any of its contents. The response will have a Content-Type of | trusting any of its contents. The response will have a Content-Type of | |||
"application/x-x509-next-ca-cert". | "application/x-x509-next-ca-cert". | |||
</t> | ||||
</t> | <sourcecode> | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
"Content-Type: application/x-x509-next-ca-cert" | "Content-Type: application/x-x509-next-ca-cert" | |||
<binary CMS> | <binary CMS> | |||
</sourcecode> | ||||
]]></artwork> | <t> | |||
</figure> | ||||
<t> | ||||
The content of the Signed-Data message is a degenerate certificates-only | The content of the SignedData message is a degenerate certificates-only | |||
Signed-Data message (<xref target="certs-only"/>) containing the new CA | SignedData message (<xref target="certs-only" format="default"/>) containing the | |||
new CA | ||||
certificate(s) to be used when the current CA certificate expires. | certificate(s) to be used when the current CA certificate expires. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- ====================================================================== | ||||
--> | ||||
<section anchor="state-trans" title="SCEP Transaction Examples"> | ||||
<t> | ||||
The following section gives several examples of client to CA transactions. | <section anchor="state-trans" numbered="true" toc="default"> | |||
Client actions are indicated in the left column, CA actions are indicated in | <name>SCEP Transaction Examples</name> | |||
the right column, and the transactionID is given in parentheses (for ease of | <t> | |||
reading small integer values have been used, in practice full transaction IDs | ||||
would be used). The first transaction, for example, would read like this: | ||||
</t> | The following section gives several examples of client-to-CA transactions. | |||
<t> | Client actions are indicated in the left column, CA actions are indicated in | |||
the right column, and the transactionID is given in parentheses. For ease of | ||||
reading, small integer values have been used; in practice, full transaction IDs | ||||
would be used. The first transaction, for example, would read like this: | ||||
"Client Sends PKCSReq message with transactionID 1 to the CA. The CA signs | </t> | |||
<blockquote> | ||||
Client Sends PKCSReq message with transactionID 1 to the CA. The CA signs | ||||
the certificate and constructs a CertRep Message containing the signed | the certificate and constructs a CertRep Message containing the signed | |||
certificate with a transaction ID 1. The client receives the message and | certificate with a transaction ID 1. The client receives the message and | |||
installs the certificate locally". | installs the certificate locally. | |||
</blockquote> | ||||
</t> | <section numbered="true" toc="default"> | |||
<section title="Successful Transactions"> | <name>Successful Transactions</name> | |||
<figure> | ||||
<figure> | <name>Successful Enrolment Case: Automatic Processing</name> | |||
<preamble>Successful Enrolment Case: Automatic processing</prea | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
mble> | ||||
<artwork><![CDATA[ | ||||
PKCSReq (1) ----------> CA issues certificate | PKCSReq (1) ----------> CA issues certificate | |||
<---------- CertRep (1) SUCCESS | <---------- CertRep (1) SUCCESS | |||
Client installs certificate | Client installs certificate | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<figure> | ||||
<preamble>Successful Enrolment Case: Manual authentication | ||||
required</preamble> | ||||
<artwork><![CDATA[ | ||||
<figure> | ||||
<name>Successful Enrolment Case: Manual Authentication Required</name> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
PKCSReq (2) ----------> Cert request goes into queue | PKCSReq (2) ----------> Cert request goes into queue | |||
<---------- CertRep (2) PENDING | <---------- CertRep (2) PENDING | |||
CertPoll (2) ----------> Still pending | CertPoll (2) ----------> Still pending | |||
<---------- CertRep (2) PENDING | <---------- CertRep (2) PENDING | |||
CertPoll (2) ----------> CA issues certificate | CertPoll (2) ----------> CA issues certificate | |||
<---------- CertRep (2) SUCCESS | <---------- CertRep (2) SUCCESS | |||
Client installs certificate | Client installs certificate | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<figure> | ||||
<preamble>CA certificate rollover case:</preamble> | ||||
<artwork><![CDATA[ | ||||
<figure> | ||||
<name>CA Certificate Rollover Case</name> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
GetNextCACert ----------> | GetNextCACert ----------> | |||
<---------- New CA certificate | <---------- New CA certificate | |||
PKCSReq* ----------> CA issues certificate with | PKCSReq* ----------> CA issues certificate with | |||
new key | new key | |||
<---------- CertRep SUCCESS | <---------- CertRep SUCCESS | |||
Client stores certificate | Client stores certificate | |||
for installation when | for installation when | |||
existing certificate expires. | existing certificate expires. | |||
]]></artwork> | ]]></artwork> | |||
<postamble>* Enveloped for the new CA certificate. The CA will | </figure> | |||
use | ||||
the envelope to determine which key to | ||||
use to issue the | ||||
client certificate.</postamble> | ||||
</figure> | ||||
</section> | <t>* Enveloped for the new CA certificate. The CA will use | |||
<section title="Transactions with Errors"> | the envelope to determine which key to | |||
<t> | use to issue the | |||
client certificate.</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Transactions with Errors</name> | ||||
<t> | ||||
In the case of polled transactions that aren't completed automatically, there | In the case of polled transactions that aren't completed automatically, there | |||
are two potential options for dealing with a transaction that's interrupted | are two potential options for dealing with a transaction that's interrupted | |||
due to network or software/hardware issues. The first is for the client to | due to network or software/hardware issues. The first is for the client to | |||
preserve its transaction state and resume the CertPoll polling when normal | preserve its transaction state and resume the CertPoll polling when normal | |||
service is restored. The second is for the client to begin a new transaction | service is restored. The second is for the client to begin a new transaction | |||
by sending a new PKCSReq/RenewalReq rather than continuing the previous | by sending a new PKCSReq/RenewalReq, rather than continuing the previous | |||
CertPoll. Both options have their own advantages and disadvantages. | CertPoll. Both options have their own advantages and disadvantages. | |||
</t> | </t> | |||
<t> | <t> | |||
The CertPoll continuation requires that the client maintain its transaction | The CertPoll continuation requires that the client maintain its transaction | |||
state for the time when it resumes polling. This is relatively simple if the | state for the time when it resumes polling. This is relatively simple if the | |||
problem is a brief network outage, but less simple when the problem is a | problem is a brief network outage, but less simple when the problem is a | |||
client crash and restart. In addition the CA may treat a lost network | client crash and restart. In addition, the CA may treat a lost network | |||
connection as the end of a transaction, so that a new connection followed by a | connection as the end of a transaction, so that a new connection followed by a | |||
CertPoll will be treated as an error. | CertPoll will be treated as an error. | |||
</t> | </t> | |||
<t> | <t> | |||
The PKCSReq/RenewalReq continuation doesn't require any state to be maintained | The PKCSReq/RenewalReq continuation doesn't require any state to be maintained, | |||
since it's a new transaction, however it may cause problems on the CA side if | since it's a new transaction. However, it may cause problems on the CA side if | |||
the certificate was successfully issued but the client never received it, | the certificate was successfully issued but the client never received it, | |||
since the resumed transaction attempt will appear to be a request for a | since the resumed transaction attempt will appear to be a request for a | |||
duplicate certificate (see <xref target="security-no-conf"/> for more on why | duplicate certificate (see <xref target="security-no-conf" format="default"/> fo | |||
this is a problem). In this case the CA may refuse the transaction, or | r more on why | |||
this is a problem). In this case, the CA may refuse the transaction or | ||||
require manual intervention to remove/revoke the previous certificate before | require manual intervention to remove/revoke the previous certificate before | |||
the client can request another one. | the client can request another one. | |||
</t> | </t> | |||
<t> | <t> | |||
Since the new-transaction resume is more robust in the presence of errors and | Since the new-transaction resume is more robust in the presence of errors and | |||
doesn't require special-case handling by either the client or CA, clients | doesn't require special-case handling by either the client or CA, clients | |||
SHOULD use the new-transaction option in preference to the resumed-CertPoll | <bcp14>SHOULD</bcp14> use the new-transaction option in preference to the resume d-CertPoll | |||
option to recover from errors. | option to recover from errors. | |||
</t> | </t> | |||
<t>Resync Case 1: Client resyncs via new PKCSReq | ||||
<figure> | (recommended):</t> | |||
<preamble>Resync Case 1: Client resyncs via new PKCSReq | <figure> | |||
(recommended):</preamble> | <name>Resync Case 1</name> | |||
<artwork><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
PKCSReq (3) ----------> Cert request goes into queue | PKCSReq (3) ----------> Cert request goes into queue | |||
<---------- CertRep (3) PENDING | <---------- CertRep (3) PENDING | |||
CertPoll (3) ----------> Still pending | CertPoll (3) ----------> Still pending | |||
X-------- CertRep(3) PENDING | X-------- CertRep(3) PENDING | |||
(Network outage) | (Network outage) | |||
(Client reconnects) | (Client reconnects) | |||
PKCSReq (4) ----------> | PKCSReq (4) ----------> | |||
<---------- CertRep (4) PENDING | <---------- CertRep (4) PENDING | |||
etc... | etc... | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<figure> | ||||
<preamble>Resync Case 2: Client resyncs via resumed CertPoll af | ||||
ter a | ||||
network outage (not recommended, use PKCS | ||||
Req to | ||||
resync):</preamble> | ||||
<artwork><![CDATA[ | ||||
<t>Resync Case 2: Client resyncs via resumed CertPoll after a | ||||
network outage (not recommended; use PKCS | ||||
Req to | ||||
resync):</t> | ||||
<figure> | ||||
<name>Resync Case 2</name> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
PKCSReq (5) ----------> Cert request goes into queue | PKCSReq (5) ----------> Cert request goes into queue | |||
<---------- CertRep (5) PENDING | <---------- CertRep (5) PENDING | |||
CertPoll (5) ----------> Still pending | CertPoll (5) ----------> Still pending | |||
X-------- CertRep(5) PENDING | X-------- CertRep(5) PENDING | |||
(Network outage) | (Network outage) | |||
(Client reconnects) | (Client reconnects) | |||
CertPoll (5) ----------> CA issues certificate | CertPoll (5) ----------> CA issues certificate | |||
<---------- CertRep (5) SUCCESS | <---------- CertRep (5) SUCCESS | |||
Client installs certificate | Client installs certificate | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<figure> | <t>Resync Case 3: Special-case variation of Case 2 where the | |||
<preamble>Resync Case 3: Special-case variation of case 2 where | ||||
the | ||||
CertRep SUCCESS rather than the CertRep P ENDING is | CertRep SUCCESS rather than the CertRep P ENDING is | |||
lost (recommended):</preamble> | lost (recommended):</t> | |||
<artwork><![CDATA[ | <figure> | |||
<name>Resync Case 3</name> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
PKCSReq (6) ----------> Cert request goes into queue | PKCSReq (6) ----------> Cert request goes into queue | |||
<---------- CertRep (6) PENDING | <---------- CertRep (6) PENDING | |||
CertPoll (6) ----------> Still pending | CertPoll (6) ----------> Still pending | |||
<---------- CertRep (6) PENDING | <---------- CertRep (6) PENDING | |||
CertPoll (6) ----------> CA issues certificate | CertPoll (6) ----------> CA issues certificate | |||
X-------- CertRep(6) SUCCESS | X-------- CertRep(6) SUCCESS | |||
(Network outage) | (Network outage) | |||
(Client reconnects) | (Client reconnects) | |||
PKCSReq (7) ----------> There is already a valid | PKCSReq (7) ----------> There is already a valid | |||
certificate with this DN. | certificate with this | |||
Distinguished Name (DN). | ||||
<---------- CertRep (7) FAILURE | <---------- CertRep (7) FAILURE | |||
Admin revokes certificate | Admin revokes certificate | |||
PKCSReq (8) ----------> CA issues new certificate | PKCSReq (8) ----------> CA issues new certificate | |||
<---------- CertRep (8) SUCCESS | <---------- CertRep (8) SUCCESS | |||
Client installs certificate | Client installs certificate | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<figure> | <t>Resync Case 4: Special-case variation of Case 1 where the | |||
<preamble>Resync Case 4: Special-case variation of case 1 where | ||||
the | ||||
CertRep SUCCESS rather than the CertRep P ENDING is lost | CertRep SUCCESS rather than the CertRep P ENDING is lost | |||
(not recommended, use PKCSReq to resync): | (not recommended; use PKCSReq to resync): | |||
</preamble> | </t> | |||
<artwork><![CDATA[ | <figure> | |||
<name>Resync Case 4</name> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
PKCSReq (9) ----------> Cert request goes into queue | PKCSReq (9) ----------> Cert request goes into queue | |||
<---------- CertRep (9) PENDING | <---------- CertRep (9) PENDING | |||
CertPoll (9) ----------> Still pending | CertPoll (9) ----------> Still pending | |||
<---------- CertRep (9) PENDING | <---------- CertRep (9) PENDING | |||
CertPoll (9) ----------> CA issues certificate | CertPoll (9) ----------> CA issues certificate | |||
X-------- CertRep(9) SIGNED CERT | X-------- CertRep(9) SIGNED CERT | |||
(Network outage) | (Network outage) | |||
(Client reconnects) | (Client reconnects) | |||
CertPoll (9) ----------> Certificate already issued | CertPoll (9) ----------> Certificate already issued | |||
<---------- CertRep (9) SUCCESS | <---------- CertRep (9) SUCCESS | |||
skipping to change at line 1968 ¶ | skipping to change at line 1960 ¶ | |||
<---------- CertRep (9) PENDING | <---------- CertRep (9) PENDING | |||
CertPoll (9) ----------> Still pending | CertPoll (9) ----------> Still pending | |||
<---------- CertRep (9) PENDING | <---------- CertRep (9) PENDING | |||
CertPoll (9) ----------> CA issues certificate | CertPoll (9) ----------> CA issues certificate | |||
X-------- CertRep(9) SIGNED CERT | X-------- CertRep(9) SIGNED CERT | |||
(Network outage) | (Network outage) | |||
(Client reconnects) | (Client reconnects) | |||
CertPoll (9) ----------> Certificate already issued | CertPoll (9) ----------> Certificate already issued | |||
<---------- CertRep (9) SUCCESS | <---------- CertRep (9) SUCCESS | |||
Client installs certificate | Client installs certificate | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t> | ||||
<t> | ||||
As these examples indicate, resumption from an error via a resumed CertPoll is | As these examples indicate, resumption from an error via a resumed CertPoll is | |||
tricky due to the state that needs to be held by both the client and/or the | tricky due to the state that needs to be held by both the client and/or the | |||
CA. A PKCSReq/RenewalReq resume is the easiest to implement since it's | CA. A PKCSReq/RenewalReq resume is the easiest to implement, since it's | |||
stateless and is identical for both polled and non-polled transactions, while | stateless and is identical for both polled and nonpolled transactions, whereas | |||
a CertPoll resume treats the two differently (a non-polled transaction is | a CertPoll resume treats the two differently. (A nonpolled transaction is | |||
resumed with a PKCSReq/RenewalReq, a polled transaction is resumed with a | resumed with a PKCSReq/RenewalReq; a polled transaction is resumed with a | |||
CertPoll). For this reason error recovery SHOULD be handled via a new PKCSReq | CertPoll.) For this reason, error recovery <bcp14>SHOULD</bcp14> be handled via | |||
a new PKCSReq | ||||
rather than a resumed CertPoll. | rather than a resumed CertPoll. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<!-- ====================================================================== | ||||
--> | ||||
<section anchor="ack" title="Contributors/Acknowledgements"> | ||||
<t> | ||||
The editor would like to thank all of the previous editors, authors and | ||||
contributors: Cheryl Madson, Xiaoyi Liu, David McGrew, David Cooper, Andy | ||||
Nourse, Max Pritikin, Jan Vilhuber, and others for their work maintaining the | ||||
draft over the years. The IETF reviewers provided much useful feedback that | ||||
helped improve the draft, and in particular spotted a number of things that | ||||
were present in SCEP through established practice rather than by being | ||||
explicitly described in the text. Numerous other people have contributed | ||||
during the long life cycle of the draft and all deserve thanks. In addition | ||||
several PKCS #7 / CMS libraries contributed to interoperability by doing the | ||||
right thing despite what earlier SCEP drafts required. | ||||
</t> | ||||
<t> | ||||
The earlier authors would like to thank Peter William of ValiCert, Inc. | ||||
(formerly of VeriSign, Inc.) and Alex Deacon of VeriSign, Inc. and Christopher | ||||
Welles of IRE, Inc. for their contributions to early versions of this protocol | ||||
and this document. | ||||
</t> | ||||
</section> | ||||
<!-- ====================================================================== | ||||
--> | ||||
<section anchor="iana" title="IANA Considerations"> | ||||
<t> | ||||
One object identifier for an arc to assign SCEP Attribute Identifiers was | ||||
assigned in the SMI Security for PKIX (1.3.6.1.5.5.7) registry, Simple | ||||
Certificate Enrollment Protocol Attributes denoted as id-scep: | ||||
</t> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
id-scep OBJECT IDENTIFIER ::= { id-pkix TBD1 } | ||||
]]></artwork> | ||||
</figure> | ||||
<t> | ||||
(Editor's note: When the OID is assigned, the values in the OID table in <xref | <section anchor="iana" numbered="true" toc="default"> | |||
target="pkiMessage"/> will also need to be updated). | <name>IANA Considerations</name> | |||
<t> | ||||
A object identifier for an arc to assign SCEP Attribute Identifiers has been | ||||
assigned in the "SMI Security for PKIX" registry (1.3.6.1.5.5.7). This object | ||||
identifer, Simple Certificate Enrollment Protocol Attributes, is denoted as | ||||
id-scep: | ||||
</t> | ||||
</t> | <sourcecode> | |||
<t> | id-scep OBJECT IDENTIFIER ::= { id-pkix 24 } | |||
</sourcecode> | ||||
This assignment created the new SMI Security for SCEP Attribute Identifiers | <t> | |||
((1.3.6.1.5.5.7.TBD1) registry with the following entries with references to | IANA created the "SMI Security for SCEP Attribute Identifiers" registry | |||
(1.3.6.1.5.5.7.24) with the following entries with references to | ||||
this document: | this document: | |||
</t> | ||||
</t> | <sourcecode> | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
id-scep-failInfoText OBJECT IDENTIFIER ::= { id-scep 1 } | id-scep-failInfoText OBJECT IDENTIFIER ::= { id-scep 1 } | |||
</sourcecode> | ||||
]]></artwork> | <t> | |||
</figure> | ||||
<t> | ||||
Entries in the registry are assigned according to the "Specification Required" | Entries in the registry are assigned according to the "Specification Required" | |||
policy defined in <xref target="RFC8126"/>. | policy defined in <xref target="RFC8126" format="default"/>. | |||
</t> | ||||
</t> | <t> | |||
<t> | <xref target="messageType" format="default"/> describes an "SCEP Message Type" r | |||
egistry, and | ||||
<xref target="messageType"/> describes a SCEP Message Type Registry and | <xref target="CA-caps" format="default"/> describes an "SCEP CA Capabilities" | |||
<xref target="CA-caps"/> describes a SCEP CA Capabilities Registry to be | registry; these registries are maintained by IANA and define a number of such | |||
maintained by the IANA, defining a number of such code point identifiers. | code-point identifiers. Entries in the registry are assigned according | |||
Entries in the registry are to be assigned according to the "Specification | to the "Specification Required" policy defined in <xref target="RFC8126" format= | |||
Required" policy defined in <xref target="RFC8126"/>. | "default"/>. | |||
</t> | ||||
<t> | ||||
The SCEP Message Type Registry has columns "Value," "Name," "Description," and | ||||
"Reference". The "Value" entry is a small positive integer, with the value | ||||
"0" reserved. | ||||
</t> | ||||
<t> | ||||
The SCEP CA Capabilities Registry has columns "Keyword", "Description", and | </t> | |||
"Reference". Although implementations SHOULD use the SCEP CA Capabilities | <t> | |||
Registry, SCEP is often employed in situations where this isn't possible. In | The "SCEP Message Types" registry has "Value", "Name", "Description", and | |||
this case private-use CA capabilities may be specified using a unique prefix | "Reference" columns. The "Value" entry is a small positive integer; value | |||
"0" is reserved. | ||||
</t> | ||||
<t> | ||||
The "SCEP CA Capabilities" registry has "Keyword", "Description", and | ||||
"Reference" columns. Although implementations <bcp14>SHOULD</bcp14> use the "SC | ||||
EP CA Capabilities" | ||||
registry, SCEP is often employed in situations where this isn't possible. In | ||||
this case, private-use CA capabilities may be specified using a unique prefix | ||||
such as an organisation identifier or domain name under the control of the | such as an organisation identifier or domain name under the control of the | |||
entity that defines the capability. For example the prefix would be | entity that defines the capability. For example, the prefix would be | |||
"Example.com-" and the complete capability would be | "Example.com-", and the complete capability would be | |||
"Example.com-CapabilityName". | "Example.com-CapabilityName". | |||
</t> | ||||
<t> | ||||
IANA has registered four media types as defined in this document: | ||||
</t> | ||||
</t> | <ul> | |||
<t> | <li>application/x-x509-ca-cert</li> | |||
<li>application/x-x509-ca-ra-cert</li> | ||||
This document defines four media types for IANA registration: | <li>application/x-x509-next-ca-cert</li> | |||
<li>application/x-pki-message</li> | ||||
</t> | </ul> | |||
<figure> | <t> | |||
<artwork><![CDATA[ | Note that these are grandfathered media types registered as per <xref | |||
target="RFC6838" sectionFormat="of" section="A"/>. Templates | ||||
"application/x-x509-ca-cert" | for registrations are specified below. | |||
"application/x-x509-ca-ra-cert" | </t> | |||
"application/x-x509-next-ca-cert" | ||||
"application/x-pki-message" | ||||
]]></artwork> | ||||
</figure> | ||||
<t> | ||||
Note that these are grandfathered media types registered as per Appendix A of | ||||
<xref target="RFC6838"/>. Templates for registrations are specified below. | ||||
</t> | ||||
<section title="Registration of application/x-x509-ca-cert media type"> | ||||
<t> | ||||
Type name: application | ||||
</t> | ||||
<t> | ||||
Subtype name: x-x509-ca-cert | ||||
</t> | ||||
<t> | ||||
Required parameters: none | ||||
</t> | ||||
<t> | ||||
Optional parameters: none | ||||
</t> | ||||
<t> | ||||
Encoding considerations: binary | ||||
</t> | ||||
<t> | ||||
Security considerations: This media type contains a certificate, see the | ||||
Security Considerations section of <xref target="PKIX"/>. There is no | ||||
executable content. | ||||
</t> | ||||
<t> | ||||
Interoperability considerations: This is a grandfathered registration of an | ||||
alias to application/pkix-cert (basically a single DER encoded Certification | ||||
Authority certificate), which is only used in SCEP. | ||||
</t> | ||||
<t> | ||||
Published specification: draft-gutmann-scep-15 | ||||
</t> | ||||
<t> | ||||
Applications that use this media type: SCEP uses this media type when | ||||
returning a CA certificate. | ||||
</t> | ||||
<t> | ||||
Fragment identifier considerations: N/A | ||||
</t> | ||||
<t> | ||||
Additional information: | ||||
</t> | ||||
<t> | ||||
Deprecated alias names for this type: N/A | ||||
</t> | ||||
<t> | ||||
Magic number(s): none | ||||
</t> | ||||
<t> | ||||
File extension(s): N/A | ||||
</t> | ||||
<t> | ||||
Macintosh file type code(s): N/A | ||||
</t> | ||||
<t> | ||||
Person and email address to contact for further information: See the Authors' | ||||
Addresses section of draft-gutmann-scep-15 | ||||
</t> | ||||
<t> | ||||
Intended usage: LIMITED USE | ||||
</t> | ||||
<t> | ||||
Restrictions on usage: SCEP protocol | ||||
</t> | ||||
<t> | ||||
Author: See the Authors' Addresses section of draft-gutmann-scep-15 | ||||
</t> | ||||
<t> | ||||
Change controller: IETF | ||||
</t> | ||||
<t> | ||||
Provisional registration? No | ||||
</t> | ||||
</section> | ||||
<section title="Registration of application/x-x509-ca-ra-cert media typ | ||||
e"> | ||||
<t> | ||||
Type name: application | ||||
</t> | ||||
<t> | ||||
Subtype name: x-x509-ca-ra-cert | ||||
</t> | ||||
<t> | ||||
Required parameters: none | ||||
</t> | ||||
<t> | ||||
Optional parameters: none | ||||
</t> | ||||
<t> | ||||
Encoding considerations: binary | ||||
</t> | ||||
<t> | ||||
Security considerations: This media type consists of a degenerate | ||||
certificates-only CMS Signed-Data message (<xref target="certs-only"/>) | ||||
containing the certificates, with the intermediate CA certificate(s) as the | ||||
leaf certificate(s). There is no executable content. | ||||
</t> | ||||
<t> | ||||
Interoperability considerations: This is a grandfathered registration which | ||||
is only used in SCEP. | ||||
</t> | ||||
<t> | ||||
Published specification: draft-gutmann-scep-15 | ||||
</t> | ||||
<t> | ||||
Applications that use this media type: SCEP uses this media type when | ||||
returning CA Certificate Chain Response. | ||||
</t> | ||||
<t> | ||||
Fragment identifier considerations: N/A | ||||
</t> | ||||
<t> | ||||
Additional information: | ||||
</t> | ||||
<t> | ||||
Deprecated alias names for this type: N/A | ||||
</t> | ||||
<t> | ||||
Magic number(s): none | ||||
</t> | ||||
<t> | ||||
File extension(s): N/A | ||||
</t> | ||||
<t> | ||||
Macintosh file type code(s): N/A | ||||
</t> | ||||
<t> | ||||
Person and email address to contact for further information: See the Authors' | ||||
Addresses section of draft-gutmann-scep-15 | ||||
</t> | ||||
<t> | ||||
Intended usage: LIMITED USE | ||||
</t> | ||||
<t> | ||||
Restrictions on usage: SCEP protocol | ||||
</t> | ||||
<t> | ||||
Author: See the Authors' Addresses section of draft-gutmann-scep-15 | ||||
</t> | ||||
<t> | ||||
Change controller: IETF | ||||
</t> | ||||
<t> | ||||
Provisional registration? no | ||||
</t> | ||||
</section> | ||||
<section title="Registration of application/x-x509-next-ca-cert media t | ||||
ype"> | ||||
<t> | ||||
Type name: application | <section numbered="true" toc="default"> | |||
</t> | <name>Registration of the application/x-x509-ca-cert Media Type</name> | |||
<t> | <dl> | |||
Subtype name: x-x509-next-ca-cert | <dt>Type name:</dt> | |||
</t> | <dd>application</dd> | |||
<t> | <dt>Subtype name:</dt> | |||
Required parameters: none | <dd>x-x509-ca-cert</dd> | |||
</t> | <dt>Required parameters:</dt> | |||
<t> | <dd>none</dd> | |||
Optional parameters: none | <dt>Optional parameters:</dt> | |||
</t> | <dd>none</dd> | |||
<t> | <dt>Encoding considerations:</dt> | |||
Encoding considerations: binary | <dd>binary</dd> | |||
</t> | <dt>Security considerations:</dt> | |||
<t> | <dd>This media type contains a certificate; see the | |||
Security considerations: This media type consists of a Signed-Data CMS | Security Considerations section of <xref target="RFC5280" | |||
message, signed by the current CA signing key. There is no executable content. | format="default"/>. There is no executable content.</dd> | |||
</t> | <dt>Interoperability considerations:</dt> | |||
<t> | <dd>This is a grandfathered registration of an alias to application/pkix-cert | |||
Interoperability considerations: This is a grandfathered registration which is | (basically a single DER-encoded Certification Authority certificate), which is | |||
only used in SCEP. | only used in SCEP.</dd> | |||
</t> | <dt>Published specification:</dt> | |||
<t> | <dd>RFC 8894</dd> | |||
Published specification: draft-gutmann-scep-15 | <dt>Applications that use this media type:</dt> | |||
</t> | <dd>SCEP uses this media type when returning a CA certificate.</dd> | |||
<t> | <dt>Fragment identifier considerations:</dt> | |||
Applications that use this media type: SCEP uses this media type when | <dd>N/A</dd> | |||
returning a Get Next CA Response. | <dt>Additional information:</dt> | |||
</t> | <dd><t><br/></t> | |||
<t> | <dl> | |||
Fragment identifier considerations: N/A | <dt>Deprecated alias names for this type:</dt> | |||
</t> | <dd>N/A</dd> | |||
<t> | <dt>Magic number(s):</dt> | |||
Additional information: | <dd>none</dd> | |||
</t> | <dt>File extension(s):</dt> | |||
<t> | <dd>N/A</dd> | |||
Deprecated alias names for this type: N/A | <dt>Macintosh file type code(s):</dt> | |||
</t> | <dd>N/A</dd> | |||
<t> | </dl> | |||
Magic number(s): none | </dd> | |||
</t> | <dt>Person and email address to contact for further information:</dt> | |||
<t> | <dd>See the Authors' Addresses section of RFC 8894.</dd> | |||
File extension(s): N/A | <dt>Intended usage:</dt> | |||
</t> | <dd>LIMITED USE</dd> | |||
<t> | <dt>Restrictions on usage:</dt> | |||
Macintosh file type code(s): N/A | <dd>SCEP protocol</dd> | |||
</t> | <dt>Author:</dt> | |||
<t> | <dd>See the Authors' Addresses section of RFC 8894</dd> | |||
Person and email address to contact for further information: See the Authors' | <dt>Change controller:</dt> | |||
Addresses section of draft-gutmann-scep-15 | <dd>IETF</dd> | |||
</t> | <dt>Provisional registration?</dt> | |||
<t> | <dd>No</dd> | |||
Intended usage: LIMITED USE | </dl> | |||
</t> | </section> | |||
<t> | <section numbered="true" toc="default"> | |||
Restrictions on usage: SCEP protocol | <name>Registration of the application/x-x509-ca-ra-cert Media Type</name | |||
</t> | > | |||
<t> | ||||
Author: See the Authors' Addresses section of draft-gutmann-scep-15 | ||||
</t> | ||||
<t> | ||||
Change controller: IETF | ||||
</t> | ||||
<t> | ||||
Provisional registration? no | ||||
</t> | <dl> | |||
</section> | <dt>Type name:</dt> | |||
<section title="Registration of application/x-pki-message media type"> | <dd>application</dd> | |||
<t> | <dt>Subtype name:</dt> | |||
<dd>x-x509-ca-ra-cert</dd> | ||||
<dt>Required parameters:</dt> | ||||
<dd>none</dd> | ||||
<dt>Optional parameters:</dt> | ||||
<dd>none</dd> | ||||
<dt>Encoding considerations:</dt> | ||||
<dd>binary</dd> | ||||
<dt>Security considerations:</dt> | ||||
<dd>This media type consists of a degenerate | ||||
certificates-only CMS SignedData message (<xref target="certs-only" | ||||
format="default"/>) containing the certificates, with the intermediate CA | ||||
certificate(s) as the leaf certificate(s). There is no executable | ||||
content.</dd> | ||||
<dt>Interoperability considerations:</dt> | ||||
<dd>This is a grandfathered registration that is only used in SCEP.</dd> | ||||
<dt>Published specification:</dt> | ||||
<dd>RFC 8894</dd> | ||||
<dt>Applications that use this media type:</dt> | ||||
<dd>SCEP uses this media type when returning CA Certificate Chain | ||||
Response.</dd> | ||||
<dt>Fragment identifier considerations:</dt> | ||||
<dd>N/A</dd> | ||||
<dt>Additional information:</dt> | ||||
<dd><t><br/></t> | ||||
<dl> | ||||
<dt>Deprecated alias names for this type:</dt> | ||||
<dd>N/A</dd> | ||||
<dt>Magic number(s):</dt> | ||||
<dd>none</dd> | ||||
<dt>File extension(s):</dt> | ||||
<dd>N/A</dd> | ||||
<dt>Macintosh file type code(s):</dt> | ||||
<dd>N/A</dd> | ||||
</dl> | ||||
</dd> | ||||
<dt>Person and email address to contact for further information:</dt> | ||||
<dd>See the Authors' Addresses section of RFC 8894.</dd> | ||||
<dt>Intended usage:</dt> | ||||
<dd>LIMITED USE</dd> | ||||
<dt>Restrictions on usage:</dt> | ||||
<dd>SCEP protocol</dd> | ||||
<dt>Author:</dt> | ||||
<dd>See the Authors' Addresses section of RFC 8894.</dd> | ||||
<dt>Change controller:</dt> | ||||
<dd>IETF</dd> | ||||
<dt>Provisional registration?</dt> | ||||
<dd>no</dd> | ||||
</dl> | ||||
</section> | ||||
Type name: application | <section numbered="true" toc="default"> | |||
</t> | <name>Registration of the application/x-x509-next-ca-cert Media Type</na | |||
<t> | me> | |||
Subtype name: x-pki-message | <dl> | |||
</t> | <dt>Type name:</dt> | |||
<t> | <dd>application</dd> | |||
Required parameters: none | <dt>Subtype name:</dt> | |||
</t> | <dd>x-x509-next-ca-cert</dd> | |||
<t> | <dt>Required parameters:</dt> | |||
Optional parameters: none | <dd>none</dd> | |||
</t> | <dt>Optional parameters:</dt> | |||
<t> | <dd>none</dd> | |||
Encoding considerations: binary | <dt>Encoding considerations:</dt> | |||
</t> | <dd>binary</dd> | |||
<t> | <dt>Security considerations:</dt> | |||
Security considerations: This media type consists of a degenerate | <dd>This media type consists of a SignedData CMS message, signed by the | |||
certificates-only CMS Signed-Data message. There is no executable content. | current CA signing key. There is no executable content.</dd> | |||
</t> | <dt>Interoperability considerations:</dt> | |||
<t> | <dd>This is a grandfathered registration that is only used in SCEP.</dd> | |||
Interoperability considerations: This is a grandfathered registration which is | <dt>Published specification:</dt> | |||
only used in SCEP. | <dd>RFC 8894</dd> | |||
</t> | <dt>Applications that use this media type:</dt> | |||
<t> | <dd>SCEP uses this media type when returning a Get Next CA response.</dd> | |||
Published specification: draft-gutmann-scep-15 | <dt>Fragment identifier considerations:</dt> | |||
</t> | <dd>N/A</dd> | |||
<t> | <dt>Additional information:</dt> | |||
Applications that use this media type: SCEP uses this media type when | <dd><t><br/></t> | |||
returning a Certificate Enrolment/Renewal Response. | <dl> | |||
</t> | <dt>Deprecated alias names for this type:</dt> | |||
<t> | <dd>N/A</dd> | |||
Fragment identifier considerations: N/A | <dt>Magic number(s):</dt> | |||
</t> | <dd>none</dd> | |||
<t> | <dt>File extension(s):</dt> | |||
Additional information: | <dd>N/A</dd> | |||
</t> | <dt>Macintosh file type code(s):</dt> | |||
<t> | <dd>N/A</dd> | |||
Deprecated alias names for this type: N/A | </dl> | |||
</t> | </dd> | |||
<t> | <dt>Person and email address to contact for further information:</dt> | |||
Magic number(s): none | <dd>See the Authors' Addresses section of RFC 8894.</dd> | |||
</t> | <dt>Intended usage:</dt> | |||
<t> | <dd>LIMITED USE </dd> | |||
File extension(s): N/A | <dt>Restrictions on usage:</dt> | |||
</t> | <dd>SCEP protocol</dd> | |||
<t> | <dt>Author:</dt> | |||
Macintosh file type code(s): N/A | <dd>See the Authors' Addresses section of RFC 8894.</dd> | |||
</t> | <dt>Change controller:</dt> | |||
<t> | <dd>IETF</dd> | |||
Person and email address to contact for further information: See the Authors' | <dt>Provisional registration?</dt> | |||
Addresses section of draft-gutmann-scep-15 | <dd>no</dd> | |||
</t> | </dl> | |||
<t> | </section> | |||
Intended usage: LIMITED USE | ||||
</t> | ||||
<t> | ||||
Restrictions on usage: SCEP protocol | ||||
</t> | ||||
<t> | ||||
Author: See the Authors' Addresses section of draft-gutmann-scep-15 | ||||
</t> | ||||
<t> | ||||
Change controller: IETF | ||||
</t> | ||||
<t> | ||||
Provisional registration? no | ||||
</t> | <section numbered="true" toc="default"> | |||
</section> | <name>Registration of the application/x-pki-message Media Type</name> | |||
</section> | <dl> | |||
<!-- ====================================================================== | <dt>Type name:</dt> | |||
--> | <dd>application</dd> | |||
<section anchor="security" title="Security Considerations"> | <dt>Subtype name:</dt> | |||
<t> | <dd>x-pki-message</dd> | |||
<dt>Required parameters:</dt> | ||||
<dd>none</dd> | ||||
<dt>Optional parameters:</dt> | ||||
<dd>none</dd> | ||||
<dt>Encoding considerations:</dt> | ||||
<dd>binary</dd> | ||||
<dt>Security considerations:</dt> | ||||
<dd>This media type consists of a degenerate certificates-only CMS SignedData | ||||
message. There is no executable content.</dd> | ||||
<dt>Interoperability considerations:</dt> | ||||
<dd>This is a grandfathered registration that is only used in SCEP.</dd> | ||||
<dt>Published specification:</dt> | ||||
<dd>RFC 8894</dd> | ||||
<dt>Applications that use this media type:</dt> | ||||
<dd>SCEP uses this media type when returning a Certificate Enrolment/Renewal | ||||
Response.</dd> | ||||
<dt>Fragment identifier considerations:</dt> | ||||
<dd>N/A</dd> | ||||
<dt>Additional information:</dt> | ||||
<dd><t><br/></t> | ||||
<dl> | ||||
<dt>Deprecated alias names for this type:</dt> | ||||
<dd>N/A</dd> | ||||
<dt>Magic number(s):</dt> | ||||
<dd>none</dd> | ||||
<dt>File extension(s):</dt> | ||||
<dd>N/A</dd> | ||||
<dt>Macintosh file type code(s):</dt> | ||||
<dd>N/A</dd> | ||||
</dl> | ||||
</dd> | ||||
<dt>Person and email address to contact for further information:</dt> | ||||
<dd>See the Authors' Addresses section of RFC 8894.</dd> | ||||
<dt>Intended usage:</dt> | ||||
<dd>LIMITED USE</dd> | ||||
<dt>Restrictions on usage:</dt> | ||||
<dd>SCEP protocol</dd> | ||||
<dt>Author:</dt> | ||||
<dd>See the Authors' Addresses section of RFC 8894.</dd> | ||||
<dt>Change controller:</dt> | ||||
<dd>IETF</dd> | ||||
<dt>Provisional registration?</dt> | ||||
<dd>no</dd> | ||||
</dl> | ||||
</section> | ||||
</section> | ||||
<section anchor="security" numbered="true" toc="default"> | ||||
<name>Security Considerations</name> | ||||
<t> | ||||
The security goal of SCEP is that no adversary can subvert the public | The security goal of SCEP is that no adversary can subvert the public | |||
key/identity binding from that intended. An adversary is any entity other | key/identity binding from that intended. An adversary is any entity other | |||
than the client and the CA participating in the protocol. | than the client and the CA participating in the protocol. | |||
</t> | ||||
</t> | <t> | |||
<t> | ||||
This goal is met through the use of CMS and PKCS #10 encryption and digital | This goal is met through the use of CMS and PKCS #10 encryption and digital | |||
signatures using authenticated public keys. The CA's public key is | signatures using authenticated public keys. The CA's public key is | |||
authenticated via out-of-band means such as the checking of the CA fingerprint | authenticated via out-of-band means such as the checking of the CA fingerprint, | |||
and the SCEP client's public key is authenticated through manual or pre-shared | and the SCEP client's public key is authenticated through manual or preshared | |||
secret authentication. | secret authentication. | |||
</t> | ||||
</t> | <section numbered="true" toc="default"> | |||
<section title="General Security"> | <name>General Security</name> | |||
<t> | <t> | |||
Common key-management considerations such as keeping private keys truly | Common key-management considerations such as keeping private keys truly | |||
private and using adequate lengths for symmetric and asymmetric keys must be | private and using adequate lengths for symmetric and asymmetric keys must be | |||
followed in order to maintain the security of this protocol. This is | followed in order to maintain the security of this protocol. This is | |||
especially true for CA keys which, when compromised, compromise the security | especially true for CA keys which, when compromised, compromise the security | |||
of all relying parties. | of all relying parties. | |||
</t> | ||||
</t> | </section> | |||
</section> | <section numbered="true" toc="default"> | |||
<section title="Use of the CA private key"> | <name>Use of the CA Private Key</name> | |||
<t> | <t> | |||
A CA private key is generally meant for, and usually flagged as, being | ||||
A CA private key is generally meant for, and is usually flagged as, being | ||||
usable for certificate (and CRL) signing exclusively rather than data signing | usable for certificate (and CRL) signing exclusively rather than data signing | |||
or encryption. The SCEP protocol however uses the CA private key to both sign | or encryption. The SCEP protocol, however, uses the CA private key to both sign | |||
and optionally encrypt CMS transport messages. This is generally considered | and optionally encrypt CMS transport messages. This is generally considered | |||
undesirable as it widens the possibility of an implementation weakness and | undesirable, as it widens the possibility of an implementation weakness and | |||
provides an additional location where the private key must be used (and hence | provides an additional location where the private key must be used (and hence | |||
is slightly more vulnerable to exposure) and where a side-channel attack might | is slightly more vulnerable to exposure) and where a side-channel attack might | |||
be applied. | be applied. | |||
</t> | ||||
</t> | </section> | |||
</section> | <section numbered="true" toc="default"> | |||
<section title="ChallengePassword Shared Secret Value"> | <name>ChallengePassword Shared Secret Value</name> | |||
<t> | <t> | |||
The security measures that should be applied to the challengePassword shared | The security measures that should be applied to the challengePassword shared | |||
secret depend on the manner in which SCEP is employed. In the simplest case, | secret depend on the manner in which SCEP is employed. In the simplest case, | |||
with SCEP used to provision devices with certificates in the manufacturing | with SCEP used to provision devices with certificates in the manufacturing | |||
facility, the physical security of the facility may be enough to protect the | facility, the physical security of the facility may be enough to protect the | |||
certificate issue process with no additional measures explicitly required. In | certificate issue process with no additional measures explicitly required. In | |||
general though the security of the issue process depends on the security | general, though, the security of the issue process depends on the security | |||
employed around the use of the challengePassword shared secret. While it's | employed around the use of the challengePassword shared secret. While it's | |||
not possible to enumerate every situation in which SCEP may be utilised, the | not possible to enumerate every situation in which SCEP may be utilised, the | |||
following security measures should be considered. | following security measures should be considered. | |||
</t> | ||||
<list style="symbols"> | <ul spacing="compact"> | |||
<t> | <li> | |||
The challengePassword, despite its name, shouldn't be a conventional password | The challengePassword, despite its name, shouldn't be a conventional password | |||
but a high-entropy shared secret authentication string. Using the base64 | but a high-entropy shared-secret authentication string. Using the base64 | |||
encoding of a keying value generated or exchanged as part of standard device | encoding of a keying value generated or exchanged as part of standard device | |||
authentication protocols like EAP or DNP3 SA makes for a good | authentication protocols like the Extensible Authentication Protocol (EAP) or | |||
challengePassword. The use of high-entropy shared secrets is particulary | DNP3 Secure Authentication (DNP3-SA) makes for a good | |||
challengePassword. The use of high-entropy shared secrets is particularly | ||||
important when the PasswordRecipientInfo option is used to encrypt SCEP | important when the PasswordRecipientInfo option is used to encrypt SCEP | |||
messages, see <xref target="message-processing"/>. | messages; see <xref target="message-processing" format="default"/>. | |||
</li> | ||||
</t> | ||||
<t> | ||||
<li> | ||||
If feasible, the challengePassword should be a one-time value used to | If feasible, the challengePassword should be a one-time value used to | |||
authenticate the issue of a single certificate (subsequent certificate | authenticate the issue of a single certificate (subsequent certificate | |||
requests will be authenticated by being signed with the initial certificate). | requests will be authenticated by being signed with the initial certificate). | |||
If the challengePassword is single-use then the arrival of subsequent requests | If the challengePassword is single use, then the arrival of subsequent requests | |||
using the same challengePassword can then be used to indicate a security | using the same challengePassword can then be used to indicate a security | |||
breach. | breach. | |||
</li> | ||||
</t> | <li> | |||
<t> | ||||
The lifetime of a challengePassword can be limited, so that it can be used | The lifetime of a challengePassword can be limited, so that it can be used | |||
during initial device provisioning but will have expired at a later date if an | during initial device provisioning but will have expired at a later date if an | |||
attacker manages to compromise the challengePassword value, for example by | attacker manages to compromise the challengePassword value -- for example, by | |||
compromising the device that it's stored in. | compromising the device that it's stored in. | |||
</li> | ||||
</t> | <li> | |||
<t> | The CA should take appropriate measures to protect the | |||
challengePassword. Examples of possible measures include: physical security | ||||
The CA should take appropriate measures to protect the challengePassword, for | measures; storing it as a salted iterated hash or equivalent memory-hard | |||
example via physical security measures, or by storing it as a salted iterated | function; storing it as a keyed MAC value if it's not being used for | |||
hash or equivalent memory-hard function or as a keyed MAC value if it's not | encryption; and storing it in encrypted form if it is being used for encryption. | |||
being used for encryption, or by storing it in encrypted form if it is being | </li> | |||
used for encryption. | </ul> | |||
</section> | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section anchor="security-no-conf" title="Lack of Certificate Issue Con | ||||
firmation"> | ||||
<t> | ||||
<section anchor="security-no-conf" numbered="true" toc="default"> | ||||
<name>Lack of Certificate Issue Confirmation</name> | ||||
<t> | ||||
SCEP provides no confirmation that the issued certificate was successfully | SCEP provides no confirmation that the issued certificate was successfully | |||
received and processed by the client. This means that if the CertRep message | received and processed by the client. This means that if the CertRep message | |||
is lost or can't be processed by the client then the CA will consider the | is lost or can't be processed by the client, then the CA will consider the | |||
certificate successfully issued while the client won't. If this situation is | certificate successfully issued while the client won't. If this situation is | |||
of concern then the correct issuance of the certificate will need to be | of concern, then the correct issuance of the certificate will need to be | |||
verified by out-of-band means, for example through the client sending a | verified by out-of-band means, for example, through the client sending a | |||
message signed by the newly-issued certificate to the CA. This also provides | message signed by the newly issued certificate to the CA. This also provides | |||
the proof of possession that's not present in the case of a renewal operation, | the proof of possession that's not present in the case of a renewal operation; | |||
see <xref target="security-no-pop"/>. | see <xref target="security-no-pop" format="default"/>. | |||
</t> | ||||
</t> | </section> | |||
</section> | <section anchor="security-getcacaps" numbered="true" toc="default"> | |||
<section anchor="security-getcacaps" title="GetCACaps Issues"> | <name>GetCACaps Issues</name> | |||
<t> | <t> | |||
The GetCACaps response is not authenticated by the CA. This allows an | The GetCACaps response is not authenticated by the CA. This allows an | |||
attacker to perform downgrade attacks on the cryptographic capabilities of the | attacker to perform downgrade attacks on the cryptographic capabilities of the | |||
client/CA exchange. In particular if the server were to support MD5 and | client/CA exchange. In particular, if the server were to support MD5 and | |||
single DES then an in-path attacker could trivially roll back the encryption | single DES, then an in-path attacker could trivially roll back the encryption | |||
to use these insecure algorithms. By taking advantage of the presence of | to use these insecure algorithms. By taking advantage of the presence of | |||
large amounts of static known plaintext in the SCEP messages, as of 2017 a DES | large amounts of static known plaintext in the SCEP messages, as of 2017, a DES | |||
rainbow table attack can recover most encryption keys in under a minute, and | rainbow table attack can recover most encryption keys in under a minute, and | |||
MD5 chosen-prefix collisions can be calculated for a few tens of cents of | MD5 chosen-prefix collisions can be calculated for a few tens of cents of | |||
computing time using tools like HashClash. It is for this reason that this | computing time using tools like HashClash. It is for this reason that this | |||
specification makes single DES and MD5 a MUST NOT feature. Note that all | specification makes single DES and MD5 a <bcp14>MUST NOT</bcp14> feature. Note that all | |||
known servers support at least triple DES and SHA-1 (regardless of whether | known servers support at least triple DES and SHA-1 (regardless of whether | |||
"DES3" and "SHA-1" are indicated in GetCACaps), so there should never be a | "DES3" and "SHA-1" are indicated in GetCACaps), so there should never be a | |||
reason to fall all the way back to single DES and MD5. | reason to fall all the way back to single DES and MD5.</t> | |||
<t> | ||||
One simple countermeasure to a GetCACaps downgrade attack is for clients that | One simple countermeasure to a GetCACaps downgrade attack is for clients that | |||
are operating in an environment where on-path attacks are possible and that | are operating in an environment where on-path attacks are possible and that | |||
expect the "SCEPStandard" capability to be indicated by the CA but don't see | expect the "SCEPStandard" capability to be indicated by the CA but don't see | |||
it in the GetCACaps response to treat its absence as a security issue, and | it in the GetCACaps response to treat its absence as a security issue, and | |||
either discontinue the exchange or continue as if "SCEPStandard" had been | either discontinue the exchange or continue as if "SCEPStandard" had been | |||
returned. This requires a certain tradeoff between compatibility with old | returned. This requires a certain trade-off between compatibility with old | |||
servers and security against active attacks. | servers and security against active attacks. | |||
</t> | ||||
</t> | </section> | |||
</section> | <section anchor="security-no-pop" numbered="true" toc="default"> | |||
<section anchor="security-no-pop" title="Lack of PoP in Renewal Request | <name>Lack of PoP in Renewal Requests</name> | |||
s"> | <t> | |||
<t> | ||||
Renewal operations (but not standard certificate-issue operations) are | Renewal operations (but not standard certificate-issue operations) are | |||
processed via a previously-issued certificate and its associated private key, | processed via a previously issued certificate and its associated private key, | |||
not the key in the PKCS #10 request. This means that a client no longer | not the key in the PKCS #10 request. This means that a client no longer | |||
demonstrates proof of possession (PoP) of the private key corresponding to the | demonstrates proof of possession (PoP) of the private key corresponding to the | |||
public key in the PKCS #10 request. It is therefore possible for a client to | public key in the PKCS #10 request. It is therefore possible for a client to | |||
re-certify an existing key used by a third party, so that two or more | recertify an existing key used by a third party, so that two or more | |||
certificates exist for the same key. By switching out the certificate in a | certificates exist for the same key. By switching out the certificate in a | |||
signature, an attacker can appear to have a piece of data signed by their | signature, an attacker can appear to have a piece of data signed by their | |||
certificate rather than the original signer's certificate. This, and other, | certificate rather than the original signer's certificate. This, and other, | |||
attacks are described in <xref target="ESS">S/MIME ESS</xref>. | attacks are described in <xref target="RFC2634" format="default">S/MIME ESS</xre | |||
f>. | ||||
</t> | </t> | |||
<t> | <t> | |||
Avoiding these types of attacks requires situation-specific measures. For | Avoiding these types of attacks requires situation-specific measures. For | |||
example CMS/SMIME implementations may use the ESSCertID attribute from <xref | example, CMS/SMIME implementations may use the ESSCertID attribute from <xref | |||
target="ESS">S/MIME ESS</xref> or its successor <xref target="ESSv2">S/MIME | target="RFC2634" format="default">S/MIME ESS</xref> or its successor, <xref | |||
ESSv2</xref> to unambiguously identify the signing certificate. However since | target="RFC5035" format="default">S/MIME | |||
ESSv2</xref>, to unambiguously identify the signing certificate. However, since | ||||
other mechanisms and protocols that the certificates will be used with | other mechanisms and protocols that the certificates will be used with | |||
typically don't defend against this problem, it's unclear whether this is an | typically don't defend against this problem, it's unclear whether this is an | |||
actual issue with SCEP. | actual issue with SCEP. | |||
</t> | ||||
</t> | </section> | |||
</section> | <section anchor="traffic-monitoring" numbered="true" toc="default"> | |||
<section anchor="traffic-monitoring" title="Traffic Monitoring"> | <name>Traffic Monitoring</name> | |||
<t> | <t> | |||
SCEP messages are signed with certificates that may contain identifying | SCEP messages are signed with certificates that may contain identifying | |||
information. If these are sent over the public Internet and real identity | information. If these are sent over the public Internet and real identity | |||
information (rather than placeholder values or arbitrary device IDs) are | information (rather than placeholder values or arbitrary device IDs) is | |||
included in the signing certificate data, an attacker may be able to monitor | included in the signing certificate data, an attacker may be able to monitor | |||
the identities of the entities submitting the certificate requests. If this | the identities of the entities submitting the certificate requests. If this | |||
is an issue then <xref target="RFC7258"/> should be consulted for guidance. | is an issue, then <xref target="RFC7258" format="default"/> should be consulted | |||
for guidance. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="security-unnecessary" title="Unnecessary cryptography" | <section anchor="security-unnecessary" numbered="true" toc="default"> | |||
> | <name>Unnecessary Cryptography</name> | |||
<t> | <t> | |||
Some of the SCEP exchanges use unnecessary signing and encryption operations. | Some of the SCEP exchanges use unnecessary signing and encryption operations. | |||
In particular the GetCert and GetCRL exchanges are encrypted and signed in | In particular, the GetCert and GetCRL exchanges are encrypted and signed in | |||
both directions. The information requested is public and thus encrypting the | both directions. The information requested is public, and thus encrypting the | |||
requests is of questionable value. In addition CRLs and certificates sent in | requests is of questionable value. In addition, CRLs and certificates sent in | |||
responses are already signed by the CA and can be verified by the recipient | responses are already signed by the CA and can be verified by the recipient | |||
without requiring additional signing and encryption. More lightweight means | without requiring additional signing and encryption. More lightweight means | |||
of retrieving certificates and CRLs such as <xref target="HTTP-certstore">HTTP | of retrieving certificates and CRLs such as <xref target="RFC4387" format="defau lt">HTTP | |||
certificate-store access</xref> and LDAP are recommended for this reason. | certificate-store access</xref> and LDAP are recommended for this reason. | |||
</t> | ||||
</t> | </section> | |||
</section> | <section anchor="security-sha1" numbered="true" toc="default"> | |||
<section anchor="security-sha1" title="Use of SHA-1"> | <name>Use of SHA-1</name> | |||
<t> | <t> | |||
The majority of the large number of devices that use SCEP today default to | ||||
The majority of the large numbers of devices that use SCEP today default to | ||||
SHA-1, with many supporting only that hash algorithm with no ability to | SHA-1, with many supporting only that hash algorithm with no ability to | |||
upgrade to a newer one. SHA-1 is no longer regarded as secure in all | upgrade to a newer one. SHA-1 is no longer regarded as secure in all | |||
situations, but as used in SCEP it's still safe. There are three reasons for | situations, but as used in SCEP, it's still safe. There are three reasons for | |||
this. The first is that attacking SCEP would require creating a fully general | this. The first is that attacking SCEP would require creating a fully general | |||
SHA-1 collision in close to real time alongside breaking AES (more | SHA-1 collision in close to real time alongside breaking AES (more | |||
specifically, it would require creating a fully general SHA-1 collision for | specifically, it would require creating a fully general SHA-1 collision for | |||
the PKCS #10 request, breaking the AES encryption around the PKCS #10 request, | the PKCS #10 request, breaking the AES encryption around the PKCS #10 request, | |||
and then creating a second SHA-1 collision for the signature on the encrypted | and then creating a second SHA-1 collision for the signature on the encrypted | |||
data), which won't be feasible for a long time. | data), which won't be feasible for a long time. | |||
</t> | ||||
</t> | <t> | |||
<t> | The second reason is that the signature over the message -- in other words, the | |||
SHA-1 hash that isn't protected by encryption -- doesn't serve any critical | ||||
The second reason is that the signature over the message, in other words the | ||||
SHA-1 hash that isn't protected by encryption, doesn't serve any critical | ||||
cryptographic purpose: The PKCS #10 data itself is authenticated through its | cryptographic purpose: The PKCS #10 data itself is authenticated through its | |||
own signature, protected by encryption, and the overall request is authorised | own signature, protected by encryption, and the overall request is authorised | |||
by the (encrypted) shared secret. The sole exception to this will be the | by the (encrypted) shared secret. The sole exception to this will be the | |||
small number of implementations that support the Renewal operation, which may | small number of implementations that support the Renewal operation, which may | |||
be authorised purely through a signature, but presumably any implementation | be authorised purely through a signature, but presumably any implementation | |||
recent enough to support Renewal also supports SHA-2. Any legacy | recent enough to support Renewal also supports SHA-2. Any legacy | |||
implementation that supports the historic core SCEP protocol would not be | implementation that supports the historic core SCEP protocol would not be | |||
affected. | affected. | |||
</t> | ||||
</t> | <t> | |||
<t> | ||||
The third reason is that SCEP uses the same key for encryption and signing, so | The third reason is that SCEP uses the same key for encryption and signing, so | |||
that even if an attacker were able to capture an outgoing Renewal request that | that even if an attacker were able to capture an outgoing renewal request that | |||
didn't include a shared secret (in other words one that was only authorised | didn't include a shared secret (in other words, one that was only authorised | |||
through a signature), break the AES encryption, forge the SHA-1 hash in real | through a signature), break the AES encryption, forge the SHA-1 hash in real | |||
time, and forward the forged request to the CA, they couldn't decrypt the | time, and forward the forged request to the CA, they couldn't decrypt the | |||
returned certificate, which is protected with the same key that was used to | returned certificate, which is protected with the same key that was used to | |||
generate the signature. While <xref target="security-unnecessary"/> points | generate the signature. While <xref target="security-unnecessary" format="defau lt"/> points | |||
out that SCEP uses unnecessary cryptography in places, the additional level of | out that SCEP uses unnecessary cryptography in places, the additional level of | |||
security provided by the extra crypto makes it immune to any issues with | security provided by the extra crypto makes it immune to any issues with | |||
SHA-1. | SHA-1. | |||
</t> | ||||
</t> | <t> | |||
<t> | ||||
This doesn't mean that SCEP implementations should continue to use SHA-1 in | This doesn't mean that SCEP implementations should continue to use SHA-1 in | |||
perpetuity, merely that there's no need for a panicked switch to SHA-2. | perpetuity, merely that there's no need for a panicked switch to SHA-2. | |||
</t> | ||||
</section> | ||||
</t> | <section title="Use of HTTP"> | |||
</section> | <t> | |||
SCEP is an encrypted, authenticated certificate enrollment protocol that uses | ||||
HTTP as a simple transport mechanism. Since SCEP messages are already | ||||
cryptographically secured, it does not require transport layer security. Where | ||||
HTTPS is elected, a performance hit may result from the TLS overhead, | ||||
operational problems may result due to the more complex configuration, and | ||||
potential security vulnerability may result due to the addition of an entire | ||||
TLS protocol stack alongside the basic SCEP protocol. | ||||
</t> | ||||
<t> | ||||
In particular, experience has shown that the issue of configuring | ||||
certificates, CAs, and trust for both TLS and SCEP often leads to | ||||
interoperability problems because different certificates and trust models are | ||||
used in each. Use of HTTPS to authenticate the server does not enable | ||||
omission of the ChallengePassword or similar authenticator in the SCEP message | ||||
on the assumption that using HTTPS instead of HTTP will somehow make this | ||||
insecure usage secure again. HTTPS is not soy sauce for security and is | ||||
unnecessary for SCEP, which uses cryptographically secured messages and does | ||||
not require transport layer security. | ||||
</t> | ||||
</section> | </section> | |||
<!-- ====================================================================== | </section> | |||
--> | ||||
</middle> | ||||
<!-- ======================================================================== | ||||
--> | ||||
<back> | ||||
<references title="Normative References"> | ||||
<reference anchor='RFC2119'> | ||||
<front> | ||||
<title abbrev='RFC Key Words'>Key words for use in RFCs to Indicate Re | ||||
quirement Levels</title> | ||||
<author initials='S.' surname='Bradner' fullname='Scott Bradner'> | ||||
<organization>Harvard University</organization> | ||||
</author> | ||||
<date year='1997' month='March' /> | ||||
<area>General</area> | ||||
<keyword>keyword</keyword> | ||||
</front> | ||||
<seriesInfo name='BCP' value='14' /> | ||||
<seriesInfo name='RFC' value='2119' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc2119.txt' /> | ||||
<format type='HTML' target='http://xml.resource.org/public/rfc/html/rfc2 | ||||
119.html' /> | ||||
<format type='XML' target='http://xml.resource.org/public/rfc/xml/rfc211 | ||||
9.xml' /> | ||||
</reference> | ||||
<reference anchor='RFC6838'> | ||||
<front> | ||||
<title>Media Type Specifications and Registration Procedures</title> | ||||
<author initials='N.' surname='Freed' fullname='Ned Freed'> | ||||
<organization>Oracle</organization> | ||||
</author> | ||||
<author initials='J.' surname='Klensin' fullname='John Klensin'> | ||||
</author> | ||||
<author initials='T.' surname='Hansen' fullname='Tony Hansen'> | ||||
<organization>ATT Laboratories</organization> | ||||
</author> | ||||
<date year='2013' month='January' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='6838' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc6838.txt' /> | ||||
</reference> | ||||
<reference anchor='RFC7258'> | ||||
<front> | ||||
<title>Guidelines for Writing an IANA Considerations Section in RFCs</ | ||||
title> | ||||
<author initials='S.' surname='Farrell' fullname='Stephen Farrell'> | ||||
<organization>Trinity College Dublin</organization> | ||||
</author> | ||||
<author initials='H.' surname='Tschofenig' fullname='Hannes Tschofenig | ||||
'> | ||||
<organization>ARM Ltd.</organization> | ||||
</author> | ||||
<date year='2014' month='May' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='7258' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc7258.txt' /> | ||||
</reference> | ||||
<reference anchor='RFC8126'> | </middle> | |||
<front> | ||||
<title>Guidelines for Writing an IANA Considerations Section in RFCs</ | ||||
title> | ||||
<author initials='B.' surname='Leiba' fullname='Barry Leiba'> | ||||
<organization>Huawei Technologies</organization> | ||||
</author> | ||||
<author initials='T.' surname='Narten' fullname='Thomas Narten'> | ||||
<organization>IBM Corporation</organization> | ||||
</author> | ||||
<date year='2017' month='June' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='8126' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc8126.txt' /> | ||||
</reference> | ||||
<reference anchor='RFC8174'> | <back> | |||
<front> | <displayreference target="I-D.ietf-httpbis-bcp56bis" to="HTTP" /> | |||
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</titl | ||||
e> | ||||
<author initials='B.' surname='Leiba' fullname='Barry Leiba'> | ||||
<organization>Huawei Technologies</organization> | ||||
</author> | ||||
<date year='2017' month='May' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='8174' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc8174.txt' /> | ||||
</reference> | ||||
<reference anchor='ABNF'> | <references> | |||
<front> | <name>References</name> | |||
<title>Augmented BNF for Syntax Specifications: ABNF</title> | <references> | |||
<author initials="R" surname="Crocker"></author> | <name>Normative References</name> | |||
<author initials="P" surname="Overell"></author> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
<date year='2008' month='January' /> | ence.RFC.2119.xml"/> | |||
</front> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
<seriesInfo name='RFC' value='5234' /> | ence.RFC.6838.xml"/> | |||
<format type='TXT' target='http://www.ietf.org/rfc/rfc5234.txt' /> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
</reference> | ence.RFC.7258.xml"/> | |||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8126.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8174.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.5234.xml"/> | ||||
<reference anchor="AES"> | <reference anchor="AES"> | |||
<front> | <front> | |||
<title>The Advanced Encryption Standard (AES)</title> | <title>The Advanced Encryption Standard (AES)</title> | |||
<author fullname='U.S. National Institute of Standards and Technology' | <seriesInfo name="FIPS" value="197"/> | |||
> | <author fullname="U.S. National Institute of Standards and Technolog | |||
y"> | ||||
<organization>NIST</organization> | <organization>NIST</organization> | |||
</author> | </author> | |||
<date year='2001' month='November' /> | <date year="2001" month="November"/> | |||
</front> | </front> | |||
<seriesInfo name='FIPS' value='197' /> | <seriesInfo name="DOI" value="10.6028/NIST.FIPS.197" /> | |||
</reference> | </reference> | |||
<reference anchor="SHA2"> | <reference anchor="SHA2"> | |||
<front> | <front> | |||
<title>Secure Hash Standard (SHS)</title> | <title>Secure Hash Standard (SHS)</title> | |||
<author fullname='U.S. National Institute of Standards and Technology' | <seriesInfo name="FIPS" value="180-3"/> | |||
> | <author fullname="U.S. National Institute of Standards and Technolog | |||
y"> | ||||
<organization>NIST</organization> | <organization>NIST</organization> | |||
</author> | </author> | |||
<date year='2008' month='October' /> | <date year="2008" month="October"/> | |||
</front> | </front> | |||
<seriesInfo name='FIPS' value='180-3' /> | </reference> | |||
</reference> | ||||
<reference anchor='Base64'> | ||||
<front> | ||||
<title>The Base16, Base32, and Base64 Data Encodings</title> | ||||
<author initials="S" surname="Josefsson"></author> | ||||
<date year='2006' month='October' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='4648' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc4648.txt' /> | ||||
</reference> | ||||
<reference anchor='CMS'> | ||||
<front> | ||||
<title>Cryptographic Message Syntax (CMS)</title> | ||||
<author initials="R" surname="Housley"></author> | ||||
<date year='2009' month='September' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='5652' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc5652.txt' /> | ||||
</reference> | ||||
<reference anchor='HTTP'> | ||||
<front> | ||||
<title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Rout | ||||
ing</title> | ||||
<author initials="R" surname="Fielding"></author> | ||||
<author initials="J" surname="Reschke"></author> | ||||
<date year='2014' month='June' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='7230' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc7230.txt' /> | ||||
</reference> | ||||
<reference anchor='PKCS9'> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<front> | FC.4648.xml"/> | |||
<title>PKCS #9: Selected Object Classes and Attribute Types Version 2. | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
0</title> | FC.5652.xml"/> | |||
<author initials="M" surname="Nystrom"></author> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<author initials="B" surname="Kaliski"></author> | FC.7230.xml"/> | |||
<date year='2000' month='November' /> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
</front> | FC.2985.xml"/> | |||
<seriesInfo name='RFC' value='2985' /> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<format type='TXT' target='http://www.ietf.org/rfc/rfc2985.txt' /> | FC.2986.xml"/> | |||
</reference> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
FC.5280.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.3986.xml"/> | ||||
</references> | ||||
<references> | ||||
<name>Informative References</name> | ||||
<reference anchor='PKCS10'> | <xi:include href="https://www.rfc-editor.org/refs/bibxml3/reference.I-D.ietf-htt | |||
<front> | pbis-bcp56bis.xml"/> | |||
<title>PKCS #10: Certification Request Syntax Specification Version 1. | ||||
7</title> | ||||
<author initials="M" surname="Nystrom"></author> | ||||
<author initials="B" surname="Kaliski"></author> | ||||
<date year='2000' month='November' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='2986' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc2986.txt' /> | ||||
</reference> | ||||
<reference anchor='PKIX'> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
<front> | ence.RFC.4387.xml"/> | |||
<title>Internet X.509 Public Key Infrastructure Certificate and Certif | ||||
icate Revocation List (CRL) Profile</title> | ||||
<author initials="D" surname="Cooper"></author> | ||||
<author initials="S" surname="Santesson"></author> | ||||
<author initials="S" surname="Farrell"></author> | ||||
<author initials="S" surname="Boeyen"></author> | ||||
<author initials="R" surname="Housley"></author> | ||||
<author initials="W" surname="Polk"></author> | ||||
<date year='2008' month='May' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='5280' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc5280.txt' /> | ||||
</reference> | ||||
<reference anchor='URI'> | <reference anchor="JSCEP" target="https://github.com/jscep/jscep"> | |||
<front> | <front> | |||
<title>Uniform Resource Identifiers (URI): Generic Syntax</title> | <title>A Java implementation of the Simple Certificate Enrolment Pro | |||
<author initials="T" surname="Berners-Lee"></author> | tocol</title> | |||
<author initials="R" surname="Fielding"></author> | <author /> | |||
<author initials="L" surname="Masinter"></author> | <date month="January" year="2020"/> | |||
<date year='2005' month='January' /> | </front> | |||
</front> | <seriesInfo name="commit" value="7410332" /> | |||
<seriesInfo name='RFC' value='3986' /> | </reference> | |||
<format type='TXT' target='http://www.ietf.org/rfc/rfc3986.txt' /> | ||||
</reference> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.7296.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8551.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.2634.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.5035.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8446.xml"/> | ||||
</references> | ||||
</references> | </references> | |||
<references title="Informative References"> | ||||
<reference anchor='BCP56bis'> | <section anchor="background" numbered="true" toc="default"> | |||
<front> | <name>Background Notes</name> | |||
<title>Building Protocols with HTTP</title> | ||||
<author initials="M" surname="Nottingham"></author> | ||||
<date year='2018' month='November' /> | ||||
</front> | ||||
<!-- <seriesInfo name='RFC' value='XXXX' /> --> | ||||
<format type='TXT' target='https://tools.ietf.org/html/draft-ietf-httpbi | ||||
s-bcp56bis-08' /> | ||||
</reference> | ||||
<reference anchor='HTTP-certstore'> | ||||
<front> | ||||
<title>Internet X.509 Public Key Infrastructure Operational Protocols: | ||||
Certificate Store Access via HTTP</title> | ||||
<author initials="P" surname="Gutmann"></author> | ||||
<date year='2006' month='February' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='4387' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc4387.txt' /> | ||||
</reference> | ||||
<reference anchor="JSCEP" target="https://github.com/jscep/jscep"> | ||||
<front> | ||||
<title>A Java implementation of the Simple Certificate Enrolment Proto | ||||
col</title> | ||||
<author/> | ||||
<date/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor='IKEv2'> | ||||
<front> | ||||
<title>Internet Key Exchange (IKEv2) Protocol</title> | ||||
<!-- <author initials="C" surname="Kaufman"></author> | ||||
<author initials="P" surname="Hoffman"></author> | ||||
<author initials="Y" surname="Nir"></author> | ||||
<author initials="P" surname="Eronen"></author> | ||||
<author initials="T" surname="Kivinen"></author> --> | ||||
<author initials="D" surname="Alighieri"></author> | ||||
<!-- <date year='2005' month='December' /> --> | ||||
<date year='1300' month='March' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='7296' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc7296.txt' /> | ||||
</reference> | ||||
<reference anchor='SMIME'> | ||||
<front> | ||||
<title>Secure/Multipurpose Internet Mail Extensions (S/MIME) Version 3 | ||||
.2 Message Specification</title> | ||||
<author initials="B" surname="Ramsdell"></author> | ||||
<author initials="S" surname="Turner"></author> | ||||
<date year='2010' month='January' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='5751' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc5751.txt' /> | ||||
</reference> | ||||
<reference anchor='ESS'> | ||||
<front> | ||||
<title>Enhanced Security Services for S/MIME</title> | ||||
<author initials="P" surname="Hoffman"></author> | ||||
<date year='1999' month='June' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='2634' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc2634.txt' /> | ||||
</reference> | ||||
<reference anchor='ESSv2'> | ||||
<front> | ||||
<title>Enhanced Security Services (ESS) Update: Adding CertID Algorith | ||||
m Agility</title> | ||||
<author initials="J" surname="Schaad"></author> | ||||
<date year='2007' month='August' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='5035' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc5035.txt' /> | ||||
</reference> | ||||
<reference anchor='TLS'> | ||||
<front> | ||||
<title>The Transport Layer Security (TLS) Protocol Version 1.3</title> | ||||
<author fullname="Eric Rescorla" initials="E" surname="Rescorla"> | ||||
<organization>Mozilla</organization> | ||||
</author> | ||||
<date year='2018' month='August' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='8446' /> | ||||
<format type='TXT' target='http://www.ietf.org/rfc/rfc8446.txt' /> | ||||
</reference> | ||||
</references> | ||||
<!-- ====================================================================== | ||||
--> | ||||
<section anchor="background" title="Background Notes"> | ||||
<t> | <t> | |||
This specification has spent over twenty years in the draft stage. Its | This specification has spent over twenty years in the draft stage. Its | |||
original goal, provisioning IPsec routers with certificates, has long since | original goal, provisioning IPsec routers with certificates, has long since | |||
changed to general device/embedded system/IoT use. To fit this role, extra | changed to general device/embedded system/IoT use. To fit this role, extra | |||
features were bolted on in a haphazard manner through the addition of a | features were bolted on in a haphazard manner through the addition of a | |||
growing list of appendices and by inserting additional, often conflicting, | growing list of appendices and by inserting additional, often conflicting, | |||
paragraphs in various locations in the body text. Since existing features | paragraphs in various locations in the body text. Since existing features | |||
were never updated as newer ones were added, the specification accumulated | were never updated as newer ones were added, the specification accumulated | |||
large amounts of historical baggage over time. If OpenPGP was described as "a | large amounts of historical baggage over time. If OpenPGP was described as "a | |||
museum of 1990s crypto" then the SCEP draft was its graveyard. | museum of 1990s crypto", then the SCEP document was its graveyard. | |||
</t> | </t> | |||
<t> | <t> | |||
About five years ago the specification, which even at that point had seen only | About five years ago, the specification, which even at that point had seen only | |||
sporadic re-posts of the existing document, was more or less abandoned by its | sporadic reposts of the existing document, was more or less abandoned by its | |||
original sponsors. Due to its widespread use in large segments of the | original sponsors. Due to its widespread use in large segments of the | |||
industry, the specification was rebooted in 2015, cleaning up fifteen years | industry, the specification was rebooted in 2015, cleaning up fifteen years' | |||
worth of accumulated cruft, fixing errors, clarifying ambiguities, and | worth of accumulated cruft, fixing errors, clarifying ambiguities, and | |||
bringing the algorithms and standards used into the current century (prior to | bringing the algorithms and standards used into the current century (prior to | |||
the update, the de-facto lowest-common denominator algorithms used for | the update, the de facto lowest-common-denominator algorithms used for | |||
interoperability were the insecure forty-year-old single DES and broken MD5 | interoperability were the insecure forty-year-old single DES and broken MD5 | |||
hash algorithms). | hash algorithms). | |||
</t> | </t> | |||
<t> | <t> | |||
Note that although the text of the current specification has changed | Note that although the text of the current specification has changed | |||
significantly due to the consolidation of features and appendices into the | significantly due to the consolidation of features and appendices into the | |||
main document, the protocol that it describes is identical on the wire to the | main document, the protocol that it describes is identical on the wire to the | |||
original (with the unavoidable exception of the switch from single DES and MD5 | original (with the unavoidable exception of the switch from single DES and MD5 | |||
skipping to change at line 2968 ¶ | skipping to change at line 2622 ¶ | |||
indicator in GetCACaps and the failInfoText attribute, are both optional | indicator in GetCACaps and the failInfoText attribute, are both optional | |||
values and would be ignored by older implementations that don't support them, | values and would be ignored by older implementations that don't support them, | |||
or can be omitted from messages if they are found to cause problems. | or can be omitted from messages if they are found to cause problems. | |||
</t> | </t> | |||
<t> | <t> | |||
Other changes include: | Other changes include: | |||
</t> | </t> | |||
<t> | <ul> | |||
<li>Resolved contradictions in the text -- for example, a requirement | ||||
<list style="symbols"> | given as a <bcp14>MUST</bcp14> in one paragraph and a | |||
<bcp14>SHOULD</bcp14> in the next, a <bcp14>MUST NOT</bcp14> | ||||
<t>Resolved contradictions in the text, for example a requirement | in one paragraph and a <bcp14>MAY</bcp14> a few paragraphs later, a | |||
given as a MUST in one paragraph and a SHOULD in the next, a MUST | <bcp14>SHOULD NOT</bcp14> contradicted later by a <bcp14>MAY</bcp14>, and | |||
NOT | so on.</li> | |||
in one paragraph and a MAY a few paragraphs later, a SHOULD NOT | <li>Merged several later fragmentary addenda placed in appendices (for | |||
contradicted later by a MAY, and so on.</t> | example, the handling of certificate renewal) with the body of the | |||
text.</li> | ||||
<t>Merged several later fragmentary addenda placed in appendices | <li>Merged the "SCEP Transactions" and "SCEP Transport" sections, since | |||
(for | the | |||
example the handling of certificate renewal) with the body of the | ||||
text.</t> | ||||
<t>Merged the SCEP Transactions and SCEP Transport sections, sinc | ||||
e the | ||||
latter mostly duplicated (with occasional inconsistencies) the | latter mostly duplicated (with occasional inconsistencies) the | |||
former.</t> | former.</li> | |||
<li>Updated the algorithms to ones dating from at least this | ||||
<t>Updated the algorithms to ones dating from at least this | century.</li> | |||
century.</t> | <li>Did the same for normative references to other standards.</li> | |||
<li>Updated the text to use consistent terminology for the client and | ||||
<t>Did the same for normative references to other standards.</t> | ||||
<t>Updated the text to use consistent terminology for the client | ||||
and | ||||
CA rather than a mixture of client, requester, requesting system, end | CA rather than a mixture of client, requester, requesting system, end | |||
entity, server, certificate authority, certification authority, a nd | entity, server, certificate authority, certification authority, a nd | |||
CA.</t> | CA.</li> | |||
<li>Corrected incorrect references to other standards, e.g., | ||||
<t>Corrected incorrect references to other standards, e.g. | IssuerAndSerial -> IssuerAndSerialNumber.</li> | |||
IssuerAndSerial -> IssuerAndSerialNumber.</t> | <li>Corrected errors such as a statement that when both signature and | |||
<t>Corrected errors such as a statement that when both signature | ||||
and | ||||
encryption certificates existed, the signature certificate was us ed | encryption certificates existed, the signature certificate was us ed | |||
for encryption.</t> | for encryption.</li> | |||
<li>Condensed redundant discussions of the same topic spread across | ||||
<t>Condensed redundant discussions of the same topic spread acros | multiple sections into a single location. For example, the descr | |||
s | iption | |||
multiple sections into a single location. For example the descri | ||||
ption | ||||
of intermediate CA handling previously existed in three different | of intermediate CA handling previously existed in three different | |||
locations, with slightly different reqirements in each one.</t> | locations, with slightly different requirements in each one.</li> | |||
<li>Added a description of how pkiMessages were processed, which was | ||||
<t>Added a description of how pkiMessages were processed, which w | ||||
as | ||||
never made explicit in the original specification. This led to | never made explicit in the original specification. This led to | |||
creative interpretations that had security problems but were empl oyed | creative interpretations that had security problems but were empl oyed | |||
anyway due to the lack of specific guidance on what to do.</t> | anyway due to the lack of specific guidance on what to do.</li> | |||
<li>Relaxed some requirements that didn't serve any obvious purpose and | ||||
<t>Relaxed some requirements that didn't serve any obvious purpos | that major implementations didn't seem to be enforcing. For exam | |||
e and | ple, | |||
that major implementations didn't seem to be enforcing. For exam | ||||
ple | ||||
the requirement that the self-signed certificate used with a requ est | the requirement that the self-signed certificate used with a requ est | |||
MUST contain a subject name that matched the one in the PKCS #10 | <bcp14>MUST</bcp14> contain a subject name that matched the one i | |||
request was relaxed to a SHOULD because a number of implementatio | n the PKCS #10 | |||
ns | request was relaxed to a <bcp14>SHOULD</bcp14>, because a number | |||
of implementations | ||||
either ignored the issue entirely or at worst performed some mino r | either ignored the issue entirely or at worst performed some mino r | |||
action like creating a log entry after which they continued | action like creating a log entry, after which they continued | |||
anyway.</t> | anyway.</li> | |||
<li>Removed discussion of the transactionID from the security | ||||
<t>Removed discussion of the transactionID from the security | ||||
considerations, since the instructions there were directly | considerations, since the instructions there were directly | |||
contradicted by the discussion of the use of the transactionID in | contradicted by the discussion of the use of the transactionID in | |||
<xref target="state-trans"/>.</t> | <xref target="state-trans" format="default"/>.</li> | |||
<li>Added a requirement that the signed message include the signing | ||||
<t>Added a requirement that the signed message include the signin | ||||
g | ||||
certificate(s) in the signedData certificates field. This was | certificate(s) in the signedData certificates field. This was | |||
implicit in the original specification (without it, the message | implicit in the original specification (without it, the message | |||
couldn't be verified by the CA) and was handled by the fact that most | couldn't be verified by the CA) and was handled by the fact that most | |||
PKCS #7/CMS libraries do this by default, but was never explicitl y | PKCS #7/CMS libraries do this by default, but was never explicitl y | |||
mentioned.</t> | mentioned.</li> | |||
<li>Clarified sections that were unclear or even made no sense -- for | ||||
<t>Clarified sections that were unclear or even made no sense, fo | example, the requirement for a "hash on the public key" [sic] enc | |||
r | oded | |||
example the requirement for a "hash on the public key" [sic] enco | as a PrintableString.</li> | |||
ded | <li>Renamed "RA certificates" to "intermediate CA certificates". The | |||
as a PrintableString.</t> | ||||
<t>Renamed "RA certificates" to "intermediate CA certificates". | ||||
The | ||||
original document at some point added mention of RA certificates | original document at some point added mention of RA certificates | |||
without specifying how the client was to determine that an RA was in | without specifying how the client was to determine that an RA was in | |||
use, how the RA operations were identified in the protocol, or ho w it | use, how the RA operations were identified in the protocol, or ho w it | |||
was used. It's unclear whether what was meant was a true RA or m erely | was used. It's unclear whether what was meant was a true RA or m erely | |||
an intermediate CA, as opposed to the default practice of having | an intermediate CA, as opposed to the default practice of having | |||
certificates issued directly from a single root CA certificate. This | certificates issued directly from a single root CA certificate. This | |||
update uses the term "intermediate CA certificates", since this s eems | update uses the term "intermediate CA certificates", since this s eems | |||
to have been the original intent of the text.</t> | to have been the original intent of the text.</li> | |||
<li>Redid the PKIMessage diagram to match what was specified in CMS; | ||||
<t>Redid the PKIMessage diagram to match what was specified in CM | ||||
S, | ||||
the original diagram omitted a number of fields and nested data | the original diagram omitted a number of fields and nested data | |||
structures which meant that the diagram didn't match either the t | structures, which meant that the diagram didn't match either the | |||
ext | text | |||
or the CMS specification.</t> | or the CMS specification.</li> | |||
<li>Removed the requirement for a CertPoll to contain a recipientNonce, | ||||
<t>Removed the requirement for a CertPoll to contain a recipientN | ||||
once, | ||||
since CertPoll is a client message and will never be sent in resp onse | since CertPoll is a client message and will never be sent in resp onse | |||
to a message containing a senderNonce. See also the note in | to a message containing a senderNonce. See also the note in | |||
<xref target="CertRep"/>.</t> | <xref target="CertRep" format="default"/>.</li> | |||
<li>Clarified certificate renewal. This represents a capability that | ||||
<t>Clarified certificate renewal. This represents a capability t | was bolted onto the original protocol with (at best) vaguely defi | |||
hat | ned | |||
was bolted onto the original protocol with (at best) vaguely-defi | ||||
ned | ||||
semantics, including a requirement by the CA to guess whether a | semantics, including a requirement by the CA to guess whether a | |||
particular request was a renewal or not. In response to develope r | particular request was a renewal or not. In response to develope r | |||
feedback that they either avoided renewal entirely because of thi s | feedback that they either avoided renewal entirely because of thi s | |||
uncertainty or hardcoded in particular behaviour on a per-CA basi | uncertainty or hard-coded in particular behaviour on a per-CA bas | |||
s, | is, | |||
this specification explicitly identifies renewal requests as such | this specification explicitly identifies renewal requests as such | |||
, and | and | |||
provides proper semantics for them.</t> | provides proper semantics for them.</li> | |||
<li>Corrected the requirement that "undefined message types are treated | ||||
<t>Corrected the requirement that "undefined message types are tr | as an error", since this negates the effect of GetCACaps, which i | |||
eated | s used | |||
as an error" since this negates the effect of GetCACaps, which is | to define new message types. In particular, operations such as | |||
used | ||||
to define new message types. In particular operations such as | ||||
GetCACaps "Renewal" would be impossible if enforced as written, | GetCACaps "Renewal" would be impossible if enforced as written, | |||
because the Renewal operation was an undefined message type at th e | because the Renewal operation was an undefined message type at th e | |||
time.</t> | time.</li> | |||
<li>In line with the above, added IANA registries for several entries | ||||
<t>In line with the above, added IANA registries for several entr | that had previously been defined in an ad hoc manner in different | |||
ies | locations in the text.</li> | |||
that had previously been defined in an ad-hoc manner in different | <li>Added the "SCEPStandard" keyword to GetCACaps to indicate that the | |||
locations in the text.</t> | ||||
<t>Added the "SCEPStandard" keyword to GetCACaps to indicate that | ||||
the | ||||
CA complies with the final version of the SCEP standard, since th e | CA complies with the final version of the SCEP standard, since th e | |||
definition of what constitutes SCEP standards compliance has chan ged | definition of what constitutes SCEP standards compliance has chan ged | |||
significantly over the years.</t> | significantly over the years.</li> | |||
<li>Added the optional failInfoText attribute to deal with the fact | ||||
<t>Added the optional failInfoText attribute to deal with the fac | ||||
t | ||||
that failInfo was incapable of adequately communicating to client s why | that failInfo was incapable of adequately communicating to client s why | |||
a certificate request operation had been rejected.</t> | a certificate request operation had been rejected.</li> | |||
<li>Removed the discussion in the security considerations of revocation | ||||
<t>Removed the discussion in the security considerations of revoc | ||||
ation | ||||
issues, since SCEP doesn't support revocation as part of the | issues, since SCEP doesn't support revocation as part of the | |||
protocol.</t> | protocol.</li> | |||
<li>Clarified the use of nonces, which if applied as originally | ||||
<t>Clarified the use of nonces, which if applied as originally | ||||
specified would have made the use of polling in the presence of a lost | specified would have made the use of polling in the presence of a lost | |||
message impossible.</t> | message impossible.</li> | |||
<li>Removed the discussion of generating a given transactionID by | ||||
<t>Removed the discussion of generating a given transactionID by | ||||
hashing the public key, since this implied that there was some sp ecial | hashing the public key, since this implied that there was some sp ecial | |||
significance in the value generated this way. Since it was neith er a | significance in the value generated this way. Since it was neith er a | |||
MUST nor a MAY, it was unsound to imply that servers could rely o | <bcp14>MUST</bcp14> nor a <bcp14>MAY</bcp14>, it was unsound | |||
n the | to imply that servers could rely on the | |||
value being generated a certain way. In addition it wouldn't wor | value being generated a certain way. In addition, it wouldn't wo | |||
k if | rk if | |||
multiple transactions as discussed in <xref target="poll-resp"/> | multiple transactions as discussed in <xref target="poll-resp" | |||
were | format="default"/> were | |||
initiated, since the deterministic generation via hashing would l ead | initiated, since the deterministic generation via hashing would l ead | |||
to duplicate transactionIDs.</t> | to duplicate transactionIDs.</li> | |||
<li>Added examples of SCEP messages to give implementers something to | ||||
<t>Added examples of SCEP messages to give implementers something | aim for.</li> | |||
to | </ul> | |||
aim for.</t> | </section> | |||
</list> | <section anchor="ack" numbered="false" toc="default"> | |||
<name>Acknowledgements</name> | ||||
<t> | ||||
The editor would like to thank all of the previous editors, authors, and | ||||
contributors for their work maintaining the | ||||
document over the years: <contact fullname="Cheryl Madson"/>, <contact | ||||
fullname="Xiaoyi Liu"/>, <contact fullname="David McGrew"/>, <contact | ||||
fullname="David Cooper"/>, <contact fullname="Andy Nourse"/>, <contact fullname= | ||||
"Max | ||||
Pritikin"/>, <contact fullname="Jan Vilhuber"/>, and others. The IETF reviewers | ||||
provided | ||||
much useful feedback that | ||||
helped improve the document, and in particular spotted a number of things that | ||||
were present in SCEP through established practice rather than by being | ||||
explicitly described in the text. Numerous other people have contributed | ||||
during the long life cycle of the document, and all deserve thanks. In addition | ||||
, | ||||
several PKCS #7 / CMS libraries contributed to interoperability by doing the | ||||
right thing despite what earlier SCEP documents required. | ||||
</t> | ||||
<t> | ||||
The authors of earlier draft versions of this document would like to thank | ||||
<contact fullname="Peter William"/> of ValiCert, Inc. (formerly of VeriSign, | ||||
Inc.), <contact fullname="Alex Deacon"/> of | ||||
VeriSign, Inc., and <contact fullname="Christopher Welles"/> of IRE, Inc. for th | ||||
eir contributions to | ||||
early versions of this protocol and this document. | ||||
</t> | ||||
</section> | ||||
</t> | ||||
</section> | ||||
<!-- ====================================================================== | ||||
--> | ||||
</back> | </back> | |||
</rfc> | </rfc> | |||
End of changes. 452 change blocks. | ||||
2314 lines changed or deleted | 1974 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |