<?xml version="1.0"?>
<?xml-stylesheet type='text/xsl' href='./rfc2629.xslt' ?>

<?rfc toc="yes"?>
<?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 toc="yes"?>
<?rfc symrefs="yes"?>
<?rfc compact="no" ?>
<?rfc subcompact="yes" ?>
<?rfc sortrefs="yes" ?>
<rfc ipr="trust200902" docName="draft-gutmann-scep-04.txt" category="std">

  <!-- ======================================================================== -->
  <front>
    <title abbrev="SCEP">Simple Certificate Enrolment Protocol</title>
    <author initials="P." surname="Gutmann" fullname="Peter Gutmann">
      <organization abbrev="University of Auckland">University of Auckland</organization>
      <address>
        <postal>
          <street>Department of Computer Science</street>
          <city>Auckland</city>
          <country>New Zealand</country>
        </postal>
        <email>pgut001@cs.auckland.ac.nz</email>
      </address>
    </author>
    <author initials="M." surname="Pritikin" fullname="Max Pritikin">
      <organization abbrev="Cisco">Cisco Systems, Inc</organization>
    </author>
    <date year="2016"/>
    <area>Security Area</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>

This document specifies the Simple Certificate Enrolment Protocol (SCEP), a
PKI communication protocol that leverages existing technology by using 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 and server implementations, as well as being relied upon by
numerous other industry standards that work with certificates.

      </t>
    </abstract>
  </front>
  <!-- ======================================================================== -->
  <middle>

    <!-- ====================================================================== -->
    <section anchor="introduction" title="Introduction">
      <t>

X.509 certificates serve as the basis for several standards-based security
protocols in the IETF, such as <xref target="TLS">TLS</xref>, <xref
target="SMIME">S/MIME</xref>, and and <xref target="IKEv2">IKE/IPsec</xref>.
When an X.509 certificate is issued by other than the certificate subject (a
self-issued certificate), there typically is a need for a certificate
management protocol. Such a protocol enables a PKI client to request a
certificate, certificate renewal, or certificate update from a Certification
Authority (CA).

      </t>
      <t>

This specification defines a protocol, Simple Certificate Enrolment Protocol
(SCEP), for certificate management and certificate and CRL queries.  While
widely deployed, this protocol omits some certificate management features,
e.g. certificate revocation transactions, which can enhance the security
achieved in a PKI.  The IETF protocol suite currently includes two further
certificate management protocols with more comprehensive functionality: <xref
target="CMP">Certificate Management Protocol (CMP)</xref> and <xref
target="CMC">Certificate Management over CMS (CMC)</xref>.  Environments that
do not require interoperability with SCEP implementations MAY consider using
the above-mentioned certificate management protocols, however anyone
considering this step should be aware that the high level of complexity of
these two protocols has resulted in serious interoperability problems and
corresponding lack of industry support.  SCEP's simplicity, while being a
drawback in terms of its limited functionality, also makes deployment
relatively straightforward, so that it enjoys widespread support and ready
interoperability across a range of platforms. While implementers are
encouraged to investigate one of the more comprehensive alternative
certificate management protocols in addition to the protocol defined in this
specification, anyone wishing to deploy them should proceed with caution, and
consider support and interoperability issues before committing to their use.

      </t>
      <t>

The protocol supports the following general operations:

      </t>
      <t>

      <list style="symbols">

		<t>CA public key distribution.</t>

		<t>Certificate enrolment and issue.</t>

		<t>Certificate renewal/update.</t>

		<t>Certificate query.</t>

		<t>CRL query.</t>

      </list>

      </t>
      <t>

SCEP makes extensive use of <xref target="CMS">CMS</xref> and <xref
target="PKCS10">PKCS #10</xref>.

      </t>
      <section anchor="mustshouldmay" title="Conventions Used in This Document">
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
          "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
          document are to be interpreted as described in <xref target="RFC2119"/>.</t>
      </section>

    </section>
    <!-- ====================================================================== -->
    <section anchor="overview" title="SCEP Overview">
      <t>

This section provides a high level overview of the functionality of SCEP.

      </t>
      <section anchor="overview-entities" title="SCEP Entities">
        <t>

The entity types defined in SCEP are

        </t>
        <t>

        <list style="symbols">

		  <t>The client requesting a certificate (<xref
		     target="overview-client"/>).</t>

		  <t>The Certification Authority (CA) that issues the certificate
			 (<xref target="overview-ca"/>).</t>

        </list>

        </t>
        <section anchor="overview-client" title="Client">
          <t>

A client MUST have the following information locally configured:

          </t>
          <t>

          <list style="numbers">

			<t>The CA fully qualified domain name or IP address.</t>

			<t>The CA HTTP CGI script path (this usually has a default value,
			see <xref target="HTTP-GET-POST"/>).</t>

			<t>The identifying information that is used for authentication of
			the CA in <xref target="GetCACert-resp"/>, typically a certificate
			fingerprint.  This information MAY be obtained from the user, or
			presented to the user for manual authorization during the protocol
			exchange.  For example the user may indicate acceptance of a
			fingerprint via a user-interface element.</t>

          </list>

          </t>
		</section>
        <section anchor="overview-ca" title="Certification Authority">
          <t>

A SCEP Certification Authority (CA) is the entity that signs client
certificates.  A CA MAY enforce any arbitrary policies and apply them to
certification requests.  The CA MAY reject any request.

          </t>
          <t>

Since the client is expected to perform signature verification and optionally
encryption using the CA certificate, the keyUsage extension in the CA
certificate MUST indicate that it is valid for digitalSignature and
keyEncipherment (if required) alongside the usual CA usages of keyCertSign
and/or cRLSign.

          </t>
          <t>

If a client times out from polling for a pending request it can resynchronize
by reissuing the original request with the original subject name, key, and
transactionID.  The CA SHOULD return the status of the original transaction,
including the certificate if it was granted.

          </t>
		</section>
        <section anchor="overview-cert-dist" title="CA Certificate Distribution">
      	  <t>

If the CA certificate(s) have not previously been acquired by the client
through some other means, the client MUST retrieve the CA certificate(s)
before any PKI operation (<xref target="message-obj"/>) can be started.

          </t>
          <t>

Since no public key has yet been exchanged between the client and the CA, the
messages cannot be secured using CMS, and the data is instead transferred in
the clear.

          </t>
          <t>

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.
Otherwise the CA certificate itself is returned.  The transport protocol
(<xref target="SCEP-trans"/>) MUST indicate which one is returned.

          </t>
          <t>

The SCEP server CA certificate MAY be provided out-of-band to the SCEP client.
Alternatively, the CA certificate fingerprint MAY be used to authenticate a CA
Certificate distributed by the GetCACert response (<xref target="GetCACert"/>)
or via <xref target="HTTP-certstore">HTTP certificate-store access</xref>.
The 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
implementations).

          </t>
          <t>

After the client gets the CA certificate, it SHOULD authenticate the
certificate by comparing its fingerprint with the locally configured,
out-of-band distributed, identifying information.  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.  Clients SHOULD verify
intermediate-level CA certificate signatures using the issuing CA's
certificate before use during protocol exchanges.

          </t>
          <t>

Because a long time can pass between queries from a client to a CA and because
intermediate CA certificates can change over time, it is recommended that a
client not store intermediate CA certificates.  Instead, the client SHOULD
retrieve the CA certificates before each operation.

          </t>
	    </section>
	  </section>
      <section anchor="overview-req-auth" title="Client authentication">
        <t>

As with every protocol that uses public-key cryptography, the association
between the public keys used in the protocol and the identities with which
they are associated must be authenticated in a cryptographically secure
manner.  The communication between the client and the CA are secured using
SCEP Secure Message Objects as explained in <xref target="message-obj"/>,
which 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:

        </t>
        <t>

        <list style="numbers">

		  <t>If the client does not have an appropriate existing certificate
		  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 required).  The
		  self-signed certificate SHOULD use the same subject name as in the
		  PKCS #10 request.  In this case the messageType is PKCS10Req (see
		  <xref target="messageType"/>).</t>

		  <t>If the requesting system already has a certificate issued by the
		  SCEP CA, and the CA supports renewal (see <xref
		  target="overview-cert-enrol"/>), that certificate SHOULD be used.
		  In this case the messageType is RenewalReq (see <xref
		  target="messageType"/>).</t>

		  <t>If the requesting system has no certificate issued by the new CA,
		  but has credentials from an alternate CA the certificate issued by
		  the alternate CA MAY be used.  Policy settings on the new CA will
		  determine if the request can be accepted or not. This is useful when
		  enrolling with a new administrative domain using a certificate from
		  the old domain as credentials.  In this case the messageType is
		  UpdateReq (see <xref target="messageType"/>).</t>

        </list>

        </t>
        <t>

Note that although the above text describes three different types of
operations, in practice most implementations always apply the first one even
if an existing certificate already exists.  For this reason support for the
first case is mandatory while support for the latter two are optional (see
<xref target="MTI"/>).

        </t>
        <t>

During the certificate enrolment process, the client MUST use the selected
certificate's key when signing the CMS envelope (see <xref
target="message-obj"/>).  This certificate will be either the self-signed one
matching the PKCS #10 request or the CA-issued one used to authorise a renewal
or update. If the key being certified allows encryption then the CA's CertResp
will use the same certificate's public key when encrypting the response.

        </t>
        <t>

Note that this means that, in the case of renewal and update operations, the
request is signed with, and the returned response may be encrypted with, the
key in the previously-issued certificate used to authenticate the request, not
the key in the PKCS #10 request.  This has security implications, see <xref
target="security-no-pop"/>.

        </t>
	  </section>
      <section anchor="overview-enrol-auth" title="Enrolment authorization">
        <t>

<xref target="PKCS10">PKCS #10</xref> specifies a <xref target="PKCS9">PKCS
#9</xref> challengePassword attribute to be sent as part of the enrolment
request.  When utilizing the challengePassword, the CA distributes a shared
secret to the client which will uniquely associate the enrolment request with
the client.

        </t>
        <t>

Inclusion of the challengePassword by the SCEP client is OPTIONAL and allows
for unauthenticated authorization of enrolment requests (which, however,
requires manual approval of each certificate issue, see below), or for renewal
or update requests which are authenticated by being signed with an existing
certificate.  The CMS envelope protects the privacy of the challengePassword.

        </t>
        <t>

A client that is performing certificate renewal or update as per <xref
target="overview-cert-enrol"/> SHOULD omit the challengePassword but MAY send
the originally distributed password in the challengePassword attribute.  In
the former case the SCEP CA MUST authenticate the request based on the
certificate used to sign the renewal or update request.  In the latter case
the SCEP CA MAY use either the challengePassword or the previously issued
certificate (or both), depending on CA policy, to authenticate the request.
The SCEP CA MUST NOT attempt to authenticate a client based on a self-signed
certificate unless it has been verified through out-of-band means such as a
certificate fingerprint.

        </t>
        <t>

To perform the authorization in manual mode the client's messages are placed
in the PENDING state until the CA operator authorizes or rejects them.  Manual
authorization 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
not available.  The SCEP CA MAY either reject unauthorized certification
requests or mark them for manual authorization according to CA policy.

        </t>
	  </section>
      <section anchor="overview-cert-enrol" title="Certificate Enrolment/Renewal/Update">
        <t>

A client starts an enrolment transaction (<xref target="PKCSReq"/>) by
creating a certificate request using PKCS #10 and sends it to the CA enveloped
using CMS (<xref target="message-obj"/>).

	    </t>
	    <t>

If the CA supports certificate renewal or update then a new certificate with
new validity dates can be issued, even though the old one is still valid, if
the CA policy permits.  The CA MAY automatically revoke the old client
certificate.  To renew or update an existing certificate, the client uses the
RenewalReq or UpdateReq message (see <xref target="pkiMessage-types"/>) and
signs it with the existing client certificate.  The client SHOULD use a new
keypair when requesting a new certificate, but MAY request a new certificate
using the old keypair.

        </t>
        <t>

If the CA returns a CertRep message (<xref target="CertRep"/>) with status set
to PENDING, the client enters into polling mode by periodically sending a
CertPoll message (<xref target="CertPoll"/>) to the CA until the CA operator
completes the manual authentication (approving or denying the request).

        </t>
        <t>

If polling mode is being used then the client will send a single
PKCSReq/RenewalReq/UpdateReq message (<xref target="PKCSReq"/>), followed by 0
or more CertPoll messages (<xref target="CertPoll"/>).  The CA will in return
send 0 or more CertRep messages (<xref target="CertRep"/>) with status set to
PENDING in response to CertPolls, followed by a single CertRep message (<xref
target="CertRep"/>) with status set to either SUCCESS or FAILURE.

        </t>
		<section anchor="overview-client-state" title="Client State Transitions">
		  <t>

The client state transitions during the SCEP process are indicated in <xref
target="state-diagram"/>.

		  </t>
		  <figure anchor="state-diagram" title="State Transition Diagram">
			<artwork><![CDATA[

                                CertPoll
                              +-----<----+
                              |          | CertRep(PENDING) or
                              |          | CertPoll timeout
                              |          |
[CERT-NONEXISTENT] ------> [CERT-REQ-PENDING] ---------> [CERT-ISSUED]
      ^            PKCSReq    |           CertRep(SUCCESS)
      |          RenewalReq   |
      |           UpdateReq   |
      |                       |
      +-----------------------+
      CertRep(FAILURE) or
      Max-time/max-polls exceeded

			]]></artwork>
		  </figure>
		  <t>

The certificate issue process starts at the state CERT-NONEXISTENT.  Sending a
PKCSReq/RenewalReq/UpdateReq message changes the state to CERT-REQ-PENDING.

		  </t>
		  <t>

If the CA returns a CertRep message with pkiStatus set to SUCCESS then the
state changes to CERT-ISSUED.

		  </t>
		  <t>

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.

		  </t>
		  <t>

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
message with status set to SUCCESS or FAILURE is received or a timeout occurs
or the maximum number of polls has been exceeded.

		  </t>
		  <figure>
		  	<preamble>A successful transaction in automatic mode:</preamble>
			<artwork><![CDATA[

    CLIENT                              CA SERVER

PKCSReq: PKI cert. enrolment message
--------------------------------> CertRep: pkiStatus = SUCCESS
                                  Certificate attached
                                  <------------------------------
Receive issued certificate.

			]]></artwork>
		  </figure>

		  <figure>
		  	<preamble>A successful transaction in manual mode:</preamble>
			<artwork><![CDATA[

    CLIENT                              CA SERVER

PKCSReq: PKI cert. enrolment message
--------------------------------> CertRep: pkiStatus = PENDING
                                  <------------------------------
CertPoll: Polling message
--------------------------------> CertRep: pkiStatus = PENDING
                                  <------------------------------
................ <Manual identity authentication> ...............

CertPoll: Polling message
--------------------------------> CertRep: pkiStatus = SUCCESS
                                  Certificate attached
                                  <------------------------------
Receive issued certificate.

			]]></artwork>
		  </figure>
		</section>
	  </section>
      <section anchor="overview-cert-access" title="Certificate Access">
        <t>

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
certificates locally to obtain a copy when needed.  This functionality is not
intended to provide a general purpose certificate access service, which may be
achieved via <xref target="HTTP-certstore">HTTP certificate-store
access</xref> or LDAP.

        </t>
        <t>

To query 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 has
saved the issuer name and the serial number of the issued certificate from the
previous enrolment transaction.  The transaction to query a certificate
consists of one GetCert (<xref target="GetCert"/>) message and one CertRep
(<xref target="CertRep"/>) message, as shown below.

        </t>
		<figure>
		  <artwork><![CDATA[

   CLIENT                               CA SERVER

GetCert: PKI certificate query message
-------------------------------> CertRep: pkiStatus = SUCCESS
                                 Certificate attached
                                 <-----------------------------
Receive the certificate.

		  ]]></artwork>
		</figure>
	  </section>
      <section anchor="overview-CRL-access" title="CRL Access">
        <t>

SCEP clients MAY request a CRL via one of three methods:

        </t>
        <t>

        <list style="numbers">

		  <t>If the CA supports <xref target="PKIX">CRL Distribution Points
		  (CRLDPs)</xref>, then the CRL MAY be retrieved via the mechanism
		  specified in the CRDLP.</t>

		  <t>If the CA supports <xref target="HTTP-certstore">HTTP
		  certificate-store access</xref>, then the CRL MAY be retrieved via
		  the <xref target="PKIX">AuthorityInfoAcces</xref> location specified
		  in the certificate.</t>

		  <t>Only if the CA does not support CRDLPs or HTTP access should a
		  CRL query be composed by creating a GetCRL message consisting of the
		  issuer name and serial number from the certificate whose revocation
		  status is being queried.</t>

		</list>

		</t>
		<t>

The CA SHOULD NOT support the GetCRL method because it does not scale well
due to the unnecessary cryptography (see <xref target="security"/>) and it
requires the CA to be a high-availability service.

		</t>
		<t>

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
CertRep PKI message, which contains only the CRL (no certificates) in a
degenerate certificates-only CMS Signed-Data message
(<xref target="certs-only"/>), as shown below.

		</t>
		<figure>
		  <artwork><![CDATA[


       CLIENT                           CA SERVER

   GetCRL: PKI CRL query message
---------------------------------->
                                  CertRep: CRL attached
                                  <-----------------------------
Receive the CRL

		  ]]></artwork>
		</figure>
	  </section>
      <section anchor="overview-cert-rev" title="Certificate Revocation">
        <t>

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
mechanism.

		</t>
	  </section>
      <section anchor="MTI" title="Mandatory-to-Implement Functionality">
        <t>

At a minimum, all SCEP implementations compliant with this specification MUST
support <xref target="CA-caps-HTTP">GetCACaps</xref>, <xref
target="GetCACert"> GetCACert</xref>, <xref target="PKCSReq">PKCSReq</xref>
(and its associated response messages), communication of binary data via <xref
target="HTTP-GET-POST">HTTP POST</xref>, and the AES and SHA-256 algorithms to
secure <xref target="pkiMessage">pkiMessages</xref>.

        </t>
        <t>

For historical reasons implementations MAY support communications of binary
data via <xref target="HTTP-GET-POST">HTTP GET</xref>, and the triple DES and
SHA-1 algorithms to secure <xref target="pkiMessage">pkiMessages</xref>.

		</t>
	  </section>
	</section>
    <!-- ====================================================================== -->
    <section anchor="message-obj" title="SCEP Secure Message Objects">
	  <t>

CMS is a general enveloping mechanism that enables both signed and encrypted
transmission of arbitrary data.  SCEP messages that require confidentiality
use two layers of CMS, as shown in <xref target="cms-layering"/>.  By applying
both enveloping and signing transformations, the SCEP message is protected
both for the integrity of its end-to-end transaction information and the
confidentiality of its information portion.  Some messages do not require
enveloping, in which case the EnvelopedData in <xref target="cms-layering"/>
is omitted.

	  </t>
	  <figure anchor="cms-layering" title="CMS Layering">
		<artwork><![CDATA[

pkiMessage {
  contentType = signedData { pkcs-7 2 },
  content {
    digestAlgorithms,
    encapsulatedContentInfo {
      eContentType = data { pkcs-7 1 },
      eContent {           -- pkcsPKIEnvelope, optional
        contentType = envelopedData { pkcs-7 3 },
        content {
          recipientInfo,
          encryptedContentInfo {
            contentType = data { pkcs-7 1 },
            contentEncrAlgorithm,
            encryptedContent {
              messageData  -- Typically PKCS #10 request
              }
            }
          }
        }
      },
    certificates,          -- Optional
    crls,                  -- Optional
    signerInfo {
      signedAttrs {
        transactionID,
        messageType,
        pkiStatus,
        failInfo,          -- Optional
        senderNonce / recipientNonce,
        },
      signature
      }
    }
  }

		]]></artwork>
	  </figure>
      <t>

When a particular SCEP message carries data, this data is carried in the
messageData.  CertRep messages will lack any signed content and consist only
of a pkcsPKIEnvelope (<xref target="pkcsPKIEnvelope"/>).

	  </t>
      <t>

The remainder of this document will refer only to 'messageData', but it is
understood to always be encapsulated in the pkcsPKIEnvelope (<xref
target="pkcsPKIEnvelope"/>).  The format of the data in the messageData is
defined by the messageType attribute (see <xref target="pkiMessage"/>) of the
Signed-Data.  If there is no messageData to be transmitted, the entire
pkcsPKIEnvelope MUST be omitted.

	  </t>
	  <section anchor="message-processing" title="SCEP Message Object Processing">
		<t>

Creating a SCEP message consists of several stages.  The content to be
conveyed (in other words the messageData) is first encrypted, and the
encrypted content is then signed.

		</t>
		<t>

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)
then the messageData is encrypted using the recipient's public key with the
CMS KeyTransRecipientInfo mechanism.  If the key is not encryption-capable
(for example ECDSA) then the messageData is encrypted using the
challengePassword with the CMS PasswordRecipientInfo mechanism.

		</t>
		<t>

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.

		</t>
		<t>

Note that some earlier implementations of this specification dealt with
non-encryption-capable keys by omitting the encryption stage, based on the
text in <xref target="message-obj"/> that indicated that "the EnvelopedData is
omitted".  This alternative processing mechanism SHOULD NOT be used since it
exposes the challengePassword used to authorise the certificate issue.

		</t>
		<t>

		</t>
	  </section>
	  <section anchor="pkiMessage" title="SCEP pkiMessage">
		<t>

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
apply:

		</t>
		<t>

		<list style="symbols">

		  <t>The eContentType in encapsulatedContentInfo MUST be data ({pkcs-7
		     1}).</t>

		  <t>The signed content, if present (FAILURE and PENDING CertRep
			 messages will lack any signed content), MUST be a pkcsPKIEnvelope
			 (<xref target="pkcsPKIEnvelope"/>), and MUST match the
			 messageType attribute.</t>

		  <t>The SignerInfo MUST contain a set of authenticatedAttributes (see
			 CMS as well as <xref target="signed-attrs"/> in this
			 document).</t>

		</list>
		</t>

		<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"/>).</t>

		  <t>Any attributes required by CMS.</t>

		</list>

		</t>
		<t>

If the message is a CertRep, it MUST also include the following
authenticatedAttributes:

		</t>
		<t>

		<list style="symbols">

		  <t>A pkiStatus attribute (see <xref target="pkiStatus"/>).</t>

		  <t>A failInfo attribute (see <xref target="failInfo"/>) if pkiStatus
			 = FAILURE.</t>

		  <t>A recipientNonce attribute (see <xref target="nonces"/>) copied
			 from the senderNonce in the request that this is a response
			 to.</t>

		</list>

		</t>
		<section anchor="signed-attrs" title="Signed Transaction Attributes">
		  <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 for 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>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 as 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-attributes
			   transactionID(7)}</c>

			<c>id-messageType</c><c>OBJECT_IDENTIFIER ::= {id-attributes
			   messageType(2)}</c>

			<c>id-pkiStatus</c><c>OBJECT_IDENTIFIER ::= {id-attributes
			   pkiStatus(3)}</c>

			<c>id-failInfo</c><c>OBJECT_IDENTIFIER ::= {id-attributes
			   failInfo(4)}</c>

			<c>id-senderNonce</c><c>OBJECT_IDENTIFIER ::= {id-attributes
			   senderNonce(5)}</c>

			<c>id-recipientNonce</c><c>OBJECT_IDENTIFIER ::= {id-attributes
				recipientNonce(6)}</c>

		  </texttable>
		  <t>

The attributes are detailed in the following sections.

		  </t>
		  <section anchor="transactionID" title="transactionID">
			<t>

A PKI operation is a transaction consisting of the messages exchanged between
a client and the CA.  The transactionID is a text string generated by the
client when starting a transaction.  The client MUST generate a unique string
as the transaction identifier, encoded as a PrintableString, which MUST be
used for all PKI messages exchanged for a given operation such as a
certificate issue.

			</t>
		  </section>
		  <section anchor="messageType" title="messageType">
			<t>

The messageType attribute specifies the type of operation performed by the
transaction.  This attribute MUST be included in all PKI messages.  The
following message types are defined:

			</t>
			<t>

			<list style="symbols">

			  <t>CertRep ("3") -- Response to certificate or CRL request.</t>

			  <t>RenewalReq ("17") -- PKCS #10 certificate request for renewal
			     of an existing certificate.</t>

			  <t>UpdateReq ("18") -- PKCS #10 certificate request for update
			     of a certificate issued by a different CA.</t>

			  <t>PKCSReq ("19") -- PKCS #10 certificate request.</t>

			  <t>CertPoll ("20") -- Certificate polling in manual enrolment.</t>

			  <t>GetCert ("21") -- Retrieve a certificate.</t>

			  <t>GetCRL ("22") -- Retrieve a CRL.</t>

			</list>

			</t>
			<t>

Undefined message types MUST BE treated as an error.

			</t>
		  </section>
		  <section anchor="pkiStatus" title="pkiStatus">
			<t>

All response messages MUST include transaction status information, which is
defined as a pkiStatus attribute:

			</t>
			<t>

			<list style="symbols">

			  <t>SUCCESS ("0") -- Request granted.</t>

			  <t>FAILURE ("2") -- Request rejected.  In this case the failInfo
				 attribute, as defined in <xref target="failInfo"/>, MUST also
				 be present.</t>

			  <t>PENDING ("3") -- Request pending for manual approval.</t>

			</list>

			</t>
			<t>

Undefined pkiStatus attributes MUST be treated as an error.

			</t>
		  </section>
		  <section anchor="failInfo" title="failInfo">
			<t>

The failInfo attribute MUST contain one of the following failure reasons:

			</t>
			<t>

			<list style="symbols">

			  <t>badAlg ("0") -- Unrecognized or unsupported algorithm.</t>

			  <t>badMessageCheck ("1") -- Integrity check (meaning signature
				 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 close to the
				 system time (this failure code is present for legacy reasons
				 and is unlikely to be encountered in practice).</t>

			  <t>badCertId ("4") -- No certificate could be identified
				 matching the provided criteria.</t>

			</list>

			</t>

<figure><artwork><![CDATA[
    [Question: Is there any demand for a free-form UTF8String
     attribute to explain what really went wrong?  Trying to sort
     out an error when all you ever get back is the near-universal
     badRequest is almost impossible, adding a failInfoText
     attribute to address this could be quite useful since it
     would allow expressing information such as a failure to meet
     CA policy, or indeed anything more complex than "no go away"].
]]></artwork></figure>

			<t>

Undefined failInfo attributes are treated as an error.

			</t>
		  </section>
		  <section anchor="nonces" title="senderNonce and recipientNonce">
			<t>

The attributes of senderNonce and recipientNonce are a 16 byte random number
generated for each transaction.  These are intended to prevent replay attacks.

			</t>
			<t>

When a sender sends a PKI message to a recipient, a fresh senderNonce MUST be
included in the message.  The recipient MUST copy the senderNonce into the
recipientNonce of the reply as a proof of liveliness.  The original sender
MUST verify that the recipientNonce of the reply matches the senderNonce it
sent in the request.  If the nonce does not match, the message MUST be
rejected.

			</t>
			<t>

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
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
senderNonce in the client's request and recipientNonce in the CA's reply.


			</t>
		  </section>
		</section>
		<section anchor="pkcsPKIEnvelope" title="SCEP pkcsPKIEnvelope">
		  <t>

The information portion of a SCEP message is carried inside an EnvelopedData
content type, as defined in CMS, with the following restrictions:

		  </t>
		  <t>

		  <list style="symbols">

			<t>contentType in encryptedContentInfo MUST be data ({pkcs-7
			   1}).</t>

			<t>encryptedContent MUST be the SCEP message being transported
			   (see <xref target="SCEP-trans"/>), and must match the
			   messageType authenticated Attribute in the pkiMessage.</t>

		  </list>

		  </t>
		</section>
	  </section>
	  <section anchor="pkiMessage-types" title="SCEP pkiMessage types">
		<t>

All of the messages in this section are pkiMessages (<xref
target="pkiMessage"/>), where the type of the message MUST be specified in the
'messageType' authenticated Attribute.  Each section defines a valid message
type, the corresponding messageData formats, and mandatory authenticated
attributes for that type.

		</t>
		<section anchor="PKCSReq" title="PKCSReq/RenewalReq/UpdateReq">
		  <t>

The messageData for this type consists of a PKCS #10 Certification Request.
The certification request MUST 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 password is being
			used, a challengePassword attribute.</t>

		  </list>

		  </t>
		  <t>

In addition to the authenticatedAttributes required for a valid CMS message,
the pkiMessage MUST include the following attributes:

		  </t>
		  <t>

		  <list style="symbols">

			<t>A transactionID attribute (<xref target="transactionID"/>).</t>

			<t>A messageType attribute (<xref target="messageType"/>) set to
			   PKCSReq, RenewalReq, or UpdateReq as appropriate.</t>

			<t>A fresh senderNonce attribute (<xref target="nonces"/>).</t>

		  </list>

		  </t>
		</section>
		<section anchor="CertRep" title="CertRep">
		  <t>

The messageData for this type consists of a degenerate certificates-only CMS
Signed-Data message (<xref target="certs-only"/>). The exact content required
for the reply depends on the type of request this message is a response to.
The request types are detailed in <xref target="CertRep-success"/> and in
<xref target="SCEP-trans"/>.

		  </t>
		  <t>

In addition to the authenticatedAttributes required for a valid CMS message,
this pkiMessage MUST include the following attributes:

		  </t>
		  <t>

		  <list style="symbols">

			<t>The transactionID attribute (<xref target="transactionID"/>)
			   copied from the request that this is a response to.</t>

		    <t>A messageType attribute (<xref target="messageType"/>) set to
			   CertRep.</t>

		    <t>A recipientNonce attribute (<xref target="nonces"/>) copied
			   from the senderNonce in the request that this is a response
			   to.</t>

		    <t>A pkiStatus attribute (<xref target="pkiStatus"/>) set to the
			   status of the reply.</t>

		  </list>

		  </t>
		  <t>

Earlier versions of this specification required that this message include a
senderNonce alongside the recipientNonce, which was to be used to chain to
subsequent polling operations.  However if a single message was lost during
the potentially extended interval over which polling could take place (see
<xref target="state-trans"/> for an example of this) then if the
implementation were to enforce this requirement the overall transaction would
fail even though nothing had actually gone wrong.  Because of this issue,
implementations mostly ignored the requirement to carry this nonce over to
subsequent polling messages or to verify its presence.  Current versions of
the specification no longer require the chaining of nonces across polling
operations.

		  </t>
		  <section anchor="CertRep-success" title="CertRep SUCCESS">
		    <t>

When the pkiStatus attribute is set to SUCCESS, the messageData for this
message consists of a degenerate certificates-only CMS Signed-Data message
(<xref target="certs-only"/>).  The content of this degenerate
certificates-only Signed-Data depends on what the original request was, as
outlined below.

		    </t>
			<texttable align="left">

			  <ttcol>Request-type</ttcol>
			  <ttcol>Reply-contents</ttcol>

			  <c>PKCSReq</c><c>The reply MUST contain at least the issued
				 certificate in the certificates field of the Signed-Data.
				 The reply MAY contain additional certificates, but the issued
				 certificate MUST be the leaf certificate.</c>

			  <c>RenewalReq</c><c>Same as PKCSReq</c>

			  <c>UpdateReq</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 requested
				 certificate in the certificates field of the Signed-Data.
				 The reply MAY contain additional certificates, but the
				 requested certificate MUST be the leaf certificate.</c>

			  <c>GetCRL</c><c>The reply MUST contain the CRL in the crls field
				 of the Signed-Data.</c>

			</texttable>
		  </section>
		  <section anchor="CertRep-failure" title="CertRep FAILURE">
		    <t>

When the pkiStatus attribute is set to FAILURE, the reply MUST also contain a
failInfo (<xref target="failInfo"/>) attribute set to the appropriate error
condition describing the failure.  The pkcsPKIEnvelope (<xref
target="pkcsPKIEnvelope"/>) MUST be omitted.

		    </t>
		  </section>
		  <section anchor="CertRep-pending" title="CertRep PENDING">
		    <t>

When the pkiStatus attribute is set to PENDING, the pkcsPKIEnvelope (<xref
target="pkcsPKIEnvelope"/>) MUST be omitted.

		    </t>
		  </section>
	    </section>
	    <section anchor="CertPoll" title="CertPoll (GetCertInitial)">
		  <t>

This message is used for certificate polling.  For unknown reasons it was
referred to as "GetCertInitial" in earlier versions of this specification.
The messageData for this type consists of an IssuerAndSubject:

	      </t>

		  <figure>
			<artwork><![CDATA[

issuerAndSubject ::= SEQUENCE {
    issuer Name,
    subject Name
    }

			]]></artwork>
		  </figure>

		  <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
the subjectName used when requesting the certificate.

		  </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
that the message is sent to) and the client/transaction being polled is
identified by the transactionID.  Both of these fields can be processed by the
CA without having to unwrap and process the issuerAndSubject.  For this reason
implementations SHOULD assume that the polling operation will be controlled by
the recipientInfo and transactionID rather than the contents of the
messageData.

		  </t>
		  <t>

In addition to the authenticatedAttributes required for a valid CMS message,
this pkiMessage MUST include the following attributes:

		  </t>
		  <t>

		  <list style="symbols">

		    <t>The same transactionID (<xref target="transactionID"/>)
			   attribute from the original PKCSReq/RenewalReq/UpdateReq
			   message.</t>

		    <t>A messageType attribute (<xref target="messageType"/>) set to
			   CertPoll.</t>

		    <t>A fresh senderNonce attribute (<xref target="nonces"/>).</t>

		  </list>

		  </t>
	    </section>
	    <section anchor="GetCert" title="GetCert">
		  <t>

The messageData for this type consists of an IssuerAndSerialNumber as defined
in CMS which uniquely identifies the certificate being requested.  In addition
to the authenticatedAttributes required for a valid CMS message, this
pkiMessage MUST include the following attributes:

		  </t>
		  <t>

		  <list style="symbols">

		    <t>A transactionID attribute (<xref target="transactionID"/>).</t>

		    <t>A messageType attribute (<xref target="messageType"/>) set to
			   GetCert.</t>

		    <t>A fresh senderNonce attribute (<xref target="nonces"/>).</t>

		  </list>

		  </t>
		  <t>

A self-signed certificate MAY be used in the signed envelope.  This enables
the client to request their own certificate if they were unable to store it
previously.

		  </t>
		  <t>

This message type, while included here for completeness, applies unnecessary
cryptography and messaging overhead to the simple task of transferring a
certificate.  Implementations SHOULD prefer <xref target="HTTP-certstore">
HTTP certificate-store access</xref> or LDAP over the use of this message.

		  </t>
	    </section>
	    <section anchor="GetCRL" title="GetCRL">
		  <t>

The messageData for this type consists of a IssuerAndSerialNumber as defined
in CMS containing the issuer name and serial number of the certificate whose
revocation status is being checked.

		  </t>
		  <t>

In addition to the authenticatedAttributes required for a valid CMS message,
this pkiMessage MUST include the following attributes:

		  </t>
		  <t>

		  <list style="symbols">

		    <t>A transactionID attribute (<xref target="transactionID"/>).</t>

		    <t>A messageType attribute (<xref target="messageType"/>) set to
			   GetCRL.</t>

		    <t>A fresh senderNonce attribute (<xref target="nonces"/>).</t>

		  </list>

		  </t>
		  <t>

This message type, while included here for completeness, applies unnecessary
cryptography and messaging overhead to the simple task of transferring a CRL.
Implementations SHOULD prefer <xref target="HTTP-certstore"> HTTP
certificate-store access</xref> or LDAP over the use of this message.

		  </t>
	    </section>
	  </section>
      <section anchor="certs-only" title="Degenerate certificates-only CMS Signed-Data">
	    <t>

CMS includes a degenerate case of the Signed-Data content type in which there
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
a degenerate certificates-only Signed-Data MUST be omitted.

	    </t>
	    <t>

When carrying certificates, the certificates are included in the
'certificates' field of the Signed-Data.  When carrying a CRL, the CRL is
included in the 'crls' field of the Signed-Data.

	    </t>
	  </section>
      <section anchor="CA-caps" title="CA Capabilities">
        <t>

In order to provide support for future enhancements to the protocol, CAs MUST
implement the GetCACaps message to allow clients to query which functionality
is available from the CA.

        </t>
	    <section anchor="CA-caps-HTTP" title="GetCACaps HTTP Message Format">

		  <figure>
		    <preamble>This message requests capabilities from a CA, with the
					  format:</preamble>
		    <artwork><![CDATA[

"GET" CGI-PATH CGI-PROG "?operation=GetCACaps"

		    ]]></artwork>
		  </figure>

		  <t>

with the message components as described in <xref target="SCEP-trans"/>.

		  </t>
	    </section>
	    <section anchor="CA-caps-resp" title="CA Capabilities Response Format">

		  <texttable align="left">
		    <preamble>The response for a GetCACaps message is a list of CA
					  capabilities, in plain text, separated by
					  &lt;CR&gt;&lt;LF&gt; or &lt;LF&gt; characters, as
					  follows (quotation marks are NOT sent):</preamble>
		    <ttcol>Keyword</ttcol>
		    <ttcol>Description</ttcol>

		    <c>"AES"</c><c>CA supports the AES encryption algorithm.</c>

		    <c>"DES3"</c><c>CA supports the triple DES encryption
			   algorithm.</c>

		    <c>"GetNextCACert"</c><c>CA supports the GetNextCACert
				message.</c>

		    <c>"POSTPKIOperation"</c><c>CA supports PKIOPeration messages sent
			   via HTTP POST.</c>

		    <c>"Renewal"</c><c>CA supports the Renewal CA operation.</c>

		    <c>"SHA-1"</c><c>CA supports the SHA-1 hashing algorithm.</c>

		    <c>"SHA-256"</c><c>CA supports the SHA-256 hashing algorithm.</c>

		    <c>"SHA-512"</c><c>CA supports the SHA-512 hashing algorithm.</c>

		    <c>"SCEPStandard"</c><c>CA supports all mandatory-to-implement
			sections of the SCEP standard.  This keyword implies "AES",
			"POSTPKIOperation", and "SHA-256", as well as the provisions of
			<xref target="MTI"/>.</c>

		    <c>"Update"</c><c>CA supports the Update CA operation.</c>

		  </texttable>

		  <t>

The client SHOULD use SHA-256 in preference to SHA-1 hashing and AES in
preference to triple DES if they are supported by the CA.  Although the CMS
format allows any form of SHA-2 and AES to be specified, in the interests of
interoperability the de facto universal standards of AES128-CBC and SHA-256
SHOULD be used.

		  </t>
		  <t>

Announcing some of these capabilities individually is redundant since they're
required as mandatory-to-implement functionality (see <xref target="MTI"/>)
whose presence as a whole is signalled by the "SCEPStandard" capability, but
it may be useful to announce them in order to deal with old implementations
that would otherwise default to obsolete, insecure algorithms and mechanisms.

		  </t>
		  <t>

The CA MUST use the text case specified here, but clients SHOULD ignore the
text case when processing this message.  Clients MUST accept the standard
HTTP-style &lt;CR&gt;&lt;LF&gt;-delimited text as well as the &lt;LF&gt;-
delimited text specified in an earlier version of this specification.  A
client MUST be able to accept and ignore any unknown keywords that might be
sent back by a CA.

		  </t>
		  <t>

If the CA supports none of the above capabilities it SHOULD return an empty
message.  A CA MAY simply return an HTTP error.  A client that receives an
empty message or an HTTP error SHOULD interpret the response as if none of the
requested capabilities are supported by the CA.

		  </t>
		  <t>

(Note that at least one widely-deployed server implementation supports several
of the above operations but doesn't support the GetCACaps message to indicate
that it supports them.  This means that the equivalent of GetCACaps must be
performed through server fingerprinting, which can be done using the ID string
"Microsoft-IIS").

		  </t>
		  <t>

The Content-type of the reply SHOULD be "text/plain".  Clients SHOULD ignore
the Content-type, as older implementations of SCEP may send various
Content-types.

		  </t>
		  <figure>
		    <preamble>Example:</preamble>
		    <artwork><![CDATA[

GET /cgi-bin/pkiclient.exe?operation=GetCACaps

		    ]]></artwork>
		  </figure>

		  <figure>
		    <preamble>might return:</preamble>
		    <artwork><![CDATA[

AES
GetNextCACert
POSTPKIOperation
SCEPStandard
SHA-256

		    ]]></artwork>
		  </figure>
		  <t>

This means that the CA supports modern crypto algorithms, the GetNextCACert
message, and allows PKIOperation messages (PKCSReq/RenewalReq/UpdateReq,
GetCert, CertPoll, ...) to be sent using HTTP POST, and is compliant with the
final version of the SCEP standard.

		  </t>

	    </section>
	  </section>
	</section>
	<section anchor="SCEP-trans" title="SCEP Transactions">
	  <t>

This section describes the SCEP Transactions and their <xref target="HTTP">
HTTP</xref> transport mechanism.

	  </t>
	  <section anchor="HTTP-GET-POST" title="HTTP GET and POST Message Formats">
		<t>

SCEP uses the HTTP "GET" and "POST" messages to exchange information with the
CA.  The following defines the syntax of HTTP GET and POST messages sent from
a client to a CA:

		</t>
		<figure>
		  <artwork><![CDATA[

"GET" CGI-PATH CGI-PROG "?operation=" OPERATION "&message=" MESSAGE
"POST" CGI-PATH CGI-PROG "?operation=" OPERATION

		  ]]></artwork>
		</figure>
		<t>

where:

		</t>
        <t>

      	<list style="symbols">

		  <t>CGI-PATH defines the actual CGI path to invoke the CGI program
		  that parses the request.</t>

		  <t>CGI-PROG is set to be the string "pkiclient.exe".  This is
		  intended to be the program that the CA will use to handle the SCEP
		  transactions, though the CA may ignore CGI-PROG and use only the
		  CGI-PATH, or ignore both if it's not issuing certificates via a web
		  server.  Typically, setting CGI-PATH/CGI-PROG to
		  "/cgi-bin/pkiclient.exe" will satisfy most servers.</t>

		  <t>OPERATION depends on the SCEP transaction and is defined in the
		  following sections.</t>

		  <t>MESSAGE depends on the SCEP transaction and is defined in the
		  following sections.</t>

        </list>

        </t>
        <t>

Early SCEP drafts performed all communications via "GET" messages, including
non-idempotent ones that should have been sent via "POST" messages.  This has
caused problems because of the way that the (supposedly) idempotent GET
interacts with caches and proxies, and because the extremely large GET
requests created by encoding CMS 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 CA supports it, any of the CMS-encoded
SCEP messages SHOULD be sent via HTTP POST instead of HTTP GET.  This applies
to any SCEP message except GetCACert, 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 SCEP messages via POST by looking for
the "POSTPKIOperation" capability (See <xref target="CA-caps-resp"/>).

        </t>
        <t>

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
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
symptom of the problematic use of HTTP GET.  The solution to this problem is
typically to move to HTTP POST instead.  In addition when using GET it's
recommended to test your implementation over the public internet from as many
locations as possible to determine whether the use of GET will cause problems
with communications.

        </t>
        <t>

When using GET messages to communicate binary data, base64 encoding as
specified in <xref target="Base64"/> MUST be used.  The base64 encoded data is
distinct from "base64url" and may contain URI reserved characters, thus it
MUST be escaped as specified in <xref target="URI"/> in addition to being
base64 encoded.

        </t>
	  </section>
	  <section anchor="GetCACert" title="Get CA Certificate">
		<t>

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
with this message.

		</t>
		<section anchor="GetCACert-resp" title="Get CA Certificate Response Message Format">
		  <t>

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
intermediate CA exists and the client communicates with this CA during the
enrolment.  If the client does not have a certificate path to a trust anchor
certificate, the fingerprint of the returned CA certificate, communicated via
out-of-band means, MAY be used to verify it.

		  </t>
		  <section anchor="GetCACert-resp-format" title="CA Certificate Response Message Format">
			<t>

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
Content-Type of "application/x-x509-ca-cert".

			</t>
			<figure>
			  <artwork><![CDATA[

"Content-Type: application/x-x509-ca-cert"

<binary X.509>

			  ]]></artwork>
			</figure>
		  </section>
		  <section anchor="GetCACertChain-resp-format" title="CA Certificate Chain Response Message Format">
			<t>

If the CA has intermediate CA certificates, the response 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).  The response will have a
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
specification, no special meaning should be attached to the label.

			</t>
			<figure>
			  <artwork><![CDATA[

"Content-Type: application/x-x509-ca-ra-cert"

<binary CMS>

			  ]]></artwork>
			</figure>
		  </section>
		</section>
	  </section>
	  <section anchor="cert-enrolment" title="Certificate Enrolment/Renewal/Update">
		<t>

A PKCSReq/RenewalReq/UpdateReq (<xref target="PKCSReq"/>) message is used to
perform a certificate enrolment, renewal, or update transaction.  The reply
MUST be a CertRep (<xref target="CertRep"/>) message sent back from the CA,
indicating SUCCESS, FAILURE, or PENDING.

		</t>
		<t>

The OPERATION MAY be set to "PKIOperation".  When used with HTTP POST, the
only OPERATION possible is "PKIOperation", so many CAs don't check this value
or even notice its absence.

		</t>
		<t>

The MESSAGE consists of a PKCSReq, RenewalReq, or UpdateReq SCEP message.
When implemented using HTTP POST this might look as follows:

		</t>
		<figure>
		  <artwork><![CDATA[

POST /cgi-bin/pkiclient.exe?operation=PKIOperation HTTP/1.1
Content-Length: <length of data>

<binary CMS data>

		  ]]></artwork>
		</figure>
		<t>

When implemented using HTTP GET this might look as follows:

		</t>
		<figure>
		  <artwork><![CDATA[

GET /cgi-bin/pkiclient.exe?operation=PKIOperation& \
message=MIAGCSqGSIb3DQEHA6CAMIACAQAxgDCBzAIBADB2MG \
IxETAPBgNVBAcTCE......AAAAAA== HTTP/1.1

		  ]]></artwork>
		</figure>
		<section anchor="cert-enrolment-resp" title="Certificate Enrolment/Renewal/Update Response Message">
		  <t>

If the request is granted, a CertRep message (<xref target="CertRep"/>) with
pkiStatus set to SUCCESS is returned.  The reply MUST also contain the
certificate (and MAY contain any other certificates needed by the client). The
issued certificate MUST be the first in the list.

		  </t>
		  <t>

If the request is rejected, a CertRep message (<xref target="CertRep"/>) with
pkiStatus set to FAILURE is returned.  The reply MUST also contain a failInfo
attribute.

		  </t>
		  <t>

If the the CA is configured to manually authenticate the client, a CertRep
message (<xref target="CertRep"/>) with pkiStatus set to PENDING MAY be
returned.  The CA MAY return a PENDING for other reasons.

		  </t>
		  <t>

The response will have a Content-Type of "application/x-pki-message".

		  </t>
		  <figure>
			<artwork><![CDATA[

"Content-Type: application/x-pki-message"

<binary CertRep message>

			]]></artwork>
		  </figure>
		</section>
	  </section>
	  <section anchor="poll-resp" title="Poll for Client Initial Certificate">
		<t>

Triggered by a CertRep message with pkiStatus set to PENDING, a client 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
request is rejected or some preconfigured time limit for polling or maximum
number of polls is exceeded.  The OPERATION MUST be set to "PKIOperation".
The MESSAGE consists of a CertPoll SCEP message.

		</t>
		<t>

CertPoll messages exchanged during the polling period MUST carry the same
transactionID attribute as the previous PKCSReq/RenewalReq/UpdateReq.  A CA
receiving a CertPoll for which it does not have a matching
PKCSReq/RenewalReq/UpdateReq MUST ignore this request.

		</t>
		<t>

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
via PKCSReq/RenewalReq/UpdateReq) to identify the polled certificate request
(but see the note on identification during polling in <xref
target="CertPoll"/>).  In 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 disambiguate between multiple requests.  In practice however it's
safer for the client to not have multiple requests outstanding at any one
time, since this tends to confuse some CAs.

		</t>
		<section anchor="poll-resp-format" title="Polling Response Message Format">
		  <t>

The response messages for CertPoll are the same as in <xref
target="cert-enrolment-resp"/>.

		  </t>
		</section>
	  </section>
	  <section anchor="cert-access" title="Certificate Access">
		<t>

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
number.

		</t>
		<t>

This transaction consists of one GetCert (<xref target="GetCert"/>) message
sent to the CA by a client, and one CertRep (<xref target="CertRep"/>) message
sent back from the CA.  The OPERATION MUST be set to "PKIOperation".  The
MESSAGE consists of a GetCert SCEP message.

		</t>
		<section anchor="cert-access-resp" title="Certificate Access Response Message Format">
		  <t>

In this case, the CertRep from the CA is same as in Section <xref
target="cert-enrolment-resp"/>, except that the CA will only either grant the
request (SUCCESS) or reject the request (FAILURE).

		  </t>
		</section>
	  </section>
	  <section anchor="CRL-access" title="CRL Access">
		<t>

Clients can request a CRL from the SCEP CA as described in <xref
target="overview-CRL-access"/>.  The OPERATION MUST be set to "PKIOperation".
The MESSAGE consists of a GetCRL SCEP message.

		</t>
		<section anchor="CRL-access-resp" title="CRL Access Response Message Format">
		  <t>

The CRL is sent back to the client in a CertRep (<xref target="CertRep"/>)
message.  The information portion of this message is a degenerate
certificates-only Signed-Data (<xref target="certs-only"/>) that contains only
the most recent CRL in the crls field of the Signed-Data.

		  </t>
		</section>
	  </section>
	  <section anchor="get-next-CA" title="Get Next Certification Authority Certificate">
		<t>

When the CA certificate expires all certificates that have been signed by it
are no longer valid.  CA key rollover provides a mechanism by which the CA MAY
distribute a new CA certificate which is valid in the future when the current
certificate has expired.  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 GetNextCACert message.  The OPERATION MUST be set to
"GetNextCACert".  There is no request data associated with this message.

	    </t>
	    <t>

Clients MAY store the not-yet-valid CA certificate, and any not-yet-valid
client certificates obtained, until such time that they are valid, at which
point clients switch over to using the newly valid certificates (but see the
note in <xref target="overview-cert-dist"/> about storing CA certificates).

		</t>
		<section anchor="get-next-CA-format" title="Get Next CA Response Message Format">
		  <t>

The response consists of a Signed-Data CMS message, signed by the current CA
signing key.  Clients MUST validate the signature on the message before
accepting any of its contents.  The response will have a Content-Type of
"application/x-x509-next-ca-cert".

		  </t>
		  <figure>
			<artwork><![CDATA[

"Content-Type: application/x-x509-next-ca-cert"

<binary CMS>

			]]></artwork>
		  </figure>
		  <t>

The content of the Signed-Data message is a degenerate certificates-only
Signed-Data (<xref target="certs-only"/>) message containing the new CA
certificate(s), to be used when the current CA certificate expires.

		  </t>
		  <t>

If the CA does not have rollover certificate(s) it MUST reject the request.
It SHOULD also remove the GetNextCACert setting from the capabilities until it
does have rollover certificates.

		  </t>
		  <t>

If there are any intermediate CA certificates in this response, clients MUST
check that these certificates are signed by the CA, and MUST check
authorization of these intermediate CA certificates (see <xref
target="overview-ca"/>).

		  </t>
		</section>
	  </section>
	</section>
    <!-- ====================================================================== -->
    <section anchor="state-trans" title="SCEP State Transitions">
	  <t>

The following section gives several examples of client to CA transactions.
Client actions are indicated in the left column, CA actions are indicated in
the right column, and the transactionID is given in parentheses.  The first
transaction, for example, would read like this:

	  </t>
	  <t>

"Client Sends PKCSReq message with transactionID 1 to the CA.  The CA signs
the certificate and constructs a CertRep Message containing the signed
certificate with a transaction ID 1.  The client receives the message and
installs the certificate locally".

	  </t>
	  <t>

In the case of polled transactions that aren't completed automatically, there
are two options for dealing with a transaction that's interrupted due to
network or software/hardware issues.  The first is for the client to preserve
its transaction state and resume the polling when normal service is restored.
The second is for the client to begin a new transaction by sending a
PKCSReq/RenewalReq/UpdateReq rather than continuing the previous CertPoll.
Both options have their own advantages and disadvantages.

	  </t>
	  <t>

The CertPoll continuation requires that the client maintain its transaction
state for when it resumes polling.  This is relatively simple if the problem
is a brief network outage, but less simple when the problem is a client crash
and restart.  In addition the server may treat a lost network connection as
the end of a transaction, so that a new connection followed by a CertPoll will
be treated as an error.

	  </t>
	  <t>

The PKCSReq/RenewalReq/UpdateReq continuation doesn't require any state to be
maintained since it's a new transaction, however it may cause problems on the
server side if the certificate was successfully issued but the client never
received it, 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 this is a problem).  In this case the server may refuse the transaction,
or require manual intervention to remove/revoke the previous certificate
before the client can request another one.

	  </t>
	  <figure>
		<preamble>Successful Enrolment Case: Automatic processing</preamble>
		<artwork><![CDATA[

PKCSReq (1)             ----------> CA issues certificate
                        <---------- CertRep (1) SUCCESS
Client installs certificate

		]]></artwork>
	  </figure>

	  <figure>
		<preamble>Successful Enrolment Case: Manual authentication
				  required</preamble>
		<artwork><![CDATA[

PKCSReq (2)             ----------> Cert request goes into queue
                        <---------- CertRep (2) PENDING
CertPoll (2)            ----------> Still pending
                        <---------- CertRep (2) PENDING
CertPoll (2)            ----------> CA issues certificate
                        <---------- CertRep (2) SUCCESS
Client installs certificate

		]]></artwork>
	  </figure>

	  <figure>
		<preamble>Resync Case 1: Client resyncs via resumed CertPoll after a
				  network outage:</preamble>
		<artwork><![CDATA[

PKCSReq (3)           ----------> Cert request goes into queue
                      <---------- CertRep (3) PENDING
CertPoll (3)          ----------> Still pending
                        X-------- CertRep(3) PENDING
(Network outage)
(Client reconnects)
CertPoll (3)          ----------> CA issues certificate
                      <---------- CertRep (3) SUCCESS
Client installs certificate

		]]></artwork>
	  </figure>

	  <figure>
		<preamble>Resync Case 2: Client resyncs via new PKCSReq:</preamble>
		<artwork><![CDATA[

PKCSReq (4)           ----------> Cert request goes into queue
                      <---------- CertRep (4) PENDING
CertPoll (4)          ----------> Still pending
                        X-------- CertRep(4) PENDING
(Network outage)
(Client reconnects)
PKCSReq (5)           ---------->
                      <---------- CertRep (5) PENDING
etc...

		]]></artwork>
	  </figure>

	  <figure>
		<preamble>Resync Case 3: Special-case variation of case 1 where the
				  CertRep SUCCESS rather than the CertRep PENDING is
				  lost:</preamble>
		<artwork><![CDATA[

PKCSReq (6)           ----------> Cert request goes into queue
                      <---------- CertRep (6) PENDING
CertPoll (6)          ----------> Still pending
                      <---------- CertRep (6) PENDING
CertPoll (6)          ----------> CA issues certificate
                        X-------- CertRep(6) SIGNED CERT
(Network outage)
(Client reconnects)
CertPoll (6)          ----------> Certificate already issued
                      <---------- CertRep (6) SUCCESS
Client installs certificate

		]]></artwork>
	  </figure>

	  <figure>
		<preamble>Resync Case 4: Special-case variation of case 2 where the
				  CertRep SUCCESS rather than the CertRep PENDING is
				  lost:</preamble>
		<artwork><![CDATA[

PKCSReq (7)           ----------> Cert request goes into queue
                      <---------- CertRep (7) PENDING
CertPoll (7)          ----------> Still pending
                      <---------- CertRep (7) PENDING
CertPoll (7)          ----------> CA issues certificate
                        X-------- CertRep(7) SUCCESS
(Network outage)
(Client reconnects)
PKCSReq (8)           ----------> There is already a valid
                                  certificate with this DN.
                      <---------- CertRep (8) FAILURE
                                  Admin revokes certificate
PKCSReq (8)           ----------> CA issues new certificate
                      <---------- CertRep (8) SUCCESS
Client installs certificate

		]]></artwork>
	  </figure>

	  <figure>
		<preamble>CA certificate rollover case:</preamble>
		<artwork><![CDATA[

GetNextCACert         ---------->
                      <---------- New CA certificate

PKCSReq*              ----------> CA issues certificate with
                                  new key
                      <---------- CertRep SUCCESS
Client stores certificate
for installation when
existing certificate expires.

		]]></artwork>
		<postamble>* Enveloped for the new CA certificate.  The CA will use
				   the envelope to determine which key to use to issue the
				   client certificate.</postamble>
	  </figure>
	  <t>

As these examples indicate, resumption from an error is tricky due to the
state that needs to be held by both client and/or server.  A CertPoll resume
is technically the cleanest option but requires the most careful management of
state, while a PKCSReq/RenewalReq/UpdateReq resume is the easiest to implement
since it's stateless, but can lead to complications if the message that gets
lost is the one that would complete the certificate issue.  On the other hand
a PKCSReq/RenewalReq/UpdateReq resume is identical for both polled and
non-polled transactions, while a CertPoll resume treats the two differently (a
non-polled transaction is resumed with a PKCSReq/RenewalReq/UpdateReq, a
polled transaction is resumed with a CertPoll).


	  </t>
	</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.  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>

This memo includes no request to IANA.

	  </t>
	</section>
    <!-- ====================================================================== -->
    <section anchor="security" title="Security Considerations">
	  <t>

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
than the client and the CA participating in the protocol.

	  </t>
	  <t>

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
authenticated via out-of-band means such as the checking of the CA fingerprint
as specified in <xref target="overview-ca"/>, and the SCEP client's public key
is authenticated through manual or pre-shared secret authentication as
specified in <xref target="overview-req-auth"/>.

	  </t>
	  <section title="General Security">
		<t>

Common key-management considerations such as keeping private keys truly
private and using adequate lengths for symmetric and asymmetric keys must be
followed in order to maintain the security of this protocol.  This is
especially true for CA keys, which, when compromised, compromise the security
of all relying parties.

		</t>
	  </section>
	  <section title="Use of the CA keypair">
		<t>

A CA key pair is generally meant for (and is usually flagged as) being 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
and optionally encrypt CMS transport messages.  This is generally considered
undesirable as it widens the possibility of an implementation weakness and
provides:

		</t>
		<t>

		<list style="symbols">

		  <t>Another place that the private key must be used (and hence is
		     slightly more vulnerable to exposure).</t>

		  <t>Another place where a side channel attack (say, timing or power
		  	 analysis) might be used.</t>

		  <t>Another place that the attacker might somehow insert their own
			 data and get it signed by the CA's private key.  Note though that
			 this issue is purely theoretical since the CMS data signed by the
			 CA is nothing like a certificate and could not be passed off as
			 such.</t>

		</list>

		</t>
	  </section>
	  <section title="Challenge Password">
		<t>

The challengePassword sent in the PKCS #10 enrolment request is signed and
encrypted by way of being encapsulated in a pkiMessage. When saved by the CA,
care should be taken to protect this password, for example by storing a salted
iterated hash of the password rather than the password itself.

		</t>
	  </section>
	  <section anchor="security-no-conf" title="Lack of Certificate Issue Confirmation">
		<t>

SCEP provides no confirmation that the issued certificate was successfully
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
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
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
the proof of possession that's not present in the case of an update or renewal
operation, see <xref target="security-no-pop"/>.

		</t>
	  </section>
	  <section title="GetCACaps Issues">
		<t>

The GetCACaps response is not signed.  This allows an attacker to perform
downgrade attacks on the cryptographic capabilities of the client/CA exchange.

		</t>
	  </section>
	  <section anchor="security-no-pop" title="Lack of PoP in Renewal and Update Requests">
		<t>

Renewal and update operations (but not standard certificate-issue operations)
are 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
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
re-certify 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
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,
attacks are described in <xref target="ESS">S/MIME ESS</xref>.

		</t>
		<t>

Avoiding these types of attacks requires situation-specific measures.  For
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
ESSv2</xref> to unambiguously identify the signing certificate, however other
mechanisms and protocols typically don't defend against this attack.

		</t>
	  </section>
	  <section title="Unnecessary cryptography">
		<t>

Some of the SCEP exchanges use unnecessary signing and encryption operations.
In particular the GetCert and GetCRL exchanges are encrypted and signed in
both directions.  The information requested is public and thus signing the
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
without requiring additional signing and encryption.  More lightweight means
of retrieving certificates and CRLs such as <xref target="HTTP-certstore">HTTP
certificate-store access</xref> and LDAP are recommended for this reason.

		</t>
	  </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 Requirement 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='ftp://ftp.isi.edu/in-notes/rfc2119.txt' />
        <format type='HTML' target='http://xml.resource.org/public/rfc/html/rfc2119.html' />
        <format type='XML' target='http://xml.resource.org/public/rfc/xml/rfc2119.xml' />
      </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</title>
          <author initials="R" surname="Fielding"></author>
          <author initials="J" surname="Gettys"></author>
          <author initials="J" surname="Mogul"></author>
          <author initials="H" surname="Frystyk"></author>
          <author initials="L" surname="Masinter"></author>
          <author initials="P" surname="Leach"></author>
          <author initials="T" surname="Berners-Lee"></author>
          <date year='1999' month='June' />
        </front>
        <seriesInfo name='RFC' value='2616' />
        <format type='TXT' target='http://www.ietf.org/rfc/rfc2616.txt' />
      </reference>

      <reference anchor='PKCS9'>
        <front>
          <title>PKCS #9: Selected Object Classes and Attribute Types Version 2.0</title>
          <author initials="M" surname="Nystrom"></author>
          <author initials="B" surname="Kaliski"></author>
          <date year='2000' month='November' />
        </front>
        <seriesInfo name='RFC' value='2985' />
        <format type='TXT' target='http://www.ietf.org/rfc/rfc2985.txt' />
      </reference>

      <reference anchor='PKCS10'>
        <front>
          <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'>
        <front>
          <title>Internet X.509 Public Key Infrastructure Certificate and Certificate 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'>
        <front>
          <title>Uniform Resource Identifiers (URI): Generic Syntax</title>
          <author initials="T" surname="Berners-Lee"></author>
          <author initials="R" surname="Fielding"></author>
          <author initials="L" surname="Masinter"></author>
          <date year='1998' month='August' />
        </front>
        <seriesInfo name='RFC' value='2396' />
        <format type='TXT' target='http://www.ietf.org/rfc/rfc2396.txt' />
      </reference>

    </references>
    <references title="Informative References">

      <reference anchor='CMC'>
        <front>
          <title>Certificate Management over CMS (CMC)</title>
          <author initials="J" surname="Schaad"></author>
          <author initials="M" surname="Myers"></author>
          <date year='2008' month='June' />
        </front>
        <seriesInfo name='RFC' value='5272' />
        <format type='TXT' target='http://www.ietf.org/rfc/rfc5272.txt' />
      </reference>

      <reference anchor='CMP'>
        <front>
          <title>Internet X.509 Public Key Infrastructure Certificate Management Protocol (CMP)</title>
          <author initials="C" surname="Adams"></author>
          <author initials="S" surname="Farrell"></author>
          <author initials="T" surname="Kause"></author>
          <author initials="T" surname="Mononen"></author>
          <date year='2005' month='September' />
        </front>
        <seriesInfo name='RFC' value='4210' />
        <format type='TXT' target='http://www.ietf.org/rfc/rfc4210.txt' />
      </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='IKEv2'>
        <front>
          <title>Internet Key Exchange (IKEv2) Protocol</title>
<!--      <author initials="C" surname="Kaufman"></author> -->
          <author initials="D" surname="Alighieri"></author>
<!--      <date year='2005' month='December' /> -->
          <date year='1300' month='March' />
        </front>
        <seriesInfo name='RFC' value='4306' />
        <format type='TXT' target='http://www.ietf.org/rfc/rfc4306.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 Algorithm 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.2</title>
          <author fullname="Tim Dierks" initials="T" surname="Dierks">
            <organization>Independent</organization>
          </author>
          <author fullname="Eric Rescorla" initials="E" surname="Rescorla">
            <organization>RTFM, Inc.</organization>
          </author>
          <date year='2008' month='August' />
        </front>
        <seriesInfo name='RFC' value='5246' />
        <format type='TXT' target='http://www.ietf.org/rfc/rfc5246.txt' />
      </reference>

    </references>
    <!-- ====================================================================== -->
    <section anchor="background" title="Background Notes">
      <t>

This specification has spent more than sixteen years in the draft stage.  Its
original goal, provisioning IPsec routers with RSA certificates, has long
since 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
growing list of appendices and by inserting additional, often conflicting,
paragraphs in various locations in the body text.  Since existing features
were never updated as newer ones were added, the specification accumulated
large amounts of historical baggage over time.  If OpenPGP was described as "a
museum of 1990s crypto" then the SCEP draft was its graveyard.

      </t>
      <t>

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
original sponsors.  Due to its widespread use in large segments of the
industry, the specification was rebooted in 2015, cleaning up fifteen years
worth of accumulated cruft, fixing errors, clarifying ambiguities, and
bringing the algorithms and standards used into the current century (prior to
the update, the de-facto lowest-common denominator algorithms used for
interoperability were the forty-year-old single DES and broken MD5 hash
algorithms).

      </t>
      <t>

Other changes include:

      </t>
      <t>

      <list style="symbols">

		<t>Resolved contradictions in the text, for example a requirement
		given as a MUST in one paragraph and a SHOULD in the next, a MUST NOT
		in one paragraph and a MAY a few paragraphs later, a SHOULD NOT
		contradicted later by a MAY, and so on.</t>

		<t>Merged several later fragmentary addenda placed in appendices (for
		example the handling of certificate renewal and update) with the body
		of the text.</t>

		<t>Merged the SCEP Transactions and SCEP Transport sections, since the
		latter mostly duplicated (with occasional inconsistencies) the
		former.</t>

		<t>Updated the algorithms to ones dating from at least this
		century.</t>

		<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, end entity, server,
		certificate authority, and CA.</t>

		<t>Corrected incorrect references to other standards, e.g.
		IssuerAndSerial -> IssuerAndSerialNumber.</t>

		<t>Corrected errors such as a statement that when both signature and
		encryption certificates existed, the signature certificate was used
		for encryption.</t>

		<t>Condensed redundant discussions of the same topic spread across
		multiple sections into a single location.  For example the description
		of intermediate CA handling previously existed in three different
		locations, with slightly different reqirements in each one.</t>

		<t>Added a description of how pkiMessages were processed, which was
		never made explicit in the original specification.  This led to
		creative interpretations that had security problems but were employed
		anyway due to the lack of specific guidance on what to do.</t>

		<t>Relaxed some requirements that didn't serve any obvious purpose and
		that major implementations didn't seem to be enforcing.  For example
		the requirement that the self-signed certificate used with a request
		MUST contain a subject name that matched the one in the PKCS #10
		request was relaxed to a SHOULD because a number of implementations
		either ignored the issue entirely or at worst performed some minor
		action like creating a log entry after which they continued
		anyway.</t>

		<t>Removed discussion of the transactionID from the security
		considerations, since the instructions there were directly
		contradicted by the discussion of the use of the transactionID in
		<xref target="state-trans"/>.</t>

		<t>Clarified sections that were unclear or even made no sense, for
		example the requirement for a "hash on the public key" [sic] encoded
		as a PrintableString.</t>

		<t>Renamed "RA certificates" to "intermediate CA certificates".  The
		original document at some point added mention of RA certificates
		without specifying how the client was to determine that an RA was in
		use, how the RA operations were identified in the protocol, or how it
		was used.  It's unclear whether what was meant was a true RA or merely
		an intermediate CA, as opposed to the default practice of having
		certificates issued directly from a single root CA certificate. This
		update uses the term "intermediate CA certificates", since this seems
		to have been the original intent of the text.</t>

		<t>Redid the PKIMessage diagram to match what was specified in CMS,
		the previous diagram omitted a number of fields and nested data
		structures which meant the text didn't match the diagram.</t>

		<t>Removed the requirement for a CertPoll to contain a recipientNonce,
		since CertPoll is a client message and will never be sent in response
		to a message containing a senderNonce.  See also the note in
		<xref target="CertRep"/>.</t>

		<t>Clarified certificate renewal and update.  These represent a
		capability that was bolted onto the original protocol with (at best)
		vaguely-defined semantics, including a requirement by the CA to guess
		whether a particular request was a renewal or not (updates were even
		more vaguely defined).  In response to developer feedback that they
		either avoided renewal/update entirely because of this uncertainty or
		hardcoded in particular behaviour on a per-CA basis, this
		specification explicitly identifies renewal and update requests as
		such, and provides proper semantics for both.</t>

		<t>Added the "SCEPStandard" keyword to GetCACaps to indicate that the
		CA complies with the final version of the SCEP standard, since the
		definition of what constitutes SCEP standards compliance has changed
		significantly over the years.</t>

		<t>Removed the discussion in the security considerations of revocation
		issues, since SCEP doesn't support revocation as part of the
		protocol.</t>

		<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
		message impossible.</t>

		<t>Removed the discussion of generating a given transactionID by
		hashing the public key, since this implied that there was some special
		significance in the value generated this way.  Since it was neither a
		MUST nor a MAY, it was unsound to imply that servers could rely on the
		value being generated a certain way.  In addition it wouldn't work if
		multiple transactions as discussed in <xref target="poll-resp"/> were
		initiated, since the deterministic generation via hashing would lead
		to duplicate transactionIDs.</t>

		<t>Added examples of SCEP messages to give implementers something to
		aim for.</t>

      </list>

	  </t>
	</section>
    <!-- ====================================================================== -->
    <section anchor="examples" title="Sample SCEP Messages">
      <t>

(Omitted from the drafts to keep the size down).

	  </t>
	</section>
    <!-- ====================================================================== -->
  </back>
</rfc>
