rfc8894.original | rfc8894.txt | |||
---|---|---|---|---|
Network Working Group P. Gutmann | Internet Engineering Task Force (IETF) P. Gutmann | |||
Internet-Draft University of Auckland | Request for Comments: 8894 University of Auckland | |||
Intended status: Informational March 27, 2020 | Category: Informational September 2020 | |||
Expires: September 28, 2020 | ISSN: 2070-1721 | |||
Simple Certificate Enrolment Protocol | Simple Certificate Enrolment Protocol | |||
draft-gutmann-scep-16 | ||||
Abstract | Abstract | |||
This document specifies the Simple Certificate Enrolment Protocol | This document specifies the Simple Certificate Enrolment Protocol | |||
(SCEP), a PKI protocol that leverages existing technology by using | (SCEP), a PKI protocol that leverages existing technology by using | |||
CMS (formerly known as PKCS #7) and PKCS #10 over HTTP. SCEP is the | Cryptographic Message Syntax (CMS, formerly known as PKCS #7) and | |||
evolution of the enrolment protocol sponsored by Cisco Systems, which | PKCS #10 over HTTP. SCEP is the evolution of the enrolment protocol | |||
enjoys wide support in both client and server implementations, as | sponsored by Cisco Systems, which enjoys wide support in both client | |||
well as being relied upon by numerous other industry standards that | and server implementations, as well as being relied upon by numerous | |||
work with certificates. | other industry standards that work with certificates. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This document is not an Internet Standards Track specification; it is | |||
provisions of BCP 78 and BCP 79. | published for informational purposes. | |||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Not all documents | |||
approved by the IESG are candidates for any level of Internet | ||||
Standard; see Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on September 28, 2020. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc8894. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
skipping to change at page 2, line 21 ¶ | skipping to change at line 64 ¶ | |||
modifications of such material outside the IETF Standards Process. | modifications of such material outside the IETF Standards Process. | |||
Without obtaining an adequate license from the person(s) controlling | Without obtaining an adequate license from the person(s) controlling | |||
the copyright in such materials, this document may not be modified | the copyright in such materials, this document may not be modified | |||
outside the IETF Standards Process, and derivative works of it may | outside the IETF Standards Process, and derivative works of it may | |||
not be created outside the IETF Standards Process, except to format | not be created outside the IETF Standards Process, except to format | |||
it for publication as an RFC or to translate it into languages other | it for publication as an RFC or to translate it into languages other | |||
than English. | than English. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction | |||
1.1. Conventions Used in This Document . . . . . . . . . . . . 4 | 1.1. Conventions Used in This Document | |||
2. SCEP Overview . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. SCEP Overview | |||
2.1. SCEP Entities . . . . . . . . . . . . . . . . . . . . . . 4 | 2.1. SCEP Entities | |||
2.1.1. Client . . . . . . . . . . . . . . . . . . . . . . . 4 | 2.1.1. Client | |||
2.1.2. Certificate Authority . . . . . . . . . . . . . . . . 5 | 2.1.2. Certificate Authority | |||
2.2. CA Certificate Distribution . . . . . . . . . . . . . . . 5 | 2.2. CA Certificate Distribution | |||
2.3. Client authentication . . . . . . . . . . . . . . . . . . 6 | 2.3. Client Authentication | |||
2.4. Enrolment authorisation . . . . . . . . . . . . . . . . . 7 | 2.4. Enrolment Authorisation | |||
2.5. Certificate Enrolment/Renewal . . . . . . . . . . . . . . 8 | 2.5. Certificate Enrolment/Renewal | |||
2.5.1. Client State Transitions . . . . . . . . . . . . . . 8 | 2.5.1. Client State Transitions | |||
2.6. Certificate Access . . . . . . . . . . . . . . . . . . . 10 | 2.6. Certificate Access | |||
2.7. CRL Access . . . . . . . . . . . . . . . . . . . . . . . 11 | 2.7. CRL Access | |||
2.8. Certificate Revocation . . . . . . . . . . . . . . . . . 11 | 2.8. Certificate Revocation | |||
2.9. Mandatory-to-Implement Functionality . . . . . . . . . . 11 | 2.9. Mandatory-to-Implement Functionality | |||
3. SCEP Secure Message Objects . . . . . . . . . . . . . . . . . 12 | 3. SCEP Secure Message Objects | |||
3.1. SCEP Message Object Processing . . . . . . . . . . . . . 14 | 3.1. SCEP Message Object Processing | |||
3.2. SCEP pkiMessage . . . . . . . . . . . . . . . . . . . . . 14 | 3.2. SCEP pkiMessage | |||
3.2.1. Signed Transaction Attributes . . . . . . . . . . . . 14 | 3.2.1. Signed Transaction Attributes | |||
3.2.1.1. transactionID . . . . . . . . . . . . . . . . . . 16 | 3.2.1.1. transactionID | |||
3.2.1.2. messageType . . . . . . . . . . . . . . . . . . . 17 | 3.2.1.2. messageType | |||
3.2.1.3. pkiStatus . . . . . . . . . . . . . . . . . . . . 17 | 3.2.1.3. pkiStatus | |||
3.2.1.4. failInfo and failInfoText . . . . . . . . . . . . 17 | 3.2.1.4. failInfo and failInfoText | |||
3.2.1.5. senderNonce and recipientNonce . . . . . . . . . 18 | 3.2.1.5. senderNonce and recipientNonce | |||
3.2.2. SCEP pkcsPKIEnvelope . . . . . . . . . . . . . . . . 18 | 3.2.2. SCEP pkcsPKIEnvelope | |||
3.3. SCEP pkiMessage types . . . . . . . . . . . . . . . . . . 19 | 3.3. SCEP pkiMessage types | |||
3.3.1. PKCSReq/RenewalReq . . . . . . . . . . . . . . . . . 19 | 3.3.1. PKCSReq/RenewalReq | |||
3.3.2. CertRep . . . . . . . . . . . . . . . . . . . . . . . 19 | 3.3.2. CertRep | |||
3.3.2.1. CertRep SUCCESS . . . . . . . . . . . . . . . . . 20 | 3.3.2.1. CertRep SUCCESS | |||
3.3.2.2. CertRep FAILURE . . . . . . . . . . . . . . . . . 20 | 3.3.2.2. CertRep FAILURE | |||
3.3.2.3. CertRep PENDING . . . . . . . . . . . . . . . . . 20 | 3.3.2.3. CertRep PENDING | |||
3.3.3. CertPoll (GetCertInitial) | ||||
3.3.3. CertPoll (GetCertInitial) . . . . . . . . . . . . . . 21 | 3.3.4. GetCert and GetCRL | |||
3.3.4. GetCert and GetCRL . . . . . . . . . . . . . . . . . 21 | 3.4. Degenerate certificates-only CMS SignedData | |||
3.4. Degenerate certificates-only CMS Signed-Data . . . . . . 22 | 3.5. CA Capabilities | |||
3.5. CA Capabilities . . . . . . . . . . . . . . . . . . . . . 22 | 3.5.1. GetCACaps HTTP Message Format | |||
3.5.1. GetCACaps HTTP Message Format . . . . . . . . . . . . 22 | 3.5.2. CA Capabilities Response Format | |||
3.5.2. CA Capabilities Response Format . . . . . . . . . . . 22 | 4. SCEP Transactions | |||
4. SCEP Transactions . . . . . . . . . . . . . . . . . . . . . . 25 | 4.1. HTTP POST and GET Message Formats | |||
4.1. HTTP POST and GET Message Formats . . . . . . . . . . . . 25 | 4.2. Get CA Certificate | |||
4.2. Get CA Certificate . . . . . . . . . . . . . . . . . . . 26 | 4.2.1. Get CA Certificate Response Message Format | |||
4.2.1. Get CA Certificate Response Message Format . . . . . 27 | 4.2.1.1. CA Certificate Response Message Format | |||
4.2.1.1. CA Certificate Response Message Format . . . . . 27 | 4.2.1.2. CA Certificate Chain Response Message Format | |||
4.2.1.2. CA Certificate Chain Response Message Format . . 27 | 4.3. Certificate Enrolment/Renewal | |||
4.3. Certificate Enrolment/Renewal . . . . . . . . . . . . . . 27 | 4.3.1. Certificate Enrolment/Renewal Response Message | |||
4.3.1. Certificate Enrolment/Renewal Response Message . . . 28 | 4.4. Poll for Client Initial Certificate | |||
4.4. Poll for Client Initial Certificate . . . . . . . . . . . 28 | 4.4.1. Polling Response Message Format | |||
4.4.1. Polling Response Message Format . . . . . . . . . . . 29 | 4.5. Certificate Access | |||
4.5. Certificate Access . . . . . . . . . . . . . . . . . . . 29 | 4.5.1. Certificate Access Response Message Format | |||
4.5.1. Certificate Access Response Message Format . . . . . 29 | 4.6. CRL Access | |||
4.6. CRL Access . . . . . . . . . . . . . . . . . . . . . . . 29 | 4.6.1. CRL Access Response Message Format | |||
4.6.1. CRL Access Response Message Format . . . . . . . . . 29 | 4.7. Get Next Certificate Authority Certificate | |||
4.7. Get Next Certificate Authority Certificate . . . . . . . 29 | 4.7.1. Get Next CA Response Message Format | |||
4.7.1. Get Next CA Response Message Format . . . . . . . . . 30 | 5. SCEP Transaction Examples | |||
5. SCEP Transaction Examples . . . . . . . . . . . . . . . . . . 30 | 5.1. Successful Transactions | |||
5.1. Successful Transactions . . . . . . . . . . . . . . . . . 30 | 5.2. Transactions with Errors | |||
5.2. Transactions with Errors . . . . . . . . . . . . . . . . 31 | 6. IANA Considerations | |||
6. Contributors/Acknowledgements . . . . . . . . . . . . . . . . 34 | 6.1. Registration of the application/x-x509-ca-cert Media Type | |||
7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 34 | 6.2. Registration of the application/x-x509-ca-ra-cert Media | |||
7.1. Registration of application/x-x509-ca-cert media type . . 35 | Type | |||
7.2. Registration of application/x-x509-ca-ra-cert media type 36 | 6.3. Registration of the application/x-x509-next-ca-cert Media | |||
7.3. Registration of application/x-x509-next-ca-cert media | Type | |||
type . . . . . . . . . . . . . . . . . . . . . . . . . . 37 | 6.4. Registration of the application/x-pki-message Media Type | |||
7.4. Registration of application/x-pki-message media type . . 38 | 7. Security Considerations | |||
8. Security Considerations . . . . . . . . . . . . . . . . . . . 39 | 7.1. General Security | |||
8.1. General Security . . . . . . . . . . . . . . . . . . . . 39 | 7.2. Use of the CA Private Key | |||
8.2. Use of the CA private key . . . . . . . . . . . . . . . . 40 | 7.3. ChallengePassword Shared Secret Value | |||
8.3. ChallengePassword Shared Secret Value . . . . . . . . . . 40 | 7.4. Lack of Certificate Issue Confirmation | |||
8.4. Lack of Certificate Issue Confirmation . . . . . . . . . 41 | 7.5. GetCACaps Issues | |||
8.5. GetCACaps Issues . . . . . . . . . . . . . . . . . . . . 41 | 7.6. Lack of PoP in Renewal Requests | |||
8.6. Lack of PoP in Renewal Requests . . . . . . . . . . . . . 42 | 7.7. Traffic Monitoring | |||
8.7. Traffic Monitoring . . . . . . . . . . . . . . . . . . . 42 | 7.8. Unnecessary Cryptography | |||
8.8. Unnecessary cryptography . . . . . . . . . . . . . . . . 42 | 7.9. Use of SHA-1 | |||
8.9. Use of SHA-1 . . . . . . . . . . . . . . . . . . . . . . 43 | 7.10. Use of HTTP | |||
9. References . . . . . . . . . . . . . . . . . . . . . . . . . 43 | 8. References | |||
9.1. Normative References . . . . . . . . . . . . . . . . . . 43 | 8.1. Normative References | |||
9.2. Informative References . . . . . . . . . . . . . . . . . 45 | 8.2. Informative References | |||
Appendix A. Background Notes . . . . . . . . . . . . . . . . . . 45 | Appendix A. Background Notes | |||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 48 | Acknowledgements | |||
Author's Address | ||||
1. Introduction | 1. Introduction | |||
X.509 certificates serve as the basis for several standardised | X.509 certificates serve as the basis for several standardised | |||
security protocols such as TLS [23], S/MIME [20], and IKE/IPsec [19]. | security protocols such as TLS [RFC8446], S/MIME [RFC8551], and IKE/ | |||
When an X.509 certificate is issued there typically is a need for a | IPsec [RFC7296]. When an X.509 certificate is issued, there | |||
certificate management protocol to enable a PKI client to request or | typically is a need for a certificate management protocol to enable a | |||
renew a certificate from a Certificate Authority (CA). This | PKI client to request or renew a certificate from a Certificate | |||
specification defines a protocol, Simple Certificate Enrolment | Authority (CA). This specification defines a protocol, the Simple | |||
Protocol (SCEP), for certificate management and certificate and CRL | Certificate Enrolment Protocol (SCEP), for certificate management and | |||
queries. | certificate and CRL queries. | |||
The SCEP protocol supports the following general operations: | The SCEP protocol supports the following general operations: | |||
o CA public key distribution. | * CA public key distribution | |||
o Certificate enrolment and issue. | * Certificate enrolment and issue | |||
o Certificate renewal. | * Certificate renewal | |||
o Certificate query. | * Certificate query | |||
o CRL query. | * CRL query | |||
SCEP makes extensive use of CMS [10] and PKCS #10 [13]. | SCEP makes extensive use of CMS [RFC5652] and PKCS #10 [RFC2986]. | |||
1.1. Conventions Used in This Document | 1.1. Conventions Used in This Document | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in [1] | "OPTIONAL" in this document are to be interpreted as described in | |||
and [5] when, and only when, they appear in all capitals, as shown | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
here. | capitals, as shown here. | |||
This document uses the Augmented Backus-Naur Form (ABNF) notation as | This document uses the Augmented Backus-Naur Form (ABNF) notation as | |||
specified in [6] for defining formal syntax of commands. Non- | specified in [RFC5234] for defining formal syntax of commands. Non- | |||
terminals not defined in [6] are defined in Section 4.1. | terminals not defined in [RFC5234] are defined in Section 4.1. | |||
2. SCEP Overview | 2. SCEP Overview | |||
This section provides an overview of the functionality of SCEP. | This section provides an overview of the functionality of SCEP. | |||
2.1. SCEP Entities | 2.1. SCEP Entities | |||
The entity types defined in SCEP are a client requesting a | The entity types defined in SCEP are a client requesting a | |||
certificate and a Certificate Authority (CA) that issues the | certificate and a Certificate Authority (CA) that issues the | |||
certificate. These are described in the following sections. | certificate. These are described in the following sections. | |||
skipping to change at page 5, line 8 ¶ | skipping to change at line 197 ¶ | |||
2.1.1. Client | 2.1.1. Client | |||
A client MUST have the following information locally configured: | A client MUST have the following information locally configured: | |||
1. The CA's fully qualified domain name or IP address. | 1. The CA's fully qualified domain name or IP address. | |||
2. Any identification and/or authorisation information required by | 2. Any identification and/or authorisation information required by | |||
the CA before a certificate will be issued, as described in | the CA before a certificate will be issued, as described in | |||
Section 3.3.1. | Section 3.3.1. | |||
3. The identifying information that is used for authentication of | 3. The identifying information that is used for authentication of | |||
the CA in Section 4.2.1, typically a certificate fingerprint. | the CA in Section 4.2.1, typically a certificate fingerprint. | |||
2.1.2. Certificate Authority | 2.1.2. Certificate Authority | |||
A SCEP CA is the entity that signs client certificates. A CA may | A SCEP CA is the entity that signs client certificates. A CA may | |||
enforce policies and apply them to certificate requests, and may | enforce policies and apply them to certificate requests, and it may | |||
reject a request for any reason. | reject a request for any reason. | |||
Since the client is expected to perform signature verification and | Since the client is expected to perform signature verification and | |||
optionally encryption using the CA certificate, the keyUsage | optionally encryption using the CA certificate, the keyUsage | |||
extension in the CA certificate MUST indicate that it is valid for | extension in the CA certificate MUST indicate that it is valid for | |||
digitalSignature and keyEncipherment (if the key is to be used for | digitalSignature and keyEncipherment (if the key is to be used for | |||
en/decryption) alongside the usual CA usages of keyCertSign and/or | en/decryption) alongside the usual CA usages of keyCertSign and/or | |||
cRLSign. | cRLSign. | |||
2.2. CA Certificate Distribution | 2.2. CA Certificate Distribution | |||
If the CA certificate(s) have not previously been acquired by the | If the CA certificate(s) have not previously been acquired by the | |||
client through some other means, the client MUST retrieve them before | client through some other means, the client MUST retrieve them before | |||
any PKI operation (Section 3) can be started. Since no public key | any PKI operation (Section 3) can be started. Since no public key | |||
has yet been exchanged between the client and the CA, the messages | has yet been exchanged between the client and the CA, the messages | |||
cannot be secured using CMS, and the CA certificate request and | cannot be secured using CMS, and the CA certificate request and | |||
response data is instead transferred in the clear. | response data is instead transferred in the clear. | |||
If an intermediate CA is in use, a certificates-only CMS Signed-Data | If an intermediate CA is in use, a certificates-only CMS SignedData | |||
message with a certificate chain consisting of all CA certificates is | message with a certificate chain consisting of all CA certificates is | |||
returned. Otherwise the CA certificate itself is returned. | returned. Otherwise, the CA certificate itself is returned. | |||
The CA certificate MAY be provided out-of-band to the client. | The CA certificate MAY be provided out of band to the client. | |||
Alternatively, the CA certificate fingerprint MAY be used to | Alternatively, the CA certificate fingerprint MAY be used to | |||
authenticate a CA Certificate distributed by the GetCACert response | authenticate a CA certificate distributed by the GetCACert response | |||
(Section 4.2) or via HTTP certificate-store access [17]. The | (Section 4.2) or via HTTP certificate-store access [RFC4387]. The | |||
fingerprint is created by calculating a SHA-256 hash over the whole | 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 | CA certificate. (For legacy reasons, a SHA-1 hash may be used by | |||
implementations). | some implementations.) | |||
After the client gets the CA certificate, it SHOULD authenticate it | After the client gets the CA certificate, it SHOULD authenticate it | |||
in some manner unless this is deemed unnecessary, for example because | in some manner unless this is deemed unnecessary, for example, | |||
the device is being provisioned inside a trusted environment. For | because the device is being provisioned inside a trusted environment. | |||
example it could compare its fingerprint with locally configured, | For example, the client could compare the certificate's fingerprint | |||
out-of-band distributed, identifying information, or by some | with locally configured, out-of-band distributed, identifying | |||
equivalent means such as a direct comparison with a locally-stored | information, or by some equivalent means such as a direct comparison | |||
copy of the certificate. | with a locally stored copy of the certificate. | |||
Intermediate CA certificates, if any, are signed by a higher-level CA | Intermediate CA certificates, if any, are signed by a higher-level | |||
so there is no need to authenticate them against the out-of-band | CA, so there is no need to authenticate them against the out-of-band | |||
data. Since intermediate CA certificates are rolled over more | data. Since intermediate CA certificates are rolled over more | |||
frequently than long-lived top-level CA certificates, clients MUST | frequently than long-lived top-level CA certificates, clients MUST | |||
verify intermediate-level CA certificates before use during protocol | verify intermediate-level CA certificates before use during protocol | |||
exchanges in case the intermediate CA certificate has expired or | exchanges in case the intermediate CA certificate has expired or | |||
otherwise been invalidated. | otherwise been invalidated. | |||
When a CA certificate expires, certificates that have been signed by | When a CA certificate expires, certificates that have been signed by | |||
it may no longer be regarded as valid. CA key rollover provides a | it may no longer be regarded as valid. CA key rollover provides a | |||
mechanism by which the CA can distribute a new CA certificate which | mechanism by which the CA can distribute a new CA certificate that | |||
is valid in the future once the current certificate has expired. | will be valid in the future once the current certificate has expired. | |||
This is done via the GetNextCACert message (section Section 4.7). | This is done via the GetNextCACert message (Section 4.7). | |||
2.3. Client authentication | 2.3. Client Authentication | |||
As with every protocol that uses public-key cryptography, the | As with every protocol that uses public-key cryptography, the | |||
association between the public keys used in the protocol and the | association between the public keys used in the protocol and the | |||
identities with which they are associated must be authenticated in a | identities with which they are associated must be authenticated in a | |||
cryptographically secure manner. Communications between the client | cryptographically secure manner. Communications between the client | |||
and the CA are secured using SCEP Secure Message Objects as explained | and the CA are secured using SCEP Secure Message Objects as explained | |||
in Section 3, which specifies how CMS is used to encrypt and sign the | in Section 3, which specifies how CMS is used to encrypt and sign the | |||
data. In order to perform the signing operation the client uses an | data. In order to perform the signing operation, the client uses an | |||
appropriate local certificate: | appropriate local certificate: | |||
1. If the client does not have an appropriate existing certificate | 1. If the client does not have an appropriate existing certificate, | |||
then a locally generated self-signed certificate MUST be used. | then a locally generated self-signed certificate MUST be used. | |||
The keyUsage extension in the certificate MUST indicate that it | The keyUsage extension in the certificate MUST indicate that it | |||
is valid for digitalSignature and keyEncipherment (if available). | is valid for digitalSignature and keyEncipherment (if available). | |||
The self-signed certificate SHOULD use the same subject name and | The self-signed certificate SHOULD use the same subject name and | |||
key as in the PKCS #10 request. In this case the messageType is | key as in the PKCS #10 request. In this case, the messageType is | |||
PKCSReq (see Section 3.2.1.2). | PKCSReq (see Section 3.2.1.2). | |||
2. If the client already has a certificate issued by the SCEP CA and | ||||
the CA supports renewal (see Section 2.5), that certificate | 2. If the client already has a certificate issued by the SCEP CA, | |||
SHOULD be used. In this case the messageType is RenewalReq (see | and the CA supports renewal (see Section 2.5), that certificate | |||
SHOULD be used. In this case, the messageType is RenewalReq (see | ||||
Section 3.2.1.2). | Section 3.2.1.2). | |||
3. Alternatively, if the client has no certificate issued by the | 3. Alternatively, if the client has no certificate issued by the | |||
SCEP CA but has credentials from an alternate CA then the | SCEP CA but has credentials from an alternate CA, then the | |||
certificate issued by the alternate CA MAY be used in a renewal | certificate issued by the alternate CA MAY be used in a renewal | |||
request as described above. The SCEP CA's policy will determine | request as described above. The SCEP CA's policy will determine | |||
whether the request can be accepted or not. | whether the request can be accepted or not. | |||
Note that although the above text describes several different types | Note that although the above text describes several different types | |||
of operations, for historical reasons most implementations always | of operations, for historical reasons, most implementations always | |||
apply the first one even if an existing certificate already exists. | apply the first one, even if an existing certificate already exists. | |||
For this reason support for the first case is mandatory while support | For this reason, support for the first case is mandatory while | |||
for the latter ones are optional (see Section 2.9). | support for the latter ones are optional (see Section 2.9). | |||
During the certificate enrolment process, the client MUST use the | During the certificate-enrolment process, the client MUST use the | |||
selected certificate's key when signing the CMS envelope (see | selected certificate's key when signing the CMS envelope (see | |||
Section 3). This certificate will be either the self-signed one | Section 3). This certificate will be either the self-signed one | |||
matching the PKCS #10 request or the CA-issued one used to authorise | matching the PKCS #10 request or the CA-issued one used to authorise | |||
a renewal, and MUST be included in the signedData certificates field | a renewal, and it MUST be included in the signedData certificates | |||
(possibly as part of a full certificate chain). If the key being | field (possibly as part of a full certificate chain). If the key | |||
certified allows encryption then the CA's CertResp will use the same | being certified allows encryption, then the CA's CertResp will use | |||
certificate's public key when encrypting the response. | the same certificate's public key when encrypting the response. | |||
Note that in the case of renewal operations this means that the | Note that, in the case of renewal operations, this means that the | |||
request will be signed and authenticated with the key in the | request will be signed and authenticated with the key in the | |||
previously-issued certificate rather than the key in the PKCS #10 | previously issued certificate rather than the key in the PKCS #10 | |||
request, and the response may similarly be returned encrypted with | request, and the response may similarly be returned encrypted with | |||
the key in the previously-issued certificate. This has security | the key in the previously issued certificate. This has security | |||
implications, see Section 8.6. | implications; see Section 7.6. | |||
2.4. Enrolment authorisation | 2.4. Enrolment Authorisation | |||
PKCS #10 [13] specifies a PKCS #9 [12] challengePassword attribute to | PKCS #10 [RFC2986] specifies a PKCS #9 [RFC2985] challengePassword | |||
be sent as part of the enrolment request. When utilizing the | attribute to be sent as part of the enrolment request. When | |||
challengePassword, the CA distributes a shared secret to the client | utilising the challengePassword, the CA distributes a shared secret | |||
which will be used to authenticate the request from the the client. | to the client, which will be used to authenticate the request from | |||
It is RECOMMENDED that the challengePassword be a one-time | the client. It is RECOMMENDED that the challengePassword be a one- | |||
authenticator value to limit the ability of an attacker who can | time authenticator value to limit the ability of an attacker who can | |||
capture the authenticator from the client or CA to re-use it to | capture the authenticator from the client or CA and reuse it to | |||
request further certificates. | request further certificates. | |||
Inclusion of the challengePassword by the SCEP client is RECOMMENDED, | Inclusion of the challengePassword by the SCEP client is RECOMMENDED; | |||
however its omission allows for unauthenticated authorisation of | however, its omission allows for unauthenticated authorisation of | |||
enrolment requests (which may, however, require manual approval of | enrolment requests (which may, however, require manual approval of | |||
each certificate issue if other security measures to control issue | each certificate issue if other security measures to control issue | |||
aren't in place, see below). Inclusion is OPTIONAL for renewal | aren't in place; see below). Inclusion is OPTIONAL for renewal | |||
requests that are authenticated by being signed with an existing | requests that are authenticated by being signed with an existing | |||
certificate. The CMS envelope protects the privacy of the | certificate. The CMS envelope protects the privacy of the | |||
challengePassword. | challengePassword. | |||
A client that is performing certificate renewal as per Section 2.5 | A client that is performing certificate renewal as per Section 2.5 | |||
SHOULD omit the challengePassword but MAY send the originally | SHOULD omit the challengePassword but MAY send the originally | |||
distributed shared secret in the challengePassword attribute. The | distributed shared secret in the challengePassword attribute. The | |||
SCEP CA MAY use the challengePassword in addition to the previously | SCEP CA MAY authenticate the request using the challengePassword in | |||
issued certificate that signs the request to authenticate the | addition to the previously issued certificate that signs the request. | |||
request. The SCEP CA MUST NOT attempt to authenticate a client based | The SCEP CA MUST NOT attempt to authenticate a client based on a | |||
on a self-signed certificate unless it has been verified through out- | self-signed certificate unless it has been verified through out-of- | |||
of-band means such as a certificate fingerprint. | band means such as a certificate fingerprint. | |||
To perform the authorisation in manual mode the client's request is | To perform the authorisation in manual mode, the client's request is | |||
placed in the PENDING state until the CA operator authorises or | placed in the PENDING state until the CA operator authorises or | |||
rejects it. Manual authorisation is used when the client has only a | rejects it. Manual authorisation is used when the client has only a | |||
self-signed certificate that hasn't been previously authenticated by | self-signed certificate that hasn't been previously authenticated by | |||
the CA and/or a challengePassword is not available. The SCEP CA MAY | the CA and/or a challengePassword is not available. The SCEP CA MAY | |||
either reject unauthorised requests or mark them for manual | either reject unauthorised requests or mark them for manual | |||
authorisation according to CA policy. | authorisation according to CA policy. | |||
2.5. Certificate Enrolment/Renewal | 2.5. Certificate Enrolment/Renewal | |||
A client starts an enrolment transaction (Section 3.3.1) by creating | A client starts an enrolment transaction (Section 3.3.1) by creating | |||
a certificate request using PKCS #10 and sends it to the CA enveloped | a certificate request using PKCS #10 and sends the request to the CA | |||
using CMS (Section 3). | enveloped using CMS (Section 3). | |||
If the CA supports certificate renewal and if the CA policy permits | If the CA supports certificate renewal and the CA policy permits, | |||
then a new certificate with new validity dates can be issued even | then a new certificate with new validity dates can be issued, even | |||
though the old one is still valid. To renew an existing certificate, | though the old one is still valid. To renew an existing certificate, | |||
the client uses the RenewalReq message (see Section 3.3) and signs it | the client uses the RenewalReq message (see Section 3.3) and signs it | |||
with the existing client certificate. The client SHOULD use a new | with the existing client certificate. The client SHOULD use a new | |||
keypair when requesting a new certificate, but MAY request a new | keypair when requesting a new certificate but MAY request a new | |||
certificate using the old keypair. | certificate using the old keypair. | |||
If the CA returns a CertRep message (Section 3.3.2) with status set | If the CA returns a CertRep message (Section 3.3.2) with status set | |||
to PENDING, the client enters into polling mode by periodically | to PENDING, the client enters into polling mode by periodically | |||
sending a CertPoll message (Section 3.3.3) to the CA until the CA | sending a CertPoll message (Section 3.3.3) to the CA until the CA | |||
operator completes the manual authentication (approving or denying | operator completes the manual authentication (approving or denying | |||
the request). The frequency of the polling operation is a CA/client | the request). The frequency of the polling operation is a CA/client | |||
configuration issue, and may range from seconds or minutes when the | configuration issue and may range from seconds or minutes when the | |||
issue process is automatic but not instantaneous, through to hours or | issue process is automatic but not instantaneous, through to hours or | |||
days if the certificate issue operation requires manual approval. | days if the certificate-issue operation requires manual approval. | |||
If polling mode is being used then the client will send a single | If polling mode is being used, then the client will send a single | |||
PKCSReq/RenewalReq message (Section 3.3.1), followed by 0 or more | PKCSReq/RenewalReq message (Section 3.3.1), followed by 0 or more | |||
CertPoll messages (Section 3.3.3). The CA will in return send 0 or | CertPoll messages (Section 3.3.3). The CA will, in return, send 0 or | |||
more CertRep messages (Section 3.3.2) with status set to PENDING in | more CertRep messages (Section 3.3.2) with status set to PENDING in | |||
response to CertPolls, followed by a single CertRep message | response to CertPolls, followed by a single CertRep message | |||
(Section 3.3.2) with status set to either SUCCESS or FAILURE. | (Section 3.3.2) with status set to either SUCCESS or FAILURE. | |||
2.5.1. Client State Transitions | 2.5.1. Client State Transitions | |||
The client state transitions during the SCEP process are indicated in | The client state transitions during the SCEP process are indicated in | |||
Figure 1. | Figure 1. | |||
CertPoll | CertPoll | |||
+-----<----+ | +-----<----+ | |||
| | | | | | |||
| | CertRep(PENDING) | | | CertRep(PENDING) | |||
| | | | | | |||
[CERT-NONEXISTENT] ------> [CERT-REQ-PENDING] ---------> [CERT-ISSUED] | [CERT-NONEXISTENT] ------> [CERT-REQ-PENDING] --------> [CERT-ISSUED] | |||
^ PKCSReq | CertRep(SUCCESS) | ^ PKCSReq | CertRep(SUCCESS) | |||
| RenewalReq | | | RenewalReq | | |||
| | | | | | |||
+-----------------------+ | +-----------------------+ | |||
CertRep(FAILURE) or | CertRep(FAILURE) or | |||
Max-time/max-polls exceeded | Max-time/max-polls exceeded | |||
Figure 1: State Transition Diagram | Figure 1: State Transition Diagram | |||
The certificate issue process starts at state CERT-NONEXISTENT. | The certificate-issue process starts at state CERT-NONEXISTENT. | |||
Sending a PKCSReq/RenewalReq message changes the state to CERT-REQ- | Sending a PKCSReq/RenewalReq message changes the state to CERT-REQ- | |||
PENDING. | PENDING. | |||
If the CA returns a CertRep message with pkiStatus set to SUCCESS | If the CA returns a CertRep message with pkiStatus set to SUCCESS, | |||
then the state changes to CERT-ISSUED. | then the state changes to CERT-ISSUED. | |||
If the CA returns a CertRep message with pkiStatus set to FAILURE or | 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. | there is no response, then the state reverts back to CERT- | |||
NONEXISTENT. | ||||
If the CA returns a CertRep message with pkiStatus set to PENDING | If the CA returns a CertRep message with pkiStatus set to PENDING, | |||
then the client will keep polling by sending a CertPoll message until | then the client will keep polling by sending a CertPoll message until | |||
either a CertRep message with status set to SUCCESS or FAILURE is | 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 | received, a timeout occurs, or the maximum number of polls has been | |||
exceeded. | exceeded. | |||
A successful transaction in automatic mode: | Figure 2 shows a successful transaction in automatic mode | |||
CLIENT CA SERVER | CLIENT CA SERVER | |||
PKCSReq: PKI cert. enrolment message | PKCSReq: PKI cert. enrolment message | |||
--------------------------------> CertRep: pkiStatus = SUCCESS | --------------------------------> CertRep: pkiStatus = SUCCESS | |||
Certificate attached | Certificate attached | |||
<------------------------------ | <------------------------------ | |||
Receive issued certificate. | Receive issued certificate. | |||
A successful transaction in manual mode: | Figure 2: Automatic Mode | |||
Figure 3 shows a successful transaction in manual mode: | ||||
CLIENT CA SERVER | CLIENT CA SERVER | |||
PKCSReq: PKI cert. enrolment message | PKCSReq: PKI cert. enrolment message | |||
--------------------------------> CertRep: pkiStatus = PENDING | --------------------------------> CertRep: pkiStatus = PENDING | |||
<------------------------------ | <------------------------------ | |||
CertPoll: Polling message | CertPoll: Polling message | |||
--------------------------------> CertRep: pkiStatus = PENDING | --------------------------------> CertRep: pkiStatus = PENDING | |||
<------------------------------ | <------------------------------ | |||
................ <Manual identity authentication> ............... | ................ <Manual identity authentication> ............... | |||
CertPoll: Polling message | CertPoll: Polling message | |||
--------------------------------> CertRep: pkiStatus = SUCCESS | --------------------------------> CertRep: pkiStatus = SUCCESS | |||
Certificate attached | Certificate attached | |||
<------------------------------ | <------------------------------ | |||
Receive issued certificate. | Receive issued certificate. | |||
Figure 3: Manual Mode | ||||
2.6. Certificate Access | 2.6. Certificate Access | |||
A certificate query message is defined for clients to retrieve a copy | 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 | of their own certificate from the CA. It allows clients that do not | |||
store their certificates locally to obtain a copy when needed. This | store their certificates locally to obtain a copy when needed. This | |||
functionality is not intended to provide a general purpose | functionality is not intended to provide a general-purpose | |||
certificate access service, which may be instead be achieved via HTTP | certificate-access service, which may be achieved instead via HTTP | |||
certificate-store access [17] or LDAP. | certificate-store access [RFC4387] or Lightweight Directory Access | |||
Protocol (LDAP). | ||||
To retrieve a certificate from the CA, a client sends a request | To retrieve a certificate from the CA, a client sends a request | |||
consisting of the certificate's issuer name and serial number. This | consisting of the certificate's issuer name and serial number. This | |||
assumes that the client has saved the issuer name and the serial | assumes that the client has saved the issuer name and the serial | |||
number of the issued certificate from the previous enrolment | number of the issued certificate from the previous enrolment | |||
transaction. The transaction to retrieve a certificate consists of | transaction. The transaction to retrieve a certificate consists of | |||
one GetCert (Section 3.3.4) message and one CertRep (Section 3.3.2) | one GetCert (Section 3.3.4) message and one CertRep (Section 3.3.2) | |||
message, as shown below. | message, as shown in Figure 4. | |||
CLIENT CA SERVER | CLIENT CA SERVER | |||
GetCert: PKI certificate query message | GetCert: PKI certificate query message | |||
-------------------------------> CertRep: pkiStatus = SUCCESS | -------------------------------> CertRep: pkiStatus = SUCCESS | |||
Certificate attached | Certificate attached | |||
<----------------------------- | <----------------------------- | |||
Receive the certificate. | Receive the certificate. | |||
Figure 4: Retrieving a Certificate | ||||
2.7. CRL Access | 2.7. CRL Access | |||
SCEP clients MAY request a CRL via one of three methods: | SCEP clients MAY request a CRL via one of three methods: | |||
1. If the CA supports the CRL Distribution Points (CRLDPs) extension | 1. If the CA supports the CRL Distribution Points (CRLDPs) extension | |||
[14] in issued certificates, then the CRL MAY be retrieved via | [RFC5280] in issued certificates, then the CRL MAY be retrieved | |||
the mechanism specified in the CRDLP. | via the mechanism specified in the CRLDP. | |||
2. If the CA supports HTTP certificate-store access [17], then the | ||||
CRL MAY be retrieved via the AuthorityInfoAcces [14] location | 2. If the CA supports HTTP certificate-store access [RFC4387], then | |||
specified in the certificate. | the CRL MAY be retrieved via the AuthorityInfoAcces [RFC5280] | |||
3. Only if the CA does not support CRDLPs or HTTP access should a | location specified in the certificate. | |||
3. Only if the CA does not support CRLDPs or HTTP access should a | ||||
CRL query be composed by creating a GetCRL message consisting of | CRL query be composed by creating a GetCRL message consisting of | |||
the issuer name and serial number from the certificate whose | the issuer name and serial number from the certificate whose | |||
revocation status is being queried. | revocation status is being queried. | |||
The message is sent to the SCEP CA in the same way as the other SCEP | 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 | requests. The transaction to retrieve a CRL consists of one GetCRL | |||
PKI message and one CertRep PKI message, which contains only the CRL | PKI message and one CertRep PKI message, which contains only the CRL | |||
(no certificates) in a degenerate certificates-only CMS Signed-Data | (no certificates) in a degenerate certificates-only CMS SignedData | |||
message (Section 3.4), as shown below. | message (Section 3.4), as shown in Figure 5. | |||
CLIENT CA SERVER | CLIENT CA SERVER | |||
GetCRL: PKI CRL query message | GetCRL: PKI CRL query message | |||
----------------------------------> | ----------------------------------> | |||
CertRep: CRL attached | CertRep: CRL attached | |||
<----------------------------- | <----------------------------- | |||
Receive the CRL | Receive the CRL | |||
Figure 5: Retrieving a CRL | ||||
2.8. Certificate Revocation | 2.8. Certificate Revocation | |||
SCEP does not specify a method to request certificate revocation. In | SCEP does not specify a method to request certificate revocation. In | |||
order to revoke a certificate, the client must contact the CA using a | order to revoke a certificate, the client must contact the CA using a | |||
non-SCEP defined mechanism. | non-SCEP-defined mechanism. | |||
2.9. Mandatory-to-Implement Functionality | 2.9. Mandatory-to-Implement Functionality | |||
At a minimum, all SCEP implementations compliant with this | At a minimum, all SCEP implementations compliant with this | |||
specification MUST support GetCACaps (Section 3.5.1), GetCACert | specification MUST support GetCACaps (Section 3.5.1), GetCACert | |||
(Section 4.2), PKCSReq (Section 3.3.1) (and its associated response | (Section 4.2), PKCSReq (Section 3.3.1) (and its associated response | |||
messages), communication of binary data via HTTP POST (Section 4.1), | messages), communication of binary data via HTTP POST (Section 4.1), | |||
and the AES128-CBC [7] and SHA-256 [8] algorithms to secure | and the AES128-CBC [AES] and SHA-256 [SHA2] algorithms to secure | |||
pkiMessages (Section 3.2). | pkiMessages (Section 3.2). | |||
For historical reasons implementations MAY support communications of | For historical reasons, implementations MAY support communications of | |||
binary data via HTTP GET (Section 4.1), and the triple DES-CBC and | binary data via HTTP GET (Section 4.1), and the triple DES-CBC and | |||
SHA-1 algorithms to secure pkiMessages (Section 3.2). | SHA-1 algorithms to secure pkiMessages (Section 3.2). | |||
Implementations MUST NOT support the obsolete and/or insecure single | Implementations MUST NOT support the obsolete and/or insecure single | |||
DES and MD5 algorithms used in earlier versions of this | DES and MD5 algorithms used in earlier versions of this | |||
specification, since the unsecured nature of GetCACaps means that an | specification, since the unsecured nature of GetCACaps means that an | |||
in-path attacker can trivially roll back the encryption used to these | in-path attacker can trivially roll back the encryption used to these | |||
insecure algorithms, see Section 8.5. | insecure algorithms; see Section 7.5. | |||
3. SCEP Secure Message Objects | 3. SCEP Secure Message Objects | |||
CMS is a general enveloping mechanism that enables both signed and | CMS is a general enveloping mechanism that enables both signed and | |||
encrypted transmission of arbitrary data. SCEP messages that require | encrypted transmission of arbitrary data. SCEP messages that require | |||
confidentiality use two layers of CMS, as shown using ASN.1-like | confidentiality use two layers of CMS, as shown using ASN.1-like | |||
pseudocode in Figure 2. By applying both enveloping and signing | pseudocode in Figure 6. By applying both enveloping and signing | |||
transformations, the SCEP message is protected both for the integrity | transformations, the SCEP message is protected both for the integrity | |||
of its end-to-end transaction information and the confidentiality of | of its end-to-end transaction information and the confidentiality of | |||
its information portion. | its information portion. | |||
pkiMessage { | pkiMessage { | |||
contentType = signedData { pkcs-7 2 }, | contentType = signedData { pkcs-7 2 }, | |||
content { | content { | |||
digestAlgorithms, | digestAlgorithms, | |||
encapsulatedContentInfo { | encapsulatedContentInfo { | |||
eContentType = data { pkcs-7 1 }, | eContentType = data { pkcs-7 1 }, | |||
skipping to change at page 13, line 40 ¶ | skipping to change at line 575 ¶ | |||
messageType, | messageType, | |||
pkiStatus, | pkiStatus, | |||
failInfo, -- Optional | failInfo, -- Optional | |||
senderNonce / recipientNonce, | senderNonce / recipientNonce, | |||
}, | }, | |||
signature | signature | |||
} | } | |||
} | } | |||
} | } | |||
Figure 2: CMS Layering | Figure 6: CMS Layering | |||
When a particular SCEP message carries data, this data is carried in | When a particular SCEP message carries data, this data is carried in | |||
the messageData. CertRep messages will lack any signed content and | the messageData. CertRep messages will lack any signed content and | |||
consist only of a pkcsPKIEnvelope (Section 3.2.2). | consist only of a pkcsPKIEnvelope (Section 3.2.2). | |||
The remainder of this document will refer only to 'messageData', but | The remainder of this document will refer only to "messageData", but | |||
it is understood to always be encapsulated in the pkcsPKIEnvelope | it is understood to always be encapsulated in the pkcsPKIEnvelope | |||
(Section 3.2.2). The format of the data in the messageData is | (Section 3.2.2). The format of the data in the messageData is | |||
defined by the messageType attribute (see Section 3.2) of the Signed- | defined by the messageType attribute (see Section 3.2) of the | |||
Data. If there is no messageData to be transmitted, the entire | SignedData. If there is no messageData to be transmitted, the entire | |||
pkcsPKIEnvelope MUST be omitted. | pkcsPKIEnvelope MUST be omitted. | |||
Samples of SCEP messages are available through the JSCEP project [18] | Samples of SCEP messages are available through the JSCEP project | |||
in the src/samples directory. | [JSCEP] in the src/samples directory. | |||
3.1. SCEP Message Object Processing | 3.1. SCEP Message Object Processing | |||
Creating a SCEP message consists of several stages. The content to | Creating a SCEP message consists of several stages. The content to | |||
be conveyed (in other words the messageData) is first encrypted, and | be conveyed (in other words, the messageData) is first encrypted, and | |||
the encrypted content is then signed. | the encrypted content is then signed. | |||
The form of encryption to be applied depends on the capabilities of | The form of encryption to be applied depends on the capabilities of | |||
the recipient's public key. If the key is encryption-capable (for | the recipient's public key. If the key is encryption capable (for | |||
example RSA) then the messageData is encrypted using the recipient's | example, RSA), then the messageData is encrypted using the | |||
public key with the CMS KeyTransRecipientInfo mechanism. If the key | recipient's public key with the CMS KeyTransRecipientInfo mechanism. | |||
is not encryption-capable (for example DSA or ECDSA) then the | If the key is not encryption capable (for example, DSA or ECDSA), | |||
messageData is encrypted using the challengePassword with the CMS | then the messageData is encrypted using the challengePassword with | |||
PasswordRecipientInfo mechanism. | the CMS PasswordRecipientInfo mechanism. | |||
Once the messageData has been encrypted, it is signed with the | Once the messageData has been encrypted, it is signed with the | |||
sender's public key. This completes the SCEP message that is then | sender's public key. This completes the SCEP message, which is then | |||
sent to the recipient. | sent to the recipient. | |||
Note that some early implementations of this specification dealt with | Note that some early implementations of this specification dealt with | |||
non-encryption-capable keys by omitting the encryption stage, based | keys that were not encryption capable by omitting the encryption | |||
on the text in Section 3 that indicated that "the EnvelopedData is | stage, based on the text in Section 3 that indicated that "the | |||
omitted". This alternative processing mechanism SHOULD NOT be used | EnvelopedData is omitted". This alternative processing mechanism | |||
since it exposes in cleartext the challengePassword used to authorise | SHOULD NOT be used since it exposes in cleartext the | |||
the certificate issue. | challengePassword used to authorise the certificate issue. | |||
3.2. SCEP pkiMessage | 3.2. SCEP pkiMessage | |||
The basic building block of all secured SCEP messages is the SCEP | The basic building block of all secured SCEP messages is the SCEP | |||
pkiMessage. It consists of a CMS Signed-Data content type. The | pkiMessage. It consists of a CMS SignedData content type. The | |||
following restrictions apply: | following restrictions apply: | |||
o The eContentType in encapsulatedContentInfo MUST be data ({pkcs-7 | * The eContentType in encapsulatedContentInfo MUST be data ({pkcs-7 | |||
1}). | 1}). | |||
o The signed content, if present (FAILURE and PENDING CertRep | * The signed content, if present (FAILURE and PENDING CertRep | |||
messages will lack any signed content), MUST be a pkcsPKIEnvelope | messages will lack any signed content), MUST be a pkcsPKIEnvelope | |||
(Section 3.2.2), and MUST match the messageType attribute. | (Section 3.2.2) and MUST match the messageType attribute. | |||
o The SignerInfo MUST contain a set of authenticatedAttributes | * The SignerInfo MUST contain a set of authenticatedAttributes | |||
(Section 3.2.1). | (Section 3.2.1). | |||
3.2.1. Signed Transaction Attributes | 3.2.1. Signed Transaction Attributes | |||
At a minimum, all messages MUST contain the following | At a minimum, all messages MUST contain the following | |||
authenticatedAttributes: | authenticatedAttributes: | |||
o A transactionID attribute (see Section 3.2.1.1). | * A transactionID attribute (see Section 3.2.1.1). | |||
* A messageType attribute (see Section 3.2.1.2). | ||||
o A messageType attribute (see Section 3.2.1.2). | * A fresh senderNonce attribute (see Section 3.2.1.5). However, | |||
o A fresh senderNonce attribute (see Section 3.2.1.5). Note however | note the comment about senderNonces and polling in Section 3.3.2 | |||
the comment about senderNonces and polling in Section 3.3.2 | * Any attributes required by CMS. | |||
o Any attributes required by CMS. | ||||
If the message is a CertRep, it MUST also include the following | If the message is a CertRep, it MUST also include the following | |||
authenticatedAttributes: | authenticatedAttributes: | |||
o A pkiStatus attribute (see Section 3.2.1.3). | * A pkiStatus attribute (see Section 3.2.1.3). | |||
o A failInfo and optional failInfotext attribute (see | * failInfo and optional failInfoText attributes (see | |||
Section 3.2.1.4) if pkiStatus = FAILURE. | Section 3.2.1.4) if pkiStatus = FAILURE. | |||
o A recipientNonce attribute (see Section 3.2.1.5) copied from the | * A recipientNonce attribute (see Section 3.2.1.5) copied from the | |||
senderNonce in the request that this is a response to. | senderNonce in the request that this is a response to. | |||
The following transaction attributes are encoded as authenticated | The following transaction attributes are encoded as authenticated | |||
attributes, and are carried in the SignerInfo for this Signed-Data. | attributes and carried in the SignerInfo for this SignedData. | |||
+================+=================+==============================+ | ||||
| Attribute | Encoding | Comment | | ||||
+================+=================+==============================+ | ||||
| transactionID | PrintableString | Unique ID for this | | ||||
| | | transaction as a text string | | ||||
+----------------+-----------------+------------------------------+ | ||||
| messageType | PrintableString | Decimal value as a numeric | | ||||
| | | text string | | ||||
+----------------+-----------------+------------------------------+ | ||||
| pkiStatus | PrintableString | Decimal value as a numeric | | ||||
| | | text string | | ||||
+----------------+-----------------+------------------------------+ | ||||
| failInfo | PrintableString | Decimal value as a numeric | | ||||
| | | text string | | ||||
+----------------+-----------------+------------------------------+ | ||||
| failInfoText | UTF8String | Descriptive text for the | | ||||
| | | failInfo value | | ||||
+----------------+-----------------+------------------------------+ | ||||
| senderNonce | OCTET STRING | Random nonce as a 16-byte | | ||||
| | | binary data string | | ||||
+----------------+-----------------+------------------------------+ | ||||
| recipientNonce | OCTET STRING | Random nonce as a 16-byte | | ||||
| | | binary data string | | ||||
+----------------+-----------------+------------------------------+ | ||||
Table 1: SCEP Attributes | ||||
+----------------+-----------------+--------------------------------+ | ||||
| Attribute | Encoding | Comment | | ||||
+----------------+-----------------+--------------------------------+ | ||||
| transactionID | PrintableString | Unique ID for this | | ||||
| | | transaction as a text string | | ||||
| | | | | ||||
| messageType | PrintableString | Decimal value as a | | ||||
| | | numeric text string | | ||||
| | | | | ||||
| pkiStatus | PrintableString | Decimal value as a | | ||||
| | | numeric text string | | ||||
| | | | | ||||
| failInfo | PrintableString | Decimal value as a | | ||||
| | | numeric text string | | ||||
| | | | | ||||
| failInfoText | UTF8String | Descriptive text for the | | ||||
| | | failInfo value | | ||||
| | | | | ||||
| senderNonce | OCTET STRING | Random nonce as a 16-byte | | ||||
| | | binary data string | | ||||
| | | | | ||||
| recipientNonce | OCTET STRING | Random nonce as a | | ||||
| | | 16-byte binary data string | | ||||
+----------------+-----------------+--------------------------------+ | ||||
The OIDs used for these attributes are as follows: | The OIDs used for these attributes are as follows: | |||
+----------------------+--------------------------------------------+ | +======================+===============================+ | |||
| Name | ASN.1 Definition | | | Name | ASN.1 Definition | | |||
+----------------------+--------------------------------------------+ | +======================+===============================+ | |||
| id-VeriSign | OBJECT_IDENTIFIER ::= {2 16 US(840) 1 | | | id-VeriSign | OBJECT_IDENTIFIER ::= {2 16 | | |||
| | VeriSign(113733)} | | | | US(840) 1 VeriSign(113733)} | | |||
| | | | +----------------------+-------------------------------+ | |||
| id-pki | OBJECT_IDENTIFIER ::= {id-VeriSign pki(1)} | | | id-pki | OBJECT_IDENTIFIER ::= {id- | | |||
| | | | | | VeriSign pki(1)} | | |||
| id-attributes | OBJECT_IDENTIFIER ::= {id-pki | | +----------------------+-------------------------------+ | |||
| | attributes(9)} | | | id-attributes | OBJECT_IDENTIFIER ::= {id-pki | | |||
| | | | | | attributes(9)} | | |||
| id-transactionID | OBJECT_IDENTIFIER ::= {id-attributes | | +----------------------+-------------------------------+ | |||
| | transactionID(7)} | | | id-transactionID | OBJECT_IDENTIFIER ::= {id- | | |||
| | | | | | attributes transactionID(7)} | | |||
| id-messageType | OBJECT_IDENTIFIER ::= {id-attributes | | +----------------------+-------------------------------+ | |||
| | messageType(2)} | | | id-messageType | OBJECT_IDENTIFIER ::= {id- | | |||
| | | | | | attributes messageType(2)} | | |||
| id-pkiStatus | OBJECT_IDENTIFIER ::= {id-attributes | | +----------------------+-------------------------------+ | |||
| | pkiStatus(3)} | | | id-pkiStatus | OBJECT_IDENTIFIER ::= {id- | | |||
| | | | | | attributes pkiStatus(3)} | | |||
| id-failInfo | OBJECT_IDENTIFIER ::= {id-attributes | | +----------------------+-------------------------------+ | |||
| | failInfo(4)} | | | id-failInfo | OBJECT_IDENTIFIER ::= {id- | | |||
| | | | | | attributes failInfo(4)} | | |||
| id-senderNonce | OBJECT_IDENTIFIER ::= {id-attributes | | +----------------------+-------------------------------+ | |||
| | senderNonce(5)} | | | id-senderNonce | OBJECT_IDENTIFIER ::= {id- | | |||
| | | | | | attributes senderNonce(5)} | | |||
| id-recipientNonce | OBJECT_IDENTIFIER ::= {id-attributes | | +----------------------+-------------------------------+ | |||
| | recipientNonce(6)} | | | id-recipientNonce | OBJECT_IDENTIFIER ::= {id- | | |||
| | | | | | attributes recipientNonce(6)} | | |||
| id-scep | OBJECT IDENTIFIER ::= {id-pkix TBD1} | | +----------------------+-------------------------------+ | |||
| | | | | id-scep | OBJECT IDENTIFIER ::= {id- | | |||
| id-scep-failInfoText | OBJECT IDENTIFIER ::= {id-scep 1} | | | | pkix 24} | | |||
+----------------------+--------------------------------------------+ | +----------------------+-------------------------------+ | |||
| id-scep-failInfoText | OBJECT IDENTIFIER ::= {id- | | ||||
| | scep 1} | | ||||
+----------------------+-------------------------------+ | ||||
Table 2: SCEP Attribute OIDs | ||||
The attributes are detailed in the following sections. | The attributes are detailed in the following sections. | |||
3.2.1.1. transactionID | 3.2.1.1. transactionID | |||
A PKI operation is a transaction consisting of the messages exchanged | A PKI operation is a transaction consisting of the messages exchanged | |||
between a client and the CA. The transactionID is a text string | between a client and the CA. The transactionID is a text string | |||
provided by the client when starting a transaction. The client MUST | provided by the client when starting a transaction. The client MUST | |||
use a unique string as the transaction identifier, encoded as a | use a unique string as the transaction identifier, encoded as a | |||
PrintableString, which MUST be used for all PKI messages exchanged | PrintableString, which MUST be used for all PKI messages exchanged | |||
for a given operation such as a certificate issue. | for a given operation, such as a certificate issue. | |||
Note that the transactionID must be unique, but not necessarily | Note that the transactionID must be unique, but not necessarily | |||
randomly generated. For example it may be a value assigned by the CA | randomly generated. For example, it may be a value assigned by the | |||
to allow the client to be identified by their transactionID, using a | CA to allow the client to be identified by their transactionID, using | |||
value such as the client device's EUI or RTU ID or a similar unique | a value such as the client device's Extended Unique Identifier (EUI), | |||
identifier. This can be useful when the client doesn't have a pre- | Remote Terminal Unit (RTU) ID, or a similar unique identifier. This | |||
assigned Distinguished Name that the CA can identify their request | can be useful when the client doesn't have a preassigned | |||
through, for example when enrolling SCADA devices. | Distinguished Name through which the CA can identify their request -- | |||
for example, when enrolling Supervisory Control and Data Acquisition | ||||
(SCADA) devices. | ||||
3.2.1.2. messageType | 3.2.1.2. messageType | |||
The messageType attribute specifies the type of operation performed | The messageType attribute specifies the type of operation performed | |||
by the transaction. This attribute MUST be included in all PKI | by the transaction. This attribute MUST be included in all PKI | |||
messages. The following message types are defined: | messages. The following message types are defined: | |||
o CertRep ("3") -- Response to certificate or CRL request. | +=======+============+============================================+ | |||
o RenewalReq ("17") -- PKCS #10 certificate request authenticated | | Value | Name | Description | | |||
with an existing certificate. | +=======+============+============================================+ | |||
o PKCSReq ("19") -- PKCS #10 certificate request authenticated with | | 0 | Reserved | | | |||
a shared secret. | +-------+------------+--------------------------------------------+ | |||
o CertPoll ("20") -- Certificate polling in manual enrolment. | | 3 | CertRep | Response to certificate or CRL request. | | |||
o GetCert ("21") -- Retrieve a certificate. | +-------+------------+--------------------------------------------+ | |||
o GetCRL ("22") -- Retrieve a CRL. | | 17 | RenewalReq | PKCS #10 certificate request authenticated | | |||
| | | with an existing certificate. | | ||||
+-------+------------+--------------------------------------------+ | ||||
| 19 | PKCSReq | PKCS #10 certificate request authenticated | | ||||
| | | with a shared secret. | | ||||
+-------+------------+--------------------------------------------+ | ||||
| 20 | CertPoll | Certificate polling in manual enrolment. | | ||||
+-------+------------+--------------------------------------------+ | ||||
| 21 | GetCert | Retrieve a certificate. | | ||||
+-------+------------+--------------------------------------------+ | ||||
| 22 | GetCRL | Retrieve a CRL. | | ||||
+-------+------------+--------------------------------------------+ | ||||
Message types not defined above MUST be treated as an error unless | Table 3: SCEP Message Types | |||
Message types not defined above MUST be treated as errors unless | ||||
their use has been negotiated through GetCACaps (Section 3.5.1). | their use has been negotiated through GetCACaps (Section 3.5.1). | |||
3.2.1.3. pkiStatus | 3.2.1.3. pkiStatus | |||
All response messages MUST include transaction status information, | All response messages MUST include transaction status information, | |||
which is defined as a pkiStatus attribute: | which is defined as a pkiStatus attribute: | |||
o SUCCESS ("0") -- Request granted. | +=======+=========+========================================+ | |||
o FAILURE ("2") -- Request rejected. In this case the failInfo | | Value | Name | Description | | |||
attribute, as defined in Section 3.2.1.4, MUST also be present. | +=======+=========+========================================+ | |||
o PENDING ("3") -- Request pending for manual approval. | | 0 | SUCCESS | Request granted. | | |||
+-------+---------+----------------------------------------+ | ||||
| 2 | FAILURE | Request rejected. In this case, the | | ||||
| | | failInfo attribute, as defined in | | ||||
| | | Section 3.2.1.4, MUST also be present. | | ||||
+-------+---------+----------------------------------------+ | ||||
| 3 | PENDING | Request pending for manual approval. | | ||||
+-------+---------+----------------------------------------+ | ||||
PKI status values not defined above MUST be treated as an error | Table 4: pkiStatus Attributes | |||
unless their use has been negotiated through GetCACaps | ||||
(Section 3.5.1). | PKI status values not defined above MUST be treated as errors unless | |||
their use has been negotiated through GetCACaps (Section 3.5.1). | ||||
3.2.1.4. failInfo and failInfoText | 3.2.1.4. failInfo and failInfoText | |||
The failInfo attribute MUST contain one of the following failure | The failInfo attribute MUST contain one of the following failure | |||
reasons: | reasons: | |||
o badAlg ("0") -- Unrecognized or unsupported algorithm. | +=======+=================+==================================+ | |||
o badMessageCheck ("1") -- Integrity check (meaning signature | | Value | Name | Description | | |||
verification of the CMS message) failed. | +=======+=================+==================================+ | |||
| 0 | badAlg | Unrecognised or unsupported | | ||||
| | | algorithm. | | ||||
+-------+-----------------+----------------------------------+ | ||||
| 1 | badMessageCheck | Integrity check (meaning | | ||||
| | | signature verification of the | | ||||
| | | CMS message) failed. | | ||||
+-------+-----------------+----------------------------------+ | ||||
| 2 | badRequest | Transaction not permitted or | | ||||
| | | supported. | | ||||
+-------+-----------------+----------------------------------+ | ||||
| 3 | badTime | The signingTime attribute from | | ||||
| | | the CMS authenticatedAttributes | | ||||
| | | was not sufficiently close to | | ||||
| | | the system time. This condition | | ||||
| | | may occur if the CA is concerned | | ||||
| | | about replays of old messages. | | ||||
+-------+-----------------+----------------------------------+ | ||||
| 4 | badCertId | No certificate could be | | ||||
| | | identified matching the provided | | ||||
| | | criteria. | | ||||
+-------+-----------------+----------------------------------+ | ||||
o badRequest ("2") -- Transaction not permitted or supported. | Table 5: failInfo Attributes | |||
o badTime ("3") -- The signingTime attribute from the CMS | ||||
authenticatedAttributes was not sufficiently close to the system | ||||
time. This condition may occur if the CA is concerned about | ||||
replays of old messages. | ||||
o badCertId ("4") -- No certificate could be identified matching the | ||||
provided criteria. | ||||
Failure reasons not defined above MUST be treated as an error unless | Failure reasons not defined above MUST be treated as errors unless | |||
their use has been negotiated through GetCACaps (Section 3.5.1). | their use has been negotiated through GetCACaps (Section 3.5.1). | |||
The failInfoText is a free-form UTF-8 text string that provides | The failInfoText is a free-form UTF-8 text string that provides | |||
further information in the case of pkiStatus = FAILURE. In | further information in the case of pkiStatus = FAILURE. In | |||
particular it may be used to provide details on why a certificate | particular, it may be used to provide details on why a certificate | |||
request was not granted that go beyond what's provided by the near- | request was not granted that go beyond what's provided by the near- | |||
universal failInfo = badRequest status. Since this is a free-form | universal failInfo = badRequest status. Since this is a free-form | |||
text string intended for interpretation by humans, implementations | text string intended for interpretation by humans, implementations | |||
SHOULD NOT assume that it has any type of machine-processable | SHOULD NOT assume that it has any type of machine-processable | |||
content. | content. | |||
3.2.1.5. senderNonce and recipientNonce | 3.2.1.5. senderNonce and recipientNonce | |||
The senderNonce and recipientNonce attributes are a 16 byte random | The senderNonce and recipientNonce attributes are each a 16-byte | |||
number generated for each transaction. These are intended to prevent | random number generated for each transaction. These are intended to | |||
replay attacks. | prevent replay attacks. | |||
When a sender sends a PKI message to a recipient, a fresh senderNonce | When a sender sends a PKI message to a recipient, a fresh senderNonce | |||
MUST be included in the message. The recipient MUST copy the | MUST be included in the message. The recipient MUST copy the | |||
senderNonce into the recipientNonce of the reply as a proof of | senderNonce into the recipientNonce of the reply as a proof of | |||
liveliness. The original sender MUST verify that the recipientNonce | liveliness. The original sender MUST verify that the recipientNonce | |||
of the reply matches the senderNonce it sent in the request. If the | of the reply matches the senderNonce it sent in the request. If the | |||
nonce does not match then the message MUST be rejected. | nonce does not match, then the message MUST be rejected. | |||
Note that since SCEP exchanges consist of a single request followed | Note that since SCEP exchanges consist of a single request followed | |||
by a single response, the use of distinct sender and recipient nonces | 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 | is redundant, since the client sends a nonce in its request and the | |||
responds with the same nonce in its reply. In effect there's just a | CA responds with the same nonce in its reply. In effect, there's | |||
single nonce, identified as senderNonce in the client's request and | just a single nonce, identified as senderNonce in the client's | |||
recipientNonce in the CA's reply. | request and recipientNonce in the CA's reply. | |||
3.2.2. SCEP pkcsPKIEnvelope | 3.2.2. SCEP pkcsPKIEnvelope | |||
The information portion of a SCEP message is carried inside an | The information portion of a SCEP message is carried inside an | |||
EnvelopedData content type, as defined in CMS, with the following | EnvelopedData content type, as defined in CMS, with the following | |||
restrictions: | restrictions: | |||
o contentType in encryptedContentInfo MUST be data ({pkcs-7 1}). | * contentType in encryptedContentInfo MUST be data ({pkcs-7 1}). | |||
* encryptedContent MUST be the SCEP message being transported (see | ||||
o encryptedContent MUST be the SCEP message being transported (see | Section 4) and MUST match the messageType authenticated Attribute | |||
Section 4), and must match the messageType authenticated Attribute | ||||
in the pkiMessage. | in the pkiMessage. | |||
3.3. SCEP pkiMessage types | 3.3. SCEP pkiMessage types | |||
All of the messages in this section are pkiMessages (Section 3.2), | All of the messages in this section are pkiMessages (Section 3.2), | |||
where the type of the message MUST be specified in the 'messageType' | where the type of the message MUST be specified in the "messageType" | |||
authenticated Attribute. Each section defines a valid message type, | authenticated Attribute. Each section defines a valid message type, | |||
the corresponding messageData formats, and mandatory authenticated | the corresponding messageData formats, and mandatory authenticated | |||
attributes for that type. | attributes for that type. | |||
3.3.1. PKCSReq/RenewalReq | 3.3.1. PKCSReq/RenewalReq | |||
The messageData for this type consists of a PKCS #10 Certificate | The messageData for this type consists of a PKCS #10 Certificate | |||
Request. The certificate request MUST contain at least the following | Request. The certificate request MUST contain at least the following | |||
items: | items: | |||
o The subject Distinguished Name. | * The subject Distinguished Name. | |||
o The subject public key. | * The subject public key. | |||
o For a PKCSReq and if authorisation based on a shared secret is | * For a PKCSReq, if authorisation based on a shared secret is being | |||
being used, a challengePassword attribute. | used, a challengePassword attribute. | |||
In addition the message must contain the the authenticatedAttributes | In addition, the message must contain the authenticatedAttributes | |||
specified in Section 3.2.1. | specified in Section 3.2.1. | |||
3.3.2. CertRep | 3.3.2. CertRep | |||
The messageData for this type consists of a degenerate certificates- | The messageData for this type consists of a degenerate certificates- | |||
only CMS Signed-Data message (Section 3.4). The exact content | only CMS SignedData message (Section 3.4). The exact content | |||
required for the reply depends on the type of request that this | required for the reply depends on the type of request that this | |||
message is a response to. The request types are detailed in | message is a response to. The request types are detailed in Sections | |||
Section 3.3.2.1 and in Section 4. In addition the message must | 3.3.2.1 and 4. In addition, the message must contain the | |||
contain the the authenticatedAttributes specified in Section 3.2.1. | authenticatedAttributes specified in Section 3.2.1. | |||
Earlier versions of this specification required that this message | Earlier draft versions of this specification required that this | |||
include a senderNonce alongside the recipientNonce, which was to be | message include a senderNonce alongside the recipientNonce, which was | |||
used to chain to subsequent polling operations. However if a single | to be used to chain to subsequent polling operations. However, if a | |||
message was lost during the potentially extended interval over which | single message was lost during the potentially extended interval over | |||
polling could take place (see Section 5 for an example of this) then | which polling could take place (see Section 5 for an example of | |||
if the implementation were to enforce this requirement the overall | this), then if the implementation were to enforce this requirement, | |||
transaction would fail even though nothing had actually gone wrong. | the overall transaction would fail, even though nothing had actually | |||
Because of this issue, implementations mostly ignored the requirement | gone wrong. Because of this issue, implementations mostly ignored | |||
to carry this nonce over to subsequent polling messages or to verify | the requirement to either carry this nonce over to subsequent polling | |||
its presence. More recent versions of the specification no longer | messages or verify its presence. More recent versions of the | |||
require the chaining of nonces across polling operations. | specification no longer require the chaining of nonces across polling | |||
operations. | ||||
3.3.2.1. CertRep SUCCESS | 3.3.2.1. CertRep SUCCESS | |||
When the pkiStatus attribute is set to SUCCESS, the messageData for | When the pkiStatus attribute is set to SUCCESS, the messageData for | |||
this message consists of a degenerate certificates-only CMS Signed- | this message consists of a degenerate certificates-only CMS | |||
Data message (Section 3.4). The content of this degenerate | SignedData message (Section 3.4). The content of this degenerate | |||
certificates-only Signed-Data depends on what the original request | certificates-only SignedData message depends on what the original | |||
was, as outlined below. | request was, as outlined in Table 6. | |||
+--------------+----------------------------------------------------+ | +==============+===============================================+ | |||
| Request-type | Reply-contents | | | Request-type | Reply-contents | | |||
+--------------+----------------------------------------------------+ | +==============+===============================================+ | |||
| PKCSReq | The reply MUST contain at least the issued | | | PKCSReq | The reply MUST contain at least the issued | | |||
| | certificate in the certificates field of the | | | | certificate in the certificates field of the | | |||
| | Signed-Data. The | | | | SignedData. The reply MAY contain additional | | |||
| | reply MAY contain additional certificates, but the | | | | certificates, but the issued certificate MUST | | |||
| | issued | | | | be the leaf certificate. | | |||
| | certificate MUST be the leaf certificate. | | +--------------+-----------------------------------------------+ | |||
| | | | | RenewalReq | Same as PKCSReq | | |||
| RenewalReq | Same as PKCSReq | | +--------------+-----------------------------------------------+ | |||
| | | | | CertPoll | Same as PKCSReq | | |||
| CertPoll | Same as PKCSReq | | +--------------+-----------------------------------------------+ | |||
| | | | | GetCert | The reply MUST contain at least the requested | | |||
| GetCert | The reply MUST contain at least the requested | | | | certificate in the certificates field of the | | |||
| | certificate in the certificates field of the | | | | SignedData. The reply MAY contain additional | | |||
| | Signed-Data. The | | | | certificates, but the requested certificate | | |||
| | reply MAY contain additional certificates, but the | | | | MUST be the leaf certificate. | | |||
| | requested certificate MUST be the leaf | | +--------------+-----------------------------------------------+ | |||
| | certificate. | | | GetCRL | The reply MUST contain the CRL in the crls | | |||
| | | | | | field of the SignedData. | | |||
| GetCRL | The reply MUST contain the CRL in the crls field | | +--------------+-----------------------------------------------+ | |||
| | of the Signed-Data. | | ||||
+--------------+----------------------------------------------------+ | Table 6: CertRep Response Types | |||
3.3.2.2. CertRep FAILURE | 3.3.2.2. CertRep FAILURE | |||
When the pkiStatus attribute is set to FAILURE, the reply MUST also | When the pkiStatus attribute is set to FAILURE, the reply MUST also | |||
contain a failInfo (Section 3.2.1.4) attribute set to the appropriate | contain a failInfo (Section 3.2.1.4) attribute set to the appropriate | |||
error condition describing the failure. The reply MAY also contain a | error condition describing the failure. The reply MAY also contain a | |||
failInfoText attribute providing extended details on why the | failInfoText attribute providing extended details on why the | |||
operation failed, typically to expand on the catch-all failInfo = | operation failed, typically to expand on the catchall failInfo = | |||
badRequest status. The pkcsPKIEnvelope (Section 3.2.2) MUST be | badRequest status. The pkcsPKIEnvelope (Section 3.2.2) MUST be | |||
omitted. | omitted. | |||
3.3.2.3. CertRep PENDING | 3.3.2.3. CertRep PENDING | |||
When the pkiStatus attribute is set to PENDING, the pkcsPKIEnvelope | When the pkiStatus attribute is set to PENDING, the pkcsPKIEnvelope | |||
(Section 3.2.2) MUST be omitted. | (Section 3.2.2) MUST be omitted. | |||
3.3.3. CertPoll (GetCertInitial) | 3.3.3. CertPoll (GetCertInitial) | |||
This message is used for certificate polling. For unknown reasons it | This message is used for certificate polling. For unknown reasons, | |||
was referred to as "GetCertInitial" in earlier versions of this | it was referred to as "GetCertInitial" in earlier draft versions of | |||
specification. The messageData for this type consists of an | this specification. The messageData for this type consists of an | |||
IssuerAndSubject: | IssuerAndSubject: | |||
issuerAndSubject ::= SEQUENCE { | issuerAndSubject ::= SEQUENCE { | |||
issuer Name, | issuer Name, | |||
subject Name | subject Name | |||
} | } | |||
The issuer is set to the subjectName of the CA (in other words the | The issuer is set to the subjectName of the CA (in other words, the | |||
intended issuerName of the certificate that's being requested). The | intended issuerName of the certificate that's being requested). The | |||
subject is set to the subjectName used when requesting the | subject is set to the subjectName used when requesting the | |||
certificate. | certificate. | |||
Note that both of these fields are redundant, the CA is identified by | 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 recipientInfo in the pkcsPKIEnvelope (or in most cases, simply by | |||
the server that the message is being sent to) and the client/ | the server that the message is being sent to), and the client/ | |||
transaction being polled is identified by the transactionID. Both of | transaction being polled is identified by the transactionID. Both of | |||
these fields can be processed by the CA without going through the | these fields can be processed by the CA without going through the | |||
cryptographically expensive process of unwrapping and processing the | cryptographically expensive process of unwrapping and processing the | |||
issuerAndSubject. For this reason implementations SHOULD assume that | issuerAndSubject. For this reason, implementations SHOULD assume | |||
the polling operation will be controlled by the recipientInfo and | that the polling operation will be controlled by the recipientInfo | |||
transactionID rather than the contents of the messageData. In | and transactionID rather than the contents of the messageData. In | |||
addition the message must contain the the authenticatedAttributes | addition, the message must contain the authenticatedAttributes | |||
specified in Section 3.2.1. | specified in Section 3.2.1. | |||
3.3.4. GetCert and GetCRL | 3.3.4. GetCert and GetCRL | |||
The messageData for these types consist of an IssuerAndSerialNumber | The messageData for these types consist of an IssuerAndSerialNumber, | |||
as defined in CMS which uniquely identifies the certificate being | as defined in CMS, that uniquely identifies the certificate being | |||
requested, either the certificate itself for GetCert or its | requested, either the certificate itself for GetCert or its | |||
revocation status via a CRL for GetCRL. In addition the message must | revocation status via a CRL for GetCRL. In addition, the message | |||
contain the the authenticatedAttributes specified in Section 3.2.1. | must contain the authenticatedAttributes specified in Section 3.2.1. | |||
These message types, while included here for completeness, apply | These message types, while included here for completeness, apply | |||
unnecessary cryptography and messaging overhead to the simple task of | unnecessary cryptography and messaging overhead to the simple task of | |||
transferring a certificate or CRL (see Section 8.8). Implementations | transferring a certificate or CRL (see Section 7.8). Implementations | |||
SHOULD prefer HTTP certificate-store access [17] or LDAP over the use | SHOULD prefer HTTP certificate-store access [RFC4387] or LDAP over | |||
of these messages. | the use of these messages. | |||
3.4. Degenerate certificates-only CMS Signed-Data | 3.4. Degenerate certificates-only CMS SignedData | |||
CMS includes a degenerate case of the Signed-Data content type in | CMS includes a degenerate case of the SignedData content type in | |||
which there are no signers. The use of such a degenerate case is to | 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 | disseminate certificates and CRLs. For SCEP, the content field of | |||
ContentInfo value of a degenerate certificates-only Signed-Data MUST | the ContentInfo value of a degenerate certificates-only SignedData | |||
be omitted. When carrying certificates, the certificates are | MUST be omitted. When carrying certificates, the certificates are | |||
included in the 'certificates' field of the Signed-Data. When | included in the certificates field of the SignedData. When carrying | |||
carrying a CRL, the CRL is included in the 'crls' field of the | a CRL, the CRL is included in the crls field of the SignedData. | |||
Signed-Data. | ||||
3.5. CA Capabilities | 3.5. CA Capabilities | |||
In order to provide support for future enhancements to the protocol, | In order to provide support for future enhancements to the protocol, | |||
CAs MUST implement the GetCACaps message to allow clients to query | CAs MUST implement the GetCACaps message to allow clients to query | |||
which functionality is available from the CA. | which functionality is available from the CA. | |||
3.5.1. GetCACaps HTTP Message Format | 3.5.1. GetCACaps HTTP Message Format | |||
This message requests capabilities from a CA, with the format: | This message requests capabilities from a CA, with the format as | |||
described in Section 4.1: | ||||
"GET" SP SCEPPATH "?operation=GetCACaps" SP HTTP-version CRLF | "GET" SP SCEPPATH "?operation=GetCACaps" SP HTTP-version CRLF | |||
as described in Section 4.1. | ||||
3.5.2. CA Capabilities Response Format | 3.5.2. CA Capabilities Response Format | |||
The response for a GetCACaps message is a list of CA capabilities, in | The response for a GetCACaps message is a list of CA capabilities, in | |||
plain text and in any order, separated by <CR><LF> or <LF> | plain text and in any order, separated by <CR><LF> or <LF> | |||
characters. This specification defines the following keywords | characters. This specification defines the following keywords | |||
(quotation marks are not sent): | (quotation marks are not sent): | |||
+--------------------+----------------------------------------------+ | +==================+========================================+ | |||
| Keyword | Description | | | Keyword | Description | | |||
+--------------------+----------------------------------------------+ | +==================+========================================+ | |||
| "AES" | CA supports the AES128-CBC encryption | | | AES | CA supports the AES128-CBC encryption | | |||
| | algorithm. | | | | algorithm. | | |||
| | | | +------------------+----------------------------------------+ | |||
| "DES3" | CA supports the triple DES-CBC encryption | | | DES3 | CA supports the triple DES-CBC | | |||
| | algorithm. | | | | encryption algorithm. | | |||
| | | | +------------------+----------------------------------------+ | |||
| "GetNextCACert" | CA supports the GetNextCACert | | | GetNextCACert | CA supports the GetNextCACert message. | | |||
| | message. | | +------------------+----------------------------------------+ | |||
| | | | | POSTPKIOperation | CA supports PKIOPeration messages sent | | |||
| "POSTPKIOperation" | CA supports PKIOPeration messages sent | | | | via HTTP POST. | | |||
| | via HTTP POST. | | +------------------+----------------------------------------+ | |||
| | | | | Renewal | CA supports the Renewal CA operation. | | |||
| "Renewal" | CA supports the Renewal CA operation. | | +------------------+----------------------------------------+ | |||
| | | | | SHA-1 | CA supports the SHA-1 hashing | | |||
| "SHA-1" | CA supports the SHA-1 hashing algorithm. | | | | algorithm. | | |||
| | | | +------------------+----------------------------------------+ | |||
| "SHA-256" | CA supports the SHA-256 hashing algorithm. | | | SHA-256 | CA supports the SHA-256 hashing | | |||
| | | | | | algorithm. | | |||
| "SHA-512" | CA supports the SHA-512 hashing algorithm. | | +------------------+----------------------------------------+ | |||
| | | | | SHA-512 | CA supports the SHA-512 hashing | | |||
| "SCEPStandard" | CA supports all mandatory-to-implement | | | | algorithm. | | |||
| | sections of the SCEP standard. This keyword | | +------------------+----------------------------------------+ | |||
| | implies "AES", | | | SCEPStandard | CA supports all mandatory-to-implement | | |||
| | "POSTPKIOperation", and "SHA-256", as well | | | | sections of the SCEP standard. This | | |||
| | as the provisions of | | | | keyword implies "AES", | | |||
| | Section 2.9. | | | | "POSTPKIOperation", and "SHA-256", as | | |||
+--------------------+----------------------------------------------+ | | | well as the provisions of Section 2.9. | | |||
+------------------+----------------------------------------+ | ||||
The table above lists all of the keywords that are defined in this | Table 7: GetCACaps Response Keywords | |||
Table 7 lists all of the keywords that are defined in this | ||||
specification. A CA MAY provide additional keywords advertising | specification. A CA MAY provide additional keywords advertising | |||
further capabilities and functionality. A client MUST be able to | further capabilities and functionality. A client MUST be able to | |||
accept and ignore any unknown keywords that might be sent by a CA. | accept and ignore any unknown keywords that might be sent by a CA. | |||
The CA MUST use the text case specified here, but clients SHOULD | The CA MUST use the text case specified here, but clients SHOULD | |||
ignore the text case when processing this message. Clients MUST | ignore the text case when processing this message. Clients MUST | |||
accept the standard HTTP-style <CR><LF>-delimited text as well as the | accept the standard HTTP-style text delimited by <CR><LF> as well as | |||
<LF>- delimited text specified in an earlier version of this | the text delimited by <LF> specified in an earlier draft version of | |||
specification. | this specification. | |||
The client SHOULD use SHA-256 in preference to SHA-1 hashing and | The client SHOULD use SHA-256 in preference to SHA-1 hashing and | |||
AES128-CBC in preference to triple DES-CBC if they are supported by | AES128-CBC in preference to triple DES-CBC if they are supported by | |||
the CA. Although the CMS format allows any form of AES and SHA-2 to | the CA. Although the CMS format allows any form of AES and SHA-2 to | |||
be specified, in the interests of interoperability the de facto | be specified, in the interests of interoperability the de facto | |||
universal standards of AES128-CBC and SHA-256 SHOULD be used. | universal standards of AES128-CBC and SHA-256 SHOULD be used. | |||
Announcing some of these capabilities individually is redundant since | Announcing some of these capabilities individually is redundant, | |||
they're required as mandatory-to-implement functionality (see | since they're required as mandatory-to-implement functionality (see | |||
Section 2.9) whose presence as a whole is signalled by the | Section 2.9) whose presence as a whole is signalled by the | |||
"SCEPStandard" capability, but it may be useful to announce them in | "SCEPStandard" capability. However, it may be useful to announce | |||
order to deal with older implementations that would otherwise default | them in order to deal with older implementations that would otherwise | |||
to obsolete, insecure algorithms and mechanisms. | default to obsolete, insecure algorithms and mechanisms. | |||
If the CA supports none of the above capabilities it SHOULD return an | If the CA supports none of the above capabilities, it SHOULD return | |||
empty message. A CA MAY simply return an HTTP error. A client that | an empty message. A CA MAY simply return an HTTP error. A client | |||
receives an empty message or an HTTP error SHOULD interpret the | that receives an empty message or an HTTP error SHOULD interpret the | |||
response as if none of the capabilities listed are supported by the | response as if none of the capabilities listed are supported by the | |||
CA. | CA. | |||
Note that at least one widely-deployed server implementation supports | Note that at least one widely deployed server implementation supports | |||
several of the above operations but doesn't support the GetCACaps | several of the above operations but doesn't support the GetCACaps | |||
message to indicate that it supports them, and will close the | message to indicate that it supports them, and it will close the | |||
connection if sent a GetCACaps message. This means that the | connection if sent a GetCACaps message. This means that the | |||
equivalent of GetCACaps must be performed through server | equivalent of GetCACaps must be performed through server | |||
fingerprinting, which can be done using the ID string "Microsoft- | fingerprinting, which can be done using the ID string "Microsoft- | |||
IIS". Newer versions of the same server, if sent a SCEP request | IIS". Newer versions of the same server, if sent a SCEP request | |||
using AES and SHA-2, will respond with an invalid response that can't | using AES and SHA-2, will respond with an invalid response that can't | |||
be decrypted, requiring the use of 3DES and SHA-1 in order to obtain | be decrypted, requiring the use of 3DES and SHA-1 in order to obtain | |||
a response that can be processed even if AES and/or SHA-2 are | a response that can be processed, even if AES and/or SHA-2 are | |||
allegedly supported. In addition the server will generate CA | allegedly supported. In addition, the server will generate CA | |||
certificates that only have one, but not both, of the keyEncipherment | certificates that only have one, but not both, of the keyEncipherment | |||
and digitalSignature keyUsage flags set, requiring that the client | and digitalSignature keyUsage flags set, requiring that the client | |||
ignore the keyUsage flags in order to use the certificates for SCEP. | ignore the keyUsage flags in order to use the certificates for SCEP. | |||
The Content-type of the reply SHOULD be "text/plain". Clients SHOULD | The Content-type of the reply SHOULD be "text/plain". Clients SHOULD | |||
ignore the Content-type, as older implementations of SCEP may send | ignore the Content-type, as older implementations of SCEP may send | |||
various Content-types. | various Content-types. | |||
Example: | Example: | |||
skipping to change at page 25, line 4 ¶ | skipping to change at line 1121 ¶ | |||
and digitalSignature keyUsage flags set, requiring that the client | and digitalSignature keyUsage flags set, requiring that the client | |||
ignore the keyUsage flags in order to use the certificates for SCEP. | ignore the keyUsage flags in order to use the certificates for SCEP. | |||
The Content-type of the reply SHOULD be "text/plain". Clients SHOULD | The Content-type of the reply SHOULD be "text/plain". Clients SHOULD | |||
ignore the Content-type, as older implementations of SCEP may send | ignore the Content-type, as older implementations of SCEP may send | |||
various Content-types. | various Content-types. | |||
Example: | Example: | |||
GET /cgi-bin/pkiclient.exe?operation=GetCACaps HTTP/1.1 | GET /cgi-bin/pkiclient.exe?operation=GetCACaps HTTP/1.1 | |||
might return: | might return: | |||
AES | AES | |||
GetNextCACert | GetNextCACert | |||
POSTPKIOperation | POSTPKIOperation | |||
SCEPStandard | SCEPStandard | |||
SHA-256 | SHA-256 | |||
This means that the CA supports modern crypto algorithms, the | This means that the CA supports modern crypto algorithms, and the | |||
GetNextCACert message, allows PKIOperation messages (PKCSReq/ | GetNextCACert message allows PKIOperation messages (PKCSReq/ | |||
RenewalReq, GetCert, CertPoll, ...) to be sent using HTTP POST, and | RenewalReq, GetCert, CertPoll, ...) to be sent using HTTP POST and is | |||
is compliant with the final version of the SCEP standard. | compliant with the final version of the SCEP standard. | |||
4. SCEP Transactions | 4. SCEP Transactions | |||
This section describes the SCEP Transactions and their HTTP [11] | This section describes the SCEP Transactions and their HTTP [RFC7230] | |||
transport mechanism. | transport mechanism. | |||
Note that SCEP doesn't follow best current practices on usage of | Note that SCEP doesn't follow best current practices on usage of | |||
HTTP. In particular it recommends ignoring some Media Types and | HTTP. In particular, it recommends ignoring some media types and | |||
hardcodes specific URI paths. Guidance on the appropriate | hard-codes specific URI paths. Guidance on the appropriate | |||
application of HTTP in these circumstances may be found in [16]. | application of HTTP in these circumstances may be found in [HTTP]. | |||
4.1. HTTP POST and GET Message Formats | 4.1. HTTP POST and GET Message Formats | |||
SCEP uses the HTTP "POST" and "GET" HTTP methods [11] to exchange | SCEP uses the HTTP POST and GET methods [RFC7230] to exchange | |||
information with the CA. The following defines the ABNF syntax of | information with the CA. The following defines the ABNF syntax of | |||
HTTP POST and GET methods sent from a client to a CA: | HTTP POST and GET methods sent from a client to a CA: | |||
POSTREQUEST = "POST" SP SCEPPATH "?operation=" OPERATION | POSTREQUEST = "POST" SP SCEPPATH "?operation=" OPERATION | |||
SP HTTP-version CRLF | SP HTTP-version CRLF | |||
GETREQUEST = "GET" SP SCEPPATH "?operation=" OPERATION | GETREQUEST = "GET" SP SCEPPATH "?operation=" OPERATION | |||
"&message=" MESSAGE SP HTTP-version CRLF | "&message=" MESSAGE SP HTTP-version CRLF | |||
where: | where: | |||
o SCEPPATH is the HTTP URL path for accessing the CA. Clients | * SCEPPATH is the HTTP URL path for accessing the CA. Clients | |||
SHOULD set SCEPPATH to the fixed string "/cgi-bin/pkiclient.exe" | SHOULD set SCEPPATH to the fixed string "/cgi-bin/pkiclient.exe" | |||
unless directed to do otherwise by the CA. | unless directed to do otherwise by the CA. | |||
o OPERATION depends on the SCEP transaction and is defined in the | * OPERATION depends on the SCEP transaction and is defined in the | |||
following sections. | following sections. | |||
o HTTP-version is the HTTP version string, which is "HTTP/1.1" for | * HTTP-version is the HTTP version string, which is "HTTP/1.1" for | |||
[11]. | [RFC7230]. | |||
* SP and CRLF are space and carriage return/linefeed, as defined in | ||||
o SP and CRLF are space and carriage return/linefeed as defined in | [RFC5234]. | |||
[6]. | ||||
The CA will typically ignore SCEPPATH since it's unlikely to be | The CA will typically ignore SCEPPATH, since it's unlikely to be | |||
issuing certificates via a web server. Clients SHOULD set SCEPPATH | issuing certificates via a web server. Clients SHOULD set SCEPPATH | |||
to the fixed string "/cgi-bin/pkiclient.exe" unless directed to do | to the fixed string "/cgi-bin/pkiclient.exe" unless directed to do | |||
otherwise by the CA. The CA SHOULD ignore the SCEPPATH unless its | otherwise by the CA. The CA SHOULD ignore the SCEPPATH unless its | |||
precise format is critical to the CA's operation. | precise format is critical to the CA's operation. | |||
Early SCEP drafts performed all communications via "GET" messages, | Early SCEP drafts performed all communications via GET messages, | |||
including non-idempotent ones that should have been sent via "POST" | including non-idempotent ones that should have been sent via POST | |||
messages, see [16] for details. This has caused problems because of | messages; see [HTTP] for details. This has caused problems because | |||
the way that the (supposedly) idempotent GET interacts with caches | of the way that the (supposedly) idempotent GET interacts with caches | |||
and proxies, and because the extremely large GET requests created by | and proxies, and because the extremely large GET requests created by | |||
encoding CMS messages may be truncated in transit. These issues are | encoding CMS messages may be truncated in transit. These issues are | |||
typically not visible when testing on a LAN, but crop up during | typically not visible when testing on a LAN, but crop up during | |||
deployment over WANs. If the remote CA supports POST, the CMS- | deployment over WANs. If the remote CA supports POST, the CMS- | |||
encoded SCEP messages MUST be sent via HTTP POST instead of HTTP GET. | encoded SCEP messages MUST be sent via HTTP POST instead of HTTP GET. | |||
This applies to any SCEP message except GetCACert, GetNextCACert, and | This applies to any SCEP message except GetCACert, GetNextCACert, and | |||
GetCACaps, and avoids the need for base64- and URL-encoding that's | GetCACaps and avoids the need for base64 and URL encoding that's | |||
required for GET messaging. The client can verify that the CA | required for GET messaging. The client can verify that the CA | |||
supports SCEP messages via POST by looking for the "SCEPStandard" or | supports SCEP messages via POST by looking for the "SCEPStandard" or | |||
"POSTPKIOperation" capability (See Section 3.5.2). | "POSTPKIOperation" capability (see Section 3.5.2). | |||
If a client or CA uses HTTP GET and encounters HTTP-related problems | If a client or CA uses HTTP GET and encounters HTTP-related problems | |||
such as messages being truncated, seeing errors such as HTTP 414 | such as messages being truncated, seeing errors such as HTTP 414 | |||
("Request URI too long"), or simply having the message not sent/ | ("Request-URI too long"), or simply having the message not sent/ | |||
received at all, when standard requests to the server (for example | received at all when standard requests to the server (for example, | |||
via a web browser) work, then this is a symptom of the problematic | via a web browser) work, then this is a symptom of the problematic | |||
use of HTTP GET. The solution to this problem is to update the | use of HTTP GET. The solution to this problem is to update the | |||
implementation to use HTTP POST instead. In addition when using GET | implementation to use HTTP POST instead. In addition, when using | |||
it's recommended to test the implementation from as many different | GET, it's recommended to test the implementation from as many | |||
network locations as possible to determine whether the use of GET | different network locations as possible to determine whether the use | |||
will cause problems with communications. | of GET will cause problems with communications. | |||
When using GET messages to communicate binary data, base64 encoding | When using GET messages to communicate binary data, base64 encoding | |||
as specified in [9] Section 4 MUST be used. The base64 encoded data | as specified in Section 4 of [RFC4648] MUST be used. The | |||
is distinct from "base64url" and may contain URI reserved characters, | base64-encoded data is distinct from "base64url" and may contain URI | |||
thus it MUST be escaped as specified in [15] in addition to being | reserved characters; thus, it MUST be escaped as specified in | |||
base64 encoded. Finally, the encoded data is inserted into the | [RFC3986] in addition to being base64 encoded. Finally, the encoded | |||
MESSAGE portion of the HTTP GET request. | data is inserted into the MESSAGE portion of the HTTP GET request. | |||
4.2. Get CA Certificate | 4.2. Get CA Certificate | |||
To get the CA certificate(s), the client sends a GetCACert message to | 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 | the CA. The OPERATION MUST be set to "GetCACert". There is no | |||
request data associated with this message. | request data associated with this message. | |||
4.2.1. Get CA Certificate Response Message Format | 4.2.1. Get CA Certificate Response Message Format | |||
The response for GetCACert is different between the case where the CA | The response for GetCACert is different between the case where the CA | |||
skipping to change at page 27, line 25 ¶ | skipping to change at line 1234 ¶ | |||
response consists of a single X.509 CA certificate. The response | response consists of a single X.509 CA certificate. The response | |||
will have a Content-Type of "application/x-x509-ca-cert". | will have a Content-Type of "application/x-x509-ca-cert". | |||
"Content-Type: application/x-x509-ca-cert" | "Content-Type: application/x-x509-ca-cert" | |||
<binary X.509> | <binary X.509> | |||
4.2.1.2. CA Certificate Chain Response Message Format | 4.2.1.2. CA Certificate Chain Response Message Format | |||
If the CA has intermediate CA certificates, the response consists of | If the CA has intermediate CA certificates, the response consists of | |||
a degenerate certificates-only CMS Signed-Data message (Section 3.4) | a degenerate certificates-only CMS SignedData message (Section 3.4) | |||
containing the certificates, with the intermediate CA certificate(s) | containing the certificates, with the intermediate CA certificate(s) | |||
as the leaf certificate(s). The response will have a Content-Type of | 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 | "application/x-x509-ca-ra-cert". Note that this designation is used | |||
for historical reasons due to its use in older versions of this | for historical reasons due to its use in older versions of this | |||
specification, no special meaning should be attached to the label. | specification -- no special meaning should be attached to the label. | |||
"Content-Type: application/x-x509-ca-ra-cert" | "Content-Type: application/x-x509-ca-ra-cert" | |||
<binary CMS> | <binary CMS> | |||
4.3. Certificate Enrolment/Renewal | 4.3. Certificate Enrolment/Renewal | |||
A PKCSReq/RenewalReq (Section 3.3.1) message is used to perform a | A PKCSReq/RenewalReq (Section 3.3.1) message is used to perform a | |||
certificate enrolment or renewal transaction. The OPERATION MUST be | certificate enrolment or renewal transaction. The OPERATION MUST be | |||
set to "PKIOperation". Note that when used with HTTP POST, the only | set to "PKIOperation". Note that when used with HTTP POST, the only | |||
OPERATION possible is "PKIOperation", so many CAs don't check this | OPERATION possible is "PKIOperation", so many CAs don't check this | |||
value or even notice its absence. When implemented using HTTP POST | value or even notice its absence. When implemented using HTTP POST, | |||
the message is sent with a Content-Type of "application/x-pki- | the message is sent with a Content-Type of "application/x-pki- | |||
message" and might look as follows: | message" and might look as follows: | |||
POST /cgi-bin/pkiclient.exe?operation=PKIOperation HTTP/1.1 | POST /cgi-bin/pkiclient.exe?operation=PKIOperation HTTP/1.1 | |||
Content-Length: <length of data> | Content-Length: <length of data> | |||
Content-Type: application/x-pki-message | Content-Type: application/x-pki-message | |||
<binary CMS data> | <binary CMS data> | |||
When implemented using HTTP GET this might look as follows: | When implemented using HTTP GET, this might look as follows: | |||
GET /cgi-bin/pkiclient.exe?operation=PKIOperation& \ | GET /cgi-bin/pkiclient.exe?operation=PKIOperation& \ | |||
message=MIAGCSqGSIb3DQEHA6CAMIACAQAxgDCBzAIBADB2MG \ | message=MIAGCSqGSIb3DQEHA6CAMIACAQAxgDCBzAIBADB2MG \ | |||
IxETAPBgNVBAcTCE......AAAAAA== HTTP/1.1 | IxETAPBgNVBAcTCE......AAAAAA== HTTP/1.1 | |||
4.3.1. Certificate Enrolment/Renewal Response Message | 4.3.1. Certificate Enrolment/Renewal Response Message | |||
If the request is granted, a CertRep SUCCESS message | If the request is granted, a CertRep SUCCESS message | |||
(Section 3.3.2.1) is returned. If the request is rejected, a CertRep | (Section 3.3.2.1) is returned. If the request is rejected, a CertRep | |||
FAILURE message (Section 3.3.2.2) is returned. If the CA is | FAILURE message (Section 3.3.2.2) is returned. If the CA is | |||
skipping to change at page 29, line 6 ¶ | skipping to change at line 1300 ¶ | |||
CertPoll messages exchanged during the polling period MUST carry the | CertPoll messages exchanged during the polling period MUST carry the | |||
same transactionID attribute as the previous PKCSReq/RenewalReq. A | same transactionID attribute as the previous PKCSReq/RenewalReq. A | |||
CA receiving a CertPoll for which it does not have a matching | CA receiving a CertPoll for which it does not have a matching | |||
PKCSReq/RenewalReq MUST reject this request. | PKCSReq/RenewalReq MUST reject this request. | |||
Since at this time the certificate has not been issued, the client | Since at this time the certificate has not been issued, the client | |||
can only use its own subject name (which was contained in the | can only use its own subject name (which was contained in the | |||
original PKCS# 10 sent via PKCSReq/RenewalReq) to identify the polled | original PKCS# 10 sent via PKCSReq/RenewalReq) to identify the polled | |||
certificate request (but see the note on identification during | certificate request (but see the note on identification during | |||
polling in Section 3.3.3). In theory there can be multiple | polling in Section 3.3.3). In theory, there can be multiple | |||
outstanding requests from one client (for example, if different keys | outstanding requests from one client (for example, if different keys | |||
and different key-usages were used to request multiple certificates), | and different key usages were used to request multiple certificates), | |||
so the transactionID must also be included to disambiguate between | so the transactionID must also be included to disambiguate between | |||
multiple requests. In practice however the client SHOULD NOT have | multiple requests. In practice, however, the client SHOULD NOT have | |||
multiple requests outstanding at any one time, since this tends to | multiple requests outstanding at any one time, since this tends to | |||
confuse some CAs. | confuse some CAs. | |||
4.4.1. Polling Response Message Format | 4.4.1. Polling Response Message Format | |||
The response messages for CertPoll are the same as in Section 4.3.1. | The response messages for CertPoll are the same as in Section 4.3.1. | |||
4.5. Certificate Access | 4.5. Certificate Access | |||
A client can query an issued certificate from the SCEP CA, as long as | 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 | the client knows the issuer name and the issuer-assigned certificate | |||
serial number. | serial number. | |||
This transaction consists of one GetCert (Section 3.3.4) message sent | This transaction consists of one GetCert (Section 3.3.4) message sent | |||
to the CA by a client, and one CertRep (Section 3.3.2) message sent | to the CA by a client and one CertRep (Section 3.3.2) message sent | |||
back from the CA. The OPERATION MUST be set to "PKIOperation". | back from the CA. The OPERATION MUST be set to "PKIOperation". | |||
4.5.1. Certificate Access Response Message Format | 4.5.1. Certificate Access Response Message Format | |||
In this case, the CertRep from the CA is same as in Section 4.3.1, | In this case, the CertRep from the CA is same as in Section 4.3.1, | |||
except that the CA will either grant the request (SUCCESS) or reject | except that the CA will either grant the request (SUCCESS) or reject | |||
it (FAILURE). | it (FAILURE). | |||
4.6. CRL Access | 4.6. CRL Access | |||
Clients can request a CRL from the SCEP CA as described in | Clients can request a CRL from the SCEP CA, as described in | |||
Section 2.7. The OPERATION MUST be set to "PKIOperation". | Section 2.7. The OPERATION MUST be set to "PKIOperation". | |||
4.6.1. CRL Access Response Message Format | 4.6.1. CRL Access Response Message Format | |||
The CRL is sent back to the client in a CertRep (Section 3.3.2) | The CRL is sent back to the client in a CertRep (Section 3.3.2) | |||
message. The information portion of this message is a degenerate | message. The information portion of this message is a degenerate | |||
certificates-only Signed-Data (Section 3.4) that contains only the | certificates-only SignedData (Section 3.4) that contains only the | |||
most recent CRL in the crls field of the Signed-Data. | most recent CRL in the crls field of the SignedData. | |||
4.7. Get Next Certificate Authority Certificate | 4.7. Get Next Certificate Authority Certificate | |||
When a CA certificate is about to expire, clients need to retrieve | When a CA certificate is about to expire, clients need to retrieve | |||
the CA's next CA certificate (i.e. the rollover certificate). This | the CA's next CA certificate (i.e., the rollover certificate). This | |||
is done via the GetNextCACert message. The OPERATION MUST be set to | is done via the GetNextCACert message. The OPERATION MUST be set to | |||
"GetNextCACert". There is no request data associated with this | "GetNextCACert". There is no request data associated with this | |||
message. | message. | |||
4.7.1. Get Next CA Response Message Format | 4.7.1. Get Next CA Response Message Format | |||
The response consists of a Signed-Data CMS message, signed by the | The response consists of a SignedData CMS message, signed by the | |||
current CA signing key. Clients MUST validate the signature on the | current CA signing key. Clients MUST validate the signature on the | |||
message before trusting any of its contents. The response will have | message before trusting any of its contents. The response will have | |||
a Content-Type of "application/x-x509-next-ca-cert". | a Content-Type of "application/x-x509-next-ca-cert". | |||
"Content-Type: application/x-x509-next-ca-cert" | "Content-Type: application/x-x509-next-ca-cert" | |||
<binary CMS> | <binary CMS> | |||
The content of the Signed-Data message is a degenerate certificates- | The content of the SignedData message is a degenerate certificates- | |||
only Signed-Data message (Section 3.4) containing the new CA | only SignedData message (Section 3.4) containing the new CA | |||
certificate(s) to be used when the current CA certificate expires. | certificate(s) to be used when the current CA certificate expires. | |||
5. SCEP Transaction Examples | 5. SCEP Transaction Examples | |||
The following section gives several examples of client to CA | The following section gives several examples of client-to-CA | |||
transactions. Client actions are indicated in the left column, CA | transactions. Client actions are indicated in the left column, CA | |||
actions are indicated in the right column, and the transactionID is | actions are indicated in the right column, and the transactionID is | |||
given in parentheses (for ease of reading small integer values have | given in parentheses. For ease of reading, small integer values have | |||
been used, in practice full transaction IDs would be used). The | been used; in practice, full transaction IDs would be used. The | |||
first transaction, for example, would read like this: | first transaction, for example, would read like this: | |||
"Client Sends PKCSReq message with transactionID 1 to the CA. The CA | | Client Sends PKCSReq message with transactionID 1 to the CA. The | |||
signs the certificate and constructs a CertRep Message containing the | | CA signs the certificate and constructs a CertRep Message | |||
signed certificate with a transaction ID 1. The client receives the | | containing the signed certificate with a transaction ID 1. The | |||
message and installs the certificate locally". | | client receives the message and installs the certificate locally. | |||
5.1. Successful Transactions | 5.1. Successful Transactions | |||
Successful Enrolment Case: Automatic processing | ||||
PKCSReq (1) ----------> CA issues certificate | PKCSReq (1) ----------> CA issues certificate | |||
<---------- CertRep (1) SUCCESS | <---------- CertRep (1) SUCCESS | |||
Client installs certificate | Client installs certificate | |||
Successful Enrolment Case: Manual authentication required | ||||
Figure 7: Successful Enrolment Case: Automatic Processing | ||||
PKCSReq (2) ----------> Cert request goes into queue | PKCSReq (2) ----------> Cert request goes into queue | |||
<---------- CertRep (2) PENDING | <---------- CertRep (2) PENDING | |||
CertPoll (2) ----------> Still pending | CertPoll (2) ----------> Still pending | |||
<---------- CertRep (2) PENDING | <---------- CertRep (2) PENDING | |||
CertPoll (2) ----------> CA issues certificate | CertPoll (2) ----------> CA issues certificate | |||
<---------- CertRep (2) SUCCESS | <---------- CertRep (2) SUCCESS | |||
Client installs certificate | Client installs certificate | |||
CA certificate rollover case: | Figure 8: Successful Enrolment Case: Manual Authentication Required | |||
GetNextCACert ----------> | GetNextCACert ----------> | |||
<---------- New CA certificate | <---------- New CA certificate | |||
PKCSReq* ----------> CA issues certificate with | PKCSReq* ----------> CA issues certificate with | |||
new key | new key | |||
<---------- CertRep SUCCESS | <---------- CertRep SUCCESS | |||
Client stores certificate | Client stores certificate | |||
for installation when | for installation when | |||
existing certificate expires. | existing certificate expires. | |||
Figure 9: CA Certificate Rollover Case | ||||
* Enveloped for the new CA certificate. The CA will use the envelope | * Enveloped for the new CA certificate. The CA will use the envelope | |||
to determine which key to use to issue the client certificate. | to determine which key to use to issue the client certificate. | |||
5.2. Transactions with Errors | 5.2. Transactions with Errors | |||
In the case of polled transactions that aren't completed | In the case of polled transactions that aren't completed | |||
automatically, there are two potential options for dealing with a | automatically, there are two potential options for dealing with a | |||
transaction that's interrupted due to network or software/hardware | transaction that's interrupted due to network or software/hardware | |||
issues. The first is for the client to preserve its transaction | issues. The first is for the client to preserve its transaction | |||
state and resume the CertPoll polling when normal service is | state and resume the CertPoll polling when normal service is | |||
restored. The second is for the client to begin a new transaction by | restored. The second is for the client to begin a new transaction by | |||
sending a new PKCSReq/RenewalReq rather than continuing the previous | sending a new PKCSReq/RenewalReq, rather than continuing the previous | |||
CertPoll. Both options have their own advantages and disadvantages. | CertPoll. Both options have their own advantages and disadvantages. | |||
The CertPoll continuation requires that the client maintain its | The CertPoll continuation requires that the client maintain its | |||
transaction state for the time when it resumes polling. This is | transaction state for the time when it resumes polling. This is | |||
relatively simple if the problem is a brief network outage, but less | relatively simple if the problem is a brief network outage, but less | |||
simple when the problem is a client crash and restart. In addition | simple when the problem is a client crash and restart. In addition, | |||
the CA may treat a lost network connection as the end of a | the CA may treat a lost network connection as the end of a | |||
transaction, so that a new connection followed by a CertPoll will be | transaction, so that a new connection followed by a CertPoll will be | |||
treated as an error. | treated as an error. | |||
The PKCSReq/RenewalReq continuation doesn't require any state to be | The PKCSReq/RenewalReq continuation doesn't require any state to be | |||
maintained since it's a new transaction, however it may cause | maintained, since it's a new transaction. However, it may cause | |||
problems on the CA side if the certificate was successfully issued | problems on the CA side if the certificate was successfully issued | |||
but the client never received it, since the resumed transaction | but the client never received it, since the resumed transaction | |||
attempt will appear to be a request for a duplicate certificate (see | attempt will appear to be a request for a duplicate certificate (see | |||
Section 8.4 for more on why this is a problem). In this case the CA | Section 7.4 for more on why this is a problem). In this case, the CA | |||
may refuse the transaction, or require manual intervention to remove/ | may refuse the transaction or require manual intervention to remove/ | |||
revoke the previous certificate before the client can request another | revoke the previous certificate before the client can request another | |||
one. | one. | |||
Since the new-transaction resume is more robust in the presence of | Since the new-transaction resume is more robust in the presence of | |||
errors and doesn't require special-case handling by either the client | errors and doesn't require special-case handling by either the client | |||
or CA, clients SHOULD use the new-transaction option in preference to | or CA, clients SHOULD use the new-transaction option in preference to | |||
the resumed-CertPoll option to recover from errors. | the resumed-CertPoll option to recover from errors. | |||
Resync Case 1: Client resyncs via new PKCSReq (recommended): | Resync Case 1: Client resyncs via new PKCSReq (recommended): | |||
PKCSReq (3) ----------> Cert request goes into queue | PKCSReq (3) ----------> Cert request goes into queue | |||
<---------- CertRep (3) PENDING | <---------- CertRep (3) PENDING | |||
CertPoll (3) ----------> Still pending | CertPoll (3) ----------> Still pending | |||
X-------- CertRep(3) PENDING | X-------- CertRep(3) PENDING | |||
(Network outage) | (Network outage) | |||
(Client reconnects) | (Client reconnects) | |||
PKCSReq (4) ----------> | PKCSReq (4) ----------> | |||
<---------- CertRep (4) PENDING | <---------- CertRep (4) PENDING | |||
etc... | etc... | |||
Figure 10: Resync Case 1 | ||||
Resync Case 2: Client resyncs via resumed CertPoll after a network | Resync Case 2: Client resyncs via resumed CertPoll after a network | |||
outage (not recommended, use PKCSReq to resync): | outage (not recommended; use PKCSReq to resync): | |||
PKCSReq (5) ----------> Cert request goes into queue | PKCSReq (5) ----------> Cert request goes into queue | |||
<---------- CertRep (5) PENDING | <---------- CertRep (5) PENDING | |||
CertPoll (5) ----------> Still pending | CertPoll (5) ----------> Still pending | |||
X-------- CertRep(5) PENDING | X-------- CertRep(5) PENDING | |||
(Network outage) | (Network outage) | |||
(Client reconnects) | (Client reconnects) | |||
CertPoll (5) ----------> CA issues certificate | CertPoll (5) ----------> CA issues certificate | |||
<---------- CertRep (5) SUCCESS | <---------- CertRep (5) SUCCESS | |||
Client installs certificate | Client installs certificate | |||
Resync Case 3: Special-case variation of case 2 where the CertRep | ||||
Figure 11: Resync Case 2 | ||||
Resync Case 3: Special-case variation of Case 2 where the CertRep | ||||
SUCCESS rather than the CertRep PENDING is lost (recommended): | SUCCESS rather than the CertRep PENDING is lost (recommended): | |||
PKCSReq (6) ----------> Cert request goes into queue | PKCSReq (6) ----------> Cert request goes into queue | |||
<---------- CertRep (6) PENDING | <---------- CertRep (6) PENDING | |||
CertPoll (6) ----------> Still pending | CertPoll (6) ----------> Still pending | |||
<---------- CertRep (6) PENDING | <---------- CertRep (6) PENDING | |||
CertPoll (6) ----------> CA issues certificate | CertPoll (6) ----------> CA issues certificate | |||
X-------- CertRep(6) SUCCESS | X-------- CertRep(6) SUCCESS | |||
(Network outage) | (Network outage) | |||
(Client reconnects) | (Client reconnects) | |||
PKCSReq (7) ----------> There is already a valid | PKCSReq (7) ----------> There is already a valid | |||
certificate with this DN. | certificate with this | |||
Distinguished Name (DN). | ||||
<---------- CertRep (7) FAILURE | <---------- CertRep (7) FAILURE | |||
Admin revokes certificate | Admin revokes certificate | |||
PKCSReq (8) ----------> CA issues new certificate | PKCSReq (8) ----------> CA issues new certificate | |||
<---------- CertRep (8) SUCCESS | <---------- CertRep (8) SUCCESS | |||
Client installs certificate | Client installs certificate | |||
Resync Case 4: Special-case variation of case 1 where the CertRep | Figure 12: Resync Case 3 | |||
SUCCESS rather than the CertRep PENDING is lost (not recommended, use | ||||
Resync Case 4: Special-case variation of Case 1 where the CertRep | ||||
SUCCESS rather than the CertRep PENDING is lost (not recommended; use | ||||
PKCSReq to resync): | PKCSReq to resync): | |||
PKCSReq (9) ----------> Cert request goes into queue | PKCSReq (9) ----------> Cert request goes into queue | |||
<---------- CertRep (9) PENDING | <---------- CertRep (9) PENDING | |||
CertPoll (9) ----------> Still pending | CertPoll (9) ----------> Still pending | |||
<---------- CertRep (9) PENDING | <---------- CertRep (9) PENDING | |||
CertPoll (9) ----------> CA issues certificate | CertPoll (9) ----------> CA issues certificate | |||
X-------- CertRep(9) SIGNED CERT | X-------- CertRep(9) SIGNED CERT | |||
(Network outage) | (Network outage) | |||
(Client reconnects) | (Client reconnects) | |||
CertPoll (9) ----------> Certificate already issued | CertPoll (9) ----------> Certificate already issued | |||
<---------- CertRep (9) SUCCESS | <---------- CertRep (9) SUCCESS | |||
Client installs certificate | Client installs certificate | |||
Figure 13: Resync Case 4 | ||||
As these examples indicate, resumption from an error via a resumed | As these examples indicate, resumption from an error via a resumed | |||
CertPoll is tricky due to the state that needs to be held by both the | CertPoll is tricky due to the state that needs to be held by both the | |||
client and/or the CA. A PKCSReq/RenewalReq resume is the easiest to | client and/or the CA. A PKCSReq/RenewalReq resume is the easiest to | |||
implement since it's stateless and is identical for both polled and | implement, since it's stateless and is identical for both polled and | |||
non-polled transactions, while a CertPoll resume treats the two | nonpolled transactions, whereas a CertPoll resume treats the two | |||
differently (a non-polled transaction is resumed with a PKCSReq/ | differently. (A nonpolled transaction is resumed with a PKCSReq/ | |||
RenewalReq, a polled transaction is resumed with a CertPoll). For | RenewalReq; a polled transaction is resumed with a CertPoll.) For | |||
this reason error recovery SHOULD be handled via a new PKCSReq rather | this reason, error recovery SHOULD be handled via a new PKCSReq | |||
than a resumed CertPoll. | rather than a resumed CertPoll. | |||
6. Contributors/Acknowledgements | ||||
The editor would like to thank all of the previous editors, authors | 6. IANA Considerations | |||
and contributors: Cheryl Madson, Xiaoyi Liu, David McGrew, David | ||||
Cooper, Andy Nourse, Max Pritikin, Jan Vilhuber, and others for their | ||||
work maintaining the draft over the years. The IETF reviewers | ||||
provided much useful feedback that helped improve the draft, and in | ||||
particular spotted a number of things that were present in SCEP | ||||
through established practice rather than by being explicitly | ||||
described in the text. Numerous other people have contributed during | ||||
the long life cycle of the draft and all deserve thanks. In addition | ||||
several PKCS #7 / CMS libraries contributed to interoperability by | ||||
doing the right thing despite what earlier SCEP drafts required. | ||||
The earlier authors would like to thank Peter William of ValiCert, | A object identifier for an arc to assign SCEP Attribute Identifiers | |||
Inc. (formerly of VeriSign, Inc.) and Alex Deacon of VeriSign, Inc. | has been assigned in the "SMI Security for PKIX" registry | |||
and Christopher Welles of IRE, Inc. for their contributions to early | (1.3.6.1.5.5.7). This object identifer, Simple Certificate | |||
versions of this protocol and this document. | Enrollment Protocol Attributes, is denoted as id-scep: | |||
7. IANA Considerations | id-scep OBJECT IDENTIFIER ::= { id-pkix 24 } | |||
One object identifier for an arc to assign SCEP Attribute Identifiers | IANA created the "SMI Security for SCEP Attribute Identifiers" | |||
was assigned in the SMI Security for PKIX (1.3.6.1.5.5.7) registry, | registry (1.3.6.1.5.5.7.24) with the following entries with | |||
Simple Certificate Enrollment Protocol Attributes denoted as id-scep: | references to this document: | |||
id-scep OBJECT IDENTIFIER ::= { id-pkix TBD1 } | id-scep-failInfoText OBJECT IDENTIFIER ::= { id-scep 1 } | |||
(Editor's note: When the OID is assigned, the values in the OID table | Entries in the registry are assigned according to the "Specification | |||
in Section 3.2 will also need to be updated). | Required" policy defined in [RFC8126]. | |||
This assignment created the new SMI Security for SCEP Attribute | Section 3.2.1.2 describes an "SCEP Message Type" registry, and | |||
Identifiers ((1.3.6.1.5.5.7.TBD1) registry with the following entries | Section 3.5 describes an "SCEP CA Capabilities" registry; these | |||
with references to this document: | registries are maintained by IANA and define a number of such code- | |||
point identifiers. Entries in the registry are assigned according to | ||||
the "Specification Required" policy defined in [RFC8126]. | ||||
id-scep-failInfoText OBJECT IDENTIFIER ::= { id-scep 1 } | The "SCEP Message Types" registry has "Value", "Name", "Description", | |||
and "Reference" columns. The "Value" entry is a small positive | ||||
integer; value "0" is reserved. | ||||
Entries in the registry are assigned according to the "Specification | The "SCEP CA Capabilities" registry has "Keyword", "Description", and | |||
Required" policy defined in [4]. | "Reference" columns. Although implementations SHOULD use the "SCEP | |||
CA Capabilities" registry, SCEP is often employed in situations where | ||||
this isn't possible. In this case, private-use CA capabilities may | ||||
be specified using a unique prefix such as an organisation identifier | ||||
or domain name under the control of the entity that defines the | ||||
capability. For example, the prefix would be "Example.com-", and the | ||||
complete capability would be "Example.com-CapabilityName". | ||||
Section 3.2.1.2 describes a SCEP Message Type Registry and | IANA has registered four media types as defined in this document: | |||
Section 3.5 describes a SCEP CA Capabilities Registry to be | ||||
maintained by the IANA, defining a number of such code point | ||||
identifiers. Entries in the registry are to be assigned according to | ||||
the "Specification Required" policy defined in [4]. | ||||
The SCEP Message Type Registry has columns "Value," "Name," | * application/x-x509-ca-cert | |||
"Description," and "Reference". The "Value" entry is a small | ||||
positive integer, with the value "0" reserved. | ||||
The SCEP CA Capabilities Registry has columns "Keyword", | * application/x-x509-ca-ra-cert | |||
"Description", and "Reference". Although implementations SHOULD use | ||||
the SCEP CA Capabilities Registry, SCEP is often employed in | ||||
situations where this isn't possible. In this case private-use CA | ||||
capabilities may be specified using a unique prefix such as an | ||||
organisation identifier or domain name under the control of the | ||||
entity that defines the capability. For example the prefix would be | ||||
"Example.com-" and the complete capability would be "Example.com- | ||||
CapabilityName". | ||||
This document defines four media types for IANA registration: | * application/x-x509-next-ca-cert | |||
"application/x-x509-ca-cert" | * application/x-pki-message | |||
"application/x-x509-ca-ra-cert" | ||||
"application/x-x509-next-ca-cert" | ||||
"application/x-pki-message" | ||||
Note that these are grandfathered media types registered as per | Note that these are grandfathered media types registered as per | |||
Appendix A of [2]. Templates for registrations are specified below. | Appendix A of [RFC6838]. Templates for registrations are specified | |||
below. | ||||
7.1. Registration of application/x-x509-ca-cert media type | 6.1. Registration of the application/x-x509-ca-cert Media Type | |||
Type name: application | Type name: application | |||
Subtype name: x-x509-ca-cert | Subtype name: x-x509-ca-cert | |||
Required parameters: none | Required parameters: none | |||
Optional parameters: none | Optional parameters: none | |||
Encoding considerations: binary | Encoding considerations: binary | |||
Security considerations: This media type contains a certificate, see | Security considerations: This media type contains a certificate; see | |||
the Security Considerations section of [14]. There is no executable | the Security Considerations section of [RFC5280]. There is no | |||
content. | executable content. | |||
Interoperability considerations: This is a grandfathered registration | Interoperability considerations: This is a grandfathered | |||
of an alias to application/pkix-cert (basically a single DER encoded | registration of an alias to application/pkix-cert (basically a | |||
Certification Authority certificate), which is only used in SCEP. | single DER-encoded Certification Authority certificate), which is | |||
only used in SCEP. | ||||
Published specification: draft-gutmann-scep-15 | Published specification: RFC 8894 | |||
Applications that use this media type: SCEP uses this media type when | ||||
returning a CA certificate. | ||||
Fragment identifier considerations: N/A | Applications that use this media type: SCEP uses this media type | |||
when returning a CA certificate. | ||||
Fragment identifier considerations: N/A | ||||
Additional information: | Additional information: | |||
Deprecated alias names for this type: N/A | Deprecated alias names for this type: N/A | |||
Magic number(s): none | Magic number(s): none | |||
File extension(s): N/A | File extension(s): N/A | |||
Macintosh file type code(s): N/A | Macintosh file type code(s): N/A | |||
Person and email address to contact for further information: See the | Person and email address to contact for further information: See the | |||
Authors' Addresses section of draft-gutmann-scep-15 | Authors' Addresses section of RFC 8894. | |||
Intended usage: LIMITED USE | Intended usage: LIMITED USE | |||
Restrictions on usage: SCEP protocol | Restrictions on usage: SCEP protocol | |||
Author: See the Authors' Addresses section of draft-gutmann-scep-15 | Author: See the Authors' Addresses section of RFC 8894 | |||
Change controller: IETF | Change controller: IETF | |||
Provisional registration? No | Provisional registration? No | |||
7.2. Registration of application/x-x509-ca-ra-cert media type | 6.2. Registration of the application/x-x509-ca-ra-cert Media Type | |||
Type name: application | Type name: application | |||
Subtype name: x-x509-ca-ra-cert | Subtype name: x-x509-ca-ra-cert | |||
Required parameters: none | Required parameters: none | |||
Optional parameters: none | Optional parameters: none | |||
Encoding considerations: binary | Encoding considerations: binary | |||
Security considerations: This media type consists of a degenerate | Security considerations: This media type consists of a degenerate | |||
certificates-only CMS Signed-Data message (Section 3.4) containing | certificates-only CMS SignedData message (Section 3.4) containing | |||
the certificates, with the intermediate CA certificate(s) as the leaf | the certificates, with the intermediate CA certificate(s) as the | |||
certificate(s). There is no executable content. | leaf certificate(s). There is no executable content. | |||
Interoperability considerations: This is a grandfathered registration | Interoperability considerations: This is a grandfathered | |||
which is only used in SCEP. | registration that is only used in SCEP. | |||
Published specification: draft-gutmann-scep-15 | Published specification: RFC 8894 | |||
Applications that use this media type: SCEP uses this media type when | Applications that use this media type: SCEP uses this media type | |||
returning CA Certificate Chain Response. | when returning CA Certificate Chain Response. | |||
Fragment identifier considerations: N/A | Fragment identifier considerations: N/A | |||
Additional information: | Additional information: | |||
Deprecated alias names for this type: N/A | Deprecated alias names for this type: N/A | |||
Magic number(s): none | Magic number(s): none | |||
File extension(s): N/A | File extension(s): N/A | |||
Macintosh file type code(s): N/A | Macintosh file type code(s): N/A | |||
Person and email address to contact for further information: See the | Person and email address to contact for further information: See the | |||
Authors' Addresses section of draft-gutmann-scep-15 | Authors' Addresses section of RFC 8894. | |||
Intended usage: LIMITED USE | Intended usage: LIMITED USE | |||
Restrictions on usage: SCEP protocol | Restrictions on usage: SCEP protocol | |||
Author: See the Authors' Addresses section of draft-gutmann-scep-15 | Author: See the Authors' Addresses section of RFC 8894. | |||
Change controller: IETF | Change controller: IETF | |||
Provisional registration? no | Provisional registration? no | |||
7.3. Registration of application/x-x509-next-ca-cert media type | 6.3. Registration of the application/x-x509-next-ca-cert Media Type | |||
Type name: application | Type name: application | |||
Subtype name: x-x509-next-ca-cert | Subtype name: x-x509-next-ca-cert | |||
Required parameters: none | Required parameters: none | |||
Optional parameters: none | Optional parameters: none | |||
Encoding considerations: binary | Encoding considerations: binary | |||
Security considerations: This media type consists of a Signed-Data | Security considerations: This media type consists of a SignedData | |||
CMS message, signed by the current CA signing key. There is no | CMS message, signed by the current CA signing key. There is no | |||
executable content. | executable content. | |||
Interoperability considerations: This is a grandfathered registration | Interoperability considerations: This is a grandfathered | |||
which is only used in SCEP. | registration that is only used in SCEP. | |||
Published specification: draft-gutmann-scep-15 | Published specification: RFC 8894 | |||
Applications that use this media type: SCEP uses this media type when | Applications that use this media type: SCEP uses this media type | |||
returning a Get Next CA Response. | when returning a Get Next CA response. | |||
Fragment identifier considerations: N/A | Fragment identifier considerations: N/A | |||
Additional information: | Additional information: | |||
Deprecated alias names for this type: N/A | Deprecated alias names for this type: N/A | |||
Magic number(s): none | Magic number(s): none | |||
File extension(s): N/A | File extension(s): N/A | |||
Macintosh file type code(s): N/A | Macintosh file type code(s): N/A | |||
Person and email address to contact for further information: See the | Person and email address to contact for further information: See the | |||
Authors' Addresses section of draft-gutmann-scep-15 | Authors' Addresses section of RFC 8894. | |||
Intended usage: LIMITED USE | Intended usage: LIMITED USE | |||
Restrictions on usage: SCEP protocol | Restrictions on usage: SCEP protocol | |||
Author: See the Authors' Addresses section of draft-gutmann-scep-15 | Author: See the Authors' Addresses section of RFC 8894. | |||
Change controller: IETF | Change controller: IETF | |||
Provisional registration? no | Provisional registration? no | |||
7.4. Registration of application/x-pki-message media type | 6.4. Registration of the application/x-pki-message Media Type | |||
Type name: application | Type name: application | |||
Subtype name: x-pki-message | Subtype name: x-pki-message | |||
Required parameters: none | Required parameters: none | |||
Optional parameters: none | Optional parameters: none | |||
Encoding considerations: binary | Encoding considerations: binary | |||
Security considerations: This media type consists of a degenerate | Security considerations: This media type consists of a degenerate | |||
certificates-only CMS Signed-Data message. There is no executable | certificates-only CMS SignedData message. There is no executable | |||
content. | content. | |||
Interoperability considerations: This is a grandfathered registration | Interoperability considerations: This is a grandfathered | |||
which is only used in SCEP. | registration that is only used in SCEP. | |||
Published specification: draft-gutmann-scep-15 | Published specification: RFC 8894 | |||
Applications that use this media type: SCEP uses this media type when | Applications that use this media type: SCEP uses this media type | |||
returning a Certificate Enrolment/Renewal Response. | when returning a Certificate Enrolment/Renewal Response. | |||
Fragment identifier considerations: N/A | Fragment identifier considerations: N/A | |||
Additional information: | Additional information: | |||
Deprecated alias names for this type: N/A | Deprecated alias names for this type: N/A | |||
Magic number(s): none | Magic number(s): none | |||
File extension(s): N/A | File extension(s): N/A | |||
Macintosh file type code(s): N/A | Macintosh file type code(s): N/A | |||
Person and email address to contact for further information: See the | Person and email address to contact for further information: See the | |||
Authors' Addresses section of draft-gutmann-scep-15 | Authors' Addresses section of RFC 8894. | |||
Intended usage: LIMITED USE | Intended usage: LIMITED USE | |||
Restrictions on usage: SCEP protocol | Restrictions on usage: SCEP protocol | |||
Author: See the Authors' Addresses section of draft-gutmann-scep-15 | Author: See the Authors' Addresses section of RFC 8894. | |||
Change controller: IETF | Change controller: IETF | |||
Provisional registration? no | Provisional registration? no | |||
8. Security Considerations | 7. Security Considerations | |||
The security goal of SCEP is that no adversary can subvert the public | The security goal of SCEP is that no adversary can subvert the public | |||
key/identity binding from that intended. An adversary is any entity | key/identity binding from that intended. An adversary is any entity | |||
other than the client and the CA participating in the protocol. | other than the client and the CA participating in the protocol. | |||
This goal is met through the use of CMS and PKCS #10 encryption and | This goal is met through the use of CMS and PKCS #10 encryption and | |||
digital signatures using authenticated public keys. The CA's public | digital signatures using authenticated public keys. The CA's public | |||
key is authenticated via out-of-band means such as the checking of | key is authenticated via out-of-band means such as the checking of | |||
the CA fingerprint and the SCEP client's public key is authenticated | the CA fingerprint, and the SCEP client's public key is authenticated | |||
through manual or pre-shared secret authentication. | through manual or preshared secret authentication. | |||
8.1. General Security | 7.1. General Security | |||
Common key-management considerations such as keeping private keys | Common key-management considerations such as keeping private keys | |||
truly private and using adequate lengths for symmetric and asymmetric | truly private and using adequate lengths for symmetric and asymmetric | |||
keys must be followed in order to maintain the security of this | keys must be followed in order to maintain the security of this | |||
protocol. This is especially true for CA keys which, when | protocol. This is especially true for CA keys which, when | |||
compromised, compromise the security of all relying parties. | compromised, compromise the security of all relying parties. | |||
8.2. Use of the CA private key | 7.2. Use of the CA Private Key | |||
A CA private key is generally meant for, and is usually flagged as, | A CA private key is generally meant for, and usually flagged as, | |||
being usable for certificate (and CRL) signing exclusively rather | being usable for certificate (and CRL) signing exclusively rather | |||
than data signing or encryption. The SCEP protocol however uses the | than data signing or encryption. The SCEP protocol, however, uses | |||
CA private key to both sign and optionally encrypt CMS transport | the CA private key to both sign and optionally encrypt CMS transport | |||
messages. This is generally considered undesirable as it widens the | messages. This is generally considered undesirable, as it widens the | |||
possibility of an implementation weakness and provides an additional | possibility of an implementation weakness and provides an additional | |||
location where the private key must be used (and hence is slightly | location where the private key must be used (and hence is slightly | |||
more vulnerable to exposure) and where a side-channel attack might be | more vulnerable to exposure) and where a side-channel attack might be | |||
applied. | applied. | |||
8.3. ChallengePassword Shared Secret Value | 7.3. ChallengePassword Shared Secret Value | |||
The security measures that should be applied to the challengePassword | The security measures that should be applied to the challengePassword | |||
shared secret depend on the manner in which SCEP is employed. In the | shared secret depend on the manner in which SCEP is employed. In the | |||
simplest case, with SCEP used to provision devices with certificates | simplest case, with SCEP used to provision devices with certificates | |||
in the manufacturing facility, the physical security of the facility | in the manufacturing facility, the physical security of the facility | |||
may be enough to protect the certificate issue process with no | may be enough to protect the certificate issue process with no | |||
additional measures explicitly required. In general though the | additional measures explicitly required. In general, though, the | |||
security of the issue process depends on the security employed around | security of the issue process depends on the security employed around | |||
the use of the challengePassword shared secret. While it's not | the use of the challengePassword shared secret. While it's not | |||
possible to enumerate every situation in which SCEP may be utilised, | possible to enumerate every situation in which SCEP may be utilised, | |||
the following security measures should be considered. | the following security measures should be considered. | |||
o The challengePassword, despite its name, shouldn't be a | * The challengePassword, despite its name, shouldn't be a | |||
conventional password but a high-entropy shared secret | conventional password but a high-entropy shared-secret | |||
authentication string. Using the base64 encoding of a keying | authentication string. Using the base64 encoding of a keying | |||
value generated or exchanged as part of standard device | value generated or exchanged as part of standard device | |||
authentication protocols like EAP or DNP3 SA makes for a good | authentication protocols like the Extensible Authentication | |||
challengePassword. The use of high-entropy shared secrets is | Protocol (EAP) or DNP3 Secure Authentication (DNP3-SA) makes for a | |||
particulary important when the PasswordRecipientInfo option is | good challengePassword. The use of high-entropy shared secrets is | |||
used to encrypt SCEP messages, see Section 3.1. | particularly important when the PasswordRecipientInfo option is | |||
o If feasible, the challengePassword should be a one-time value used | used to encrypt SCEP messages; see Section 3.1. | |||
* If feasible, the challengePassword should be a one-time value used | ||||
to authenticate the issue of a single certificate (subsequent | to authenticate the issue of a single certificate (subsequent | |||
certificate requests will be authenticated by being signed with | certificate requests will be authenticated by being signed with | |||
the initial certificate). If the challengePassword is single-use | the initial certificate). If the challengePassword is single use, | |||
then the arrival of subsequent requests using the same | then the arrival of subsequent requests using the same | |||
challengePassword can then be used to indicate a security breach. | challengePassword can then be used to indicate a security breach. | |||
o The lifetime of a challengePassword can be limited, so that it can | * The lifetime of a challengePassword can be limited, so that it can | |||
be used during initial device provisioning but will have expired | be used during initial device provisioning but will have expired | |||
at a later date if an attacker manages to compromise the | at a later date if an attacker manages to compromise the | |||
challengePassword value, for example by compromising the device | challengePassword value -- for example, by compromising the device | |||
that it's stored in. | that it's stored in. | |||
* The CA should take appropriate measures to protect the | ||||
challengePassword. Examples of possible measures include: | ||||
physical security measures; storing it as a salted iterated hash | ||||
or equivalent memory-hard function; storing it as a keyed MAC | ||||
value if it's not being used for encryption; and storing it in | ||||
encrypted form if it is being used for encryption. | ||||
o The CA should take appropriate measures to protect the | 7.4. Lack of Certificate Issue Confirmation | |||
challengePassword, for example via physical security measures, or | ||||
by storing it as a salted iterated hash or equivalent memory-hard | ||||
function or as a keyed MAC value if it's not being used for | ||||
encryption, or by storing it in encrypted form if it is being used | ||||
for encryption. | ||||
8.4. Lack of Certificate Issue Confirmation | ||||
SCEP provides no confirmation that the issued certificate was | SCEP provides no confirmation that the issued certificate was | |||
successfully received and processed by the client. This means that | successfully received and processed by the client. This means that | |||
if the CertRep message is lost or can't be processed by the client | if the CertRep message is lost or can't be processed by the client, | |||
then the CA will consider the certificate successfully issued while | then the CA will consider the certificate successfully issued while | |||
the client won't. If this situation is of concern then the correct | 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 | 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 | means, for example, through the client sending a message signed by | |||
newly-issued certificate to the CA. This also provides the proof of | the newly issued certificate to the CA. This also provides the proof | |||
possession that's not present in the case of a renewal operation, see | of possession that's not present in the case of a renewal operation; | |||
Section 8.6. | see Section 7.6. | |||
8.5. GetCACaps Issues | 7.5. GetCACaps Issues | |||
The GetCACaps response is not authenticated by the CA. This allows | The GetCACaps response is not authenticated by the CA. This allows | |||
an attacker to perform downgrade attacks on the cryptographic | an attacker to perform downgrade attacks on the cryptographic | |||
capabilities of the client/CA exchange. In particular if the server | capabilities of the client/CA exchange. In particular, if the server | |||
were to support MD5 and single DES then an in-path attacker could | were to support MD5 and single DES, then an in-path attacker could | |||
trivially roll back the encryption to use these insecure algorithms. | trivially roll back the encryption to use these insecure algorithms. | |||
By taking advantage of the presence of large amounts of static known | By taking advantage of the presence of large amounts of static known | |||
plaintext in the SCEP messages, as of 2017 a DES rainbow table attack | plaintext in the SCEP messages, as of 2017, a DES rainbow table | |||
can recover most encryption keys in under a minute, and MD5 chosen- | attack can recover most encryption keys in under a minute, and MD5 | |||
prefix collisions can be calculated for a few tens of cents of | chosen-prefix collisions can be calculated for a few tens of cents of | |||
computing time using tools like HashClash. It is for this reason | computing time using tools like HashClash. It is for this reason | |||
that this specification makes single DES and MD5 a MUST NOT feature. | that this specification makes single DES and MD5 a MUST NOT feature. | |||
Note that all known servers support at least triple DES and SHA-1 | Note that all known servers support at least triple DES and SHA-1 | |||
(regardless of whether "DES3" and "SHA-1" are indicated in | (regardless of whether "DES3" and "SHA-1" are indicated in | |||
GetCACaps), so there should never be a reason to fall all the way | GetCACaps), so there should never be a reason to fall all the way | |||
back to single DES and MD5. One simple countermeasure to a GetCACaps | back to single DES and MD5. | |||
downgrade attack is for clients that are operating in an environment | ||||
where on-path attacks are possible and that expect the "SCEPStandard" | ||||
capability to be indicated by the CA but don't see it in the | ||||
GetCACaps response to treat its absence as a security issue, and | ||||
either discontinue the exchange or continue as if "SCEPStandard" had | ||||
been returned. This requires a certain tradeoff between | ||||
compatibility with old servers and security against active attacks. | ||||
8.6. Lack of PoP in Renewal Requests | One simple countermeasure to a GetCACaps downgrade attack is for | |||
clients that are operating in an environment where on-path attacks | ||||
are possible and that expect the "SCEPStandard" capability to be | ||||
indicated by the CA but don't see it in the GetCACaps response to | ||||
treat its absence as a security issue, and either discontinue the | ||||
exchange or continue as if "SCEPStandard" had been returned. This | ||||
requires a certain trade-off between compatibility with old servers | ||||
and security against active attacks. | ||||
7.6. Lack of PoP in Renewal Requests | ||||
Renewal operations (but not standard certificate-issue operations) | Renewal operations (but not standard certificate-issue operations) | |||
are processed via a previously-issued certificate and its associated | are processed via a previously issued certificate and its associated | |||
private key, not the key in the PKCS #10 request. This means that a | private key, not the key in the PKCS #10 request. This means that a | |||
client no longer demonstrates proof of possession (PoP) of the | client no longer demonstrates proof of possession (PoP) of the | |||
private key corresponding to the public key in the PKCS #10 request. | 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 | It is therefore possible for a client to recertify an existing key | |||
used by a third party, so that two or more certificates exist for the | 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 | same key. By switching out the certificate in a signature, an | |||
attacker can appear to have a piece of data signed by their | attacker can appear to have a piece of data signed by their | |||
certificate rather than the original signer's certificate. This, and | certificate rather than the original signer's certificate. This, and | |||
other, attacks are described in S/MIME ESS [21]. | other, attacks are described in S/MIME ESS [RFC2634]. | |||
Avoiding these types of attacks requires situation-specific measures. | Avoiding these types of attacks requires situation-specific measures. | |||
For example CMS/SMIME implementations may use the ESSCertID attribute | For example, CMS/SMIME implementations may use the ESSCertID | |||
from S/MIME ESS [21] or its successor S/MIME ESSv2 [22] to | attribute from S/MIME ESS [RFC2634] or its successor, S/MIME ESSv2 | |||
unambiguously identify the signing certificate. However since other | [RFC5035], to unambiguously identify the signing certificate. | |||
mechanisms and protocols that the certificates will be used with | However, since other mechanisms and protocols that the certificates | |||
typically don't defend against this problem, it's unclear whether | will be used with typically don't defend against this problem, it's | |||
this is an actual issue with SCEP. | unclear whether this is an actual issue with SCEP. | |||
8.7. Traffic Monitoring | 7.7. Traffic Monitoring | |||
SCEP messages are signed with certificates that may contain | SCEP messages are signed with certificates that may contain | |||
identifying information. If these are sent over the public Internet | identifying information. If these are sent over the public Internet | |||
and real identity information (rather than placeholder values or | and real identity information (rather than placeholder values or | |||
arbitrary device IDs) are included in the signing certificate data, | arbitrary device IDs) is included in the signing certificate data, an | |||
an attacker may be able to monitor the identities of the entities | attacker may be able to monitor the identities of the entities | |||
submitting the certificate requests. If this is an issue then [3] | submitting the certificate requests. If this is an issue, then | |||
should be consulted for guidance. | [RFC7258] should be consulted for guidance. | |||
8.8. Unnecessary cryptography | 7.8. Unnecessary Cryptography | |||
Some of the SCEP exchanges use unnecessary signing and encryption | Some of the SCEP exchanges use unnecessary signing and encryption | |||
operations. In particular the GetCert and GetCRL exchanges are | operations. In particular, the GetCert and GetCRL exchanges are | |||
encrypted and signed in both directions. The information requested | encrypted and signed in both directions. The information requested | |||
is public and thus encrypting the requests is of questionable value. | is public, and thus encrypting the requests is of questionable value. | |||
In addition CRLs and certificates sent in responses are already | In addition, CRLs and certificates sent in responses are already | |||
signed by the CA and can be verified by the recipient without | signed by the CA and can be verified by the recipient without | |||
requiring additional signing and encryption. More lightweight means | requiring additional signing and encryption. More lightweight means | |||
of retrieving certificates and CRLs such as HTTP certificate-store | of retrieving certificates and CRLs such as HTTP certificate-store | |||
access [17] and LDAP are recommended for this reason. | access [RFC4387] and LDAP are recommended for this reason. | |||
8.9. Use of SHA-1 | 7.9. Use of SHA-1 | |||
The majority of the large numbers of devices that use SCEP today | The majority of the large number of devices that use SCEP today | |||
default to SHA-1, with many supporting only that hash algorithm with | default to SHA-1, with many supporting only that hash algorithm with | |||
no ability to upgrade to a newer one. SHA-1 is no longer regarded as | no ability to upgrade to a newer one. SHA-1 is no longer regarded as | |||
secure in all situations, but as used in SCEP it's still safe. There | secure in all situations, but as used in SCEP, it's still safe. | |||
are three reasons for this. The first is that attacking SCEP would | There are three reasons for this. The first is that attacking SCEP | |||
require creating a fully general SHA-1 collision in close to real | would require creating a fully general SHA-1 collision in close to | |||
time alongside breaking AES (more specifically, it would require | real time alongside breaking AES (more specifically, it would require | |||
creating a fully general SHA-1 collision for the PKCS #10 request, | creating a fully general SHA-1 collision for the PKCS #10 request, | |||
breaking the AES encryption around the PKCS #10 request, and then | breaking the AES encryption around the PKCS #10 request, and then | |||
creating a second SHA-1 collision for the signature on the encrypted | creating a second SHA-1 collision for the signature on the encrypted | |||
data), which won't be feasible for a long time. | data), which won't be feasible for a long time. | |||
The second reason is that the signature over the message, in other | The second reason is that the signature over the message -- in other | |||
words the SHA-1 hash that isn't protected by encryption, doesn't | words, the SHA-1 hash that isn't protected by encryption -- doesn't | |||
serve any critical cryptographic purpose: The PKCS #10 data itself is | serve any critical cryptographic purpose: The PKCS #10 data itself is | |||
authenticated through its own signature, protected by encryption, and | authenticated through its own signature, protected by encryption, and | |||
the overall request is authorised by the (encrypted) shared secret. | the overall request is authorised by the (encrypted) shared secret. | |||
The sole exception to this will be the small number of | The sole exception to this will be the small number of | |||
implementations that support the Renewal operation, which may be | implementations that support the Renewal operation, which may be | |||
authorised purely through a signature, but presumably any | authorised purely through a signature, but presumably any | |||
implementation recent enough to support Renewal also supports SHA-2. | implementation recent enough to support Renewal also supports SHA-2. | |||
Any legacy implementation that supports the historic core SCEP | Any legacy implementation that supports the historic core SCEP | |||
protocol would not be affected. | protocol would not be affected. | |||
The third reason is that SCEP uses the same key for encryption and | The third reason is that SCEP uses the same key for encryption and | |||
signing, so that even if an attacker were able to capture an outgoing | signing, so that even if an attacker were able to capture an outgoing | |||
Renewal request that didn't include a shared secret (in other words | renewal request that didn't include a shared secret (in other words, | |||
one that was only authorised through a signature), break the AES | one that was only authorised through a signature), break the AES | |||
encryption, forge the SHA-1 hash in real time, and forward the forged | encryption, forge the SHA-1 hash in real time, and forward the forged | |||
request to the CA, they couldn't decrypt the returned certificate, | request to the CA, they couldn't decrypt the returned certificate, | |||
which is protected with the same key that was used to generate the | which is protected with the same key that was used to generate the | |||
signature. While Section 8.8 points out that SCEP uses unnecessary | signature. While Section 7.8 points out that SCEP uses unnecessary | |||
cryptography in places, the additional level of security provided by | cryptography in places, the additional level of security provided by | |||
the extra crypto makes it immune to any issues with SHA-1. | the extra crypto makes it immune to any issues with SHA-1. | |||
This doesn't mean that SCEP implementations should continue to use | This doesn't mean that SCEP implementations should continue to use | |||
SHA-1 in perpetuity, merely that there's no need for a panicked | SHA-1 in perpetuity, merely that there's no need for a panicked | |||
switch to SHA-2. | switch to SHA-2. | |||
9. References | 7.10. Use of HTTP | |||
9.1. Normative References | SCEP is an encrypted, authenticated certificate enrollment protocol | |||
that uses HTTP as a simple transport mechanism. Since SCEP messages | ||||
are already cryptographically secured, it does not require transport | ||||
layer security. Where HTTPS is elected, a performance hit may result | ||||
from the TLS overhead, operational problems may result due to the | ||||
more complex configuration, and potential security vulnerability may | ||||
result due to the addition of an entire TLS protocol stack alongside | ||||
the basic SCEP protocol. | ||||
[1] Bradner, S., "Key words for use in RFCs to Indicate | In particular, experience has shown that the issue of configuring | |||
Requirement Levels", BCP 14, RFC 2119, March 1997. | certificates, CAs, and trust for both TLS and SCEP often leads to | |||
interoperability problems because different certificates and trust | ||||
models are used in each. Use of HTTPS to authenticate the server | ||||
does not enable omission of the ChallengePassword or similar | ||||
authenticator in the SCEP message on the assumption that using HTTPS | ||||
instead of HTTP will somehow make this insecure usage secure again. | ||||
HTTPS is not soy sauce for security and is unnecessary for SCEP, | ||||
which uses cryptographically secured messages and does not require | ||||
transport layer security. | ||||
[2] Freed, N., Klensin, J., and T. Hansen, "Media Type | 8. References | |||
Specifications and Registration Procedures", RFC 6838, | ||||
January 2013. | ||||
[3] Farrell, S. and H. Tschofenig, "Guidelines for Writing an | 8.1. Normative References | |||
IANA Considerations Section in RFCs", RFC 7258, May 2014. | ||||
[4] Leiba, B. and T. Narten, "Guidelines for Writing an IANA | [AES] Technology, U. N. I. O. S. A., "The Advanced Encryption | |||
Considerations Section in RFCs", RFC 8126, June 2017. | Standard (AES)", FIPS 197, DOI 10.6028/NIST.FIPS.197, | |||
November 2001, <https://doi.org/10.6028/NIST.FIPS.197>. | ||||
[5] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
2119 Key Words", RFC 8174, May 2017. | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | ||||
<https://www.rfc-editor.org/info/rfc2119>. | ||||
[6] Crocker, R. and P. Overell, "Augmented BNF for Syntax | [RFC2985] Nystrom, M. and B. Kaliski, "PKCS #9: Selected Object | |||
Specifications: ABNF", RFC 5234, January 2008. | Classes and Attribute Types Version 2.0", RFC 2985, | |||
DOI 10.17487/RFC2985, November 2000, | ||||
<https://www.rfc-editor.org/info/rfc2985>. | ||||
[7] Technology, U. N. I. O. S. A., "The Advanced Encryption | [RFC2986] Nystrom, M. and B. Kaliski, "PKCS #10: Certification | |||
Standard (AES)", FIPS 197, November 2001. | Request Syntax Specification Version 1.7", RFC 2986, | |||
DOI 10.17487/RFC2986, November 2000, | ||||
<https://www.rfc-editor.org/info/rfc2986>. | ||||
[8] Technology, U. N. I. O. S. A., "Secure Hash Standard | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
(SHS)", FIPS 180-3, October 2008. | Resource Identifier (URI): Generic Syntax", STD 66, | |||
RFC 3986, DOI 10.17487/RFC3986, January 2005, | ||||
<https://www.rfc-editor.org/info/rfc3986>. | ||||
[9] Josefsson, S., "The Base16, Base32, and Base64 Data | [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | |||
Encodings", RFC 4648, October 2006. | Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, | |||
<https://www.rfc-editor.org/info/rfc4648>. | ||||
[10] Housley, R., "Cryptographic Message Syntax (CMS)", | [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | |||
RFC 5652, September 2009. | Specifications: ABNF", STD 68, RFC 5234, | |||
DOI 10.17487/RFC5234, January 2008, | ||||
<https://www.rfc-editor.org/info/rfc5234>. | ||||
[11] Fielding, R. and J. Reschke, "Hypertext Transfer Protocol | [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | |||
(HTTP/1.1): Message Syntax and Routing", RFC 7230, June | Housley, R., and W. Polk, "Internet X.509 Public Key | |||
2014. | Infrastructure Certificate and Certificate Revocation List | |||
(CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | ||||
<https://www.rfc-editor.org/info/rfc5280>. | ||||
[12] Nystrom, M. and B. Kaliski, "PKCS #9: Selected Object | [RFC5652] Housley, R., "Cryptographic Message Syntax (CMS)", STD 70, | |||
Classes and Attribute Types Version 2.0", RFC 2985, | RFC 5652, DOI 10.17487/RFC5652, September 2009, | |||
November 2000. | <https://www.rfc-editor.org/info/rfc5652>. | |||
[13] Nystrom, M. and B. Kaliski, "PKCS #10: Certification | [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type | |||
Request Syntax Specification Version 1.7", RFC 2986, | Specifications and Registration Procedures", BCP 13, | |||
November 2000. | RFC 6838, DOI 10.17487/RFC6838, January 2013, | |||
<https://www.rfc-editor.org/info/rfc6838>. | ||||
[14] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
Housley, R., and W. Polk, "Internet X.509 Public Key | Protocol (HTTP/1.1): Message Syntax and Routing", | |||
Infrastructure Certificate and Certificate Revocation List | RFC 7230, DOI 10.17487/RFC7230, June 2014, | |||
(CRL) Profile", RFC 5280, May 2008. | <https://www.rfc-editor.org/info/rfc7230>. | |||
[15] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [RFC7258] Farrell, S. and H. Tschofenig, "Pervasive Monitoring Is an | |||
Resource Identifiers (URI): Generic Syntax", RFC 3986, | Attack", BCP 188, RFC 7258, DOI 10.17487/RFC7258, May | |||
January 2005. | 2014, <https://www.rfc-editor.org/info/rfc7258>. | |||
9.2. Informative References | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
Writing an IANA Considerations Section in RFCs", BCP 26, | ||||
RFC 8126, DOI 10.17487/RFC8126, June 2017, | ||||
<https://www.rfc-editor.org/info/rfc8126>. | ||||
[16] Nottingham, M., "Building Protocols with HTTP", November | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2018. | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | ||||
[17] Gutmann, P., "Internet X.509 Public Key Infrastructure | [SHA2] Technology, U. N. I. O. S. A., "Secure Hash Standard | |||
Operational Protocols: Certificate Store Access via HTTP", | (SHS)", FIPS 180-3, October 2008. | |||
RFC 4387, February 2006. | ||||
[18] "A Java implementation of the Simple Certificate Enrolment | 8.2. Informative References | |||
Protocol", <https://github.com/jscep/jscep>. | ||||
[19] Alighieri, D., "Internet Key Exchange (IKEv2) Protocol", | [HTTP] Nottingham, M., "Building Protocols with HTTP", Work in | |||
RFC 7296, March 1300. | Progress, Internet-Draft, draft-ietf-httpbis-bcp56bis-09, | |||
November 1, 2019, <https://tools.ietf.org/html/draft-ietf- | ||||
httpbis-bcp56bis-09>. | ||||
[20] Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet | [JSCEP] "A Java implementation of the Simple Certificate Enrolment | |||
Mail Extensions (S/MIME) Version 3.2 Message | Protocol", commit 7410332, January 2020, | |||
Specification", RFC 5751, January 2010. | <https://github.com/jscep/jscep>. | |||
[21] Hoffman, P., "Enhanced Security Services for S/MIME", | [RFC2634] Hoffman, P., Ed., "Enhanced Security Services for S/MIME", | |||
RFC 2634, June 1999. | RFC 2634, DOI 10.17487/RFC2634, June 1999, | |||
<https://www.rfc-editor.org/info/rfc2634>. | ||||
[22] Schaad, J., "Enhanced Security Services (ESS) Update: | [RFC4387] Gutmann, P., Ed., "Internet X.509 Public Key | |||
Adding CertID Algorithm Agility", RFC 5035, August 2007. | Infrastructure Operational Protocols: Certificate Store | |||
Access via HTTP", RFC 4387, DOI 10.17487/RFC4387, February | ||||
2006, <https://www.rfc-editor.org/info/rfc4387>. | ||||
[23] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [RFC5035] Schaad, J., "Enhanced Security Services (ESS) Update: | |||
Version 1.3", RFC 8446, August 2018. | Adding CertID Algorithm Agility", RFC 5035, | |||
DOI 10.17487/RFC5035, August 2007, | ||||
<https://www.rfc-editor.org/info/rfc5035>. | ||||
[RFC7296] Kaufman, C., Hoffman, P., Nir, Y., Eronen, P., and T. | ||||
Kivinen, "Internet Key Exchange Protocol Version 2 | ||||
(IKEv2)", STD 79, RFC 7296, DOI 10.17487/RFC7296, October | ||||
2014, <https://www.rfc-editor.org/info/rfc7296>. | ||||
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | ||||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | ||||
<https://www.rfc-editor.org/info/rfc8446>. | ||||
[RFC8551] Schaad, J., Ramsdell, B., and S. Turner, "Secure/ | ||||
Multipurpose Internet Mail Extensions (S/MIME) Version 4.0 | ||||
Message Specification", RFC 8551, DOI 10.17487/RFC8551, | ||||
April 2019, <https://www.rfc-editor.org/info/rfc8551>. | ||||
Appendix A. Background Notes | Appendix A. Background Notes | |||
This specification has spent over twenty years in the draft stage. | This specification has spent over twenty years in the draft stage. | |||
Its original goal, provisioning IPsec routers with certificates, has | Its original goal, provisioning IPsec routers with certificates, has | |||
long since changed to general device/embedded system/IoT use. To fit | long since changed to general device/embedded system/IoT use. To fit | |||
this role, extra features were bolted on in a haphazard manner | this role, extra features were bolted on in a haphazard manner | |||
through the addition of a growing list of appendices and by inserting | through the addition of a growing list of appendices and by inserting | |||
additional, often conflicting, paragraphs in various locations in the | additional, often conflicting, paragraphs in various locations in the | |||
body text. Since existing features were never updated as newer ones | body text. Since existing features were never updated as newer ones | |||
were added, the specification accumulated large amounts of historical | were added, the specification accumulated large amounts of historical | |||
baggage over time. If OpenPGP was described as "a museum of 1990s | baggage over time. If OpenPGP was described as "a museum of 1990s | |||
crypto" then the SCEP draft was its graveyard. | crypto", then the SCEP document was its graveyard. | |||
About five years ago the specification, which even at that point had | About five years ago, the specification, which even at that point had | |||
seen only sporadic re-posts of the existing document, was more or | seen only sporadic reposts of the existing document, was more or less | |||
less abandoned by its original sponsors. Due to its widespread use | abandoned by its original sponsors. Due to its widespread use in | |||
in large segments of the industry, the specification was rebooted in | large segments of the industry, the specification was rebooted in | |||
2015, cleaning up fifteen years worth of accumulated cruft, fixing | 2015, cleaning up fifteen years' worth of accumulated cruft, fixing | |||
errors, clarifying ambiguities, and bringing the algorithms and | errors, clarifying ambiguities, and bringing the algorithms and | |||
standards used into the current century (prior to the update, the de- | standards used into the current century (prior to the update, the de | |||
facto lowest-common denominator algorithms used for interoperability | facto lowest-common-denominator algorithms used for interoperability | |||
were the insecure forty-year-old single DES and broken MD5 hash | were the insecure forty-year-old single DES and broken MD5 hash | |||
algorithms). | algorithms). | |||
Note that although the text of the current specification has changed | Note that although the text of the current specification has changed | |||
significantly due to the consolidation of features and appendices | significantly due to the consolidation of features and appendices | |||
into the main document, the protocol that it describes is identical | into the main document, the protocol that it describes is identical | |||
on the wire to the original (with the unavoidable exception of the | on the wire to the original (with the unavoidable exception of the | |||
switch from single DES and MD5 to AES and SHA-2). The only two | switch from single DES and MD5 to AES and SHA-2). The only two | |||
changes introduced, the "SCEPStandard" indicator in GetCACaps and the | changes introduced, the "SCEPStandard" indicator in GetCACaps and the | |||
failInfoText attribute, are both optional values and would be ignored | failInfoText attribute, are both optional values and would be ignored | |||
by older implementations that don't support them, or can be omitted | by older implementations that don't support them, or can be omitted | |||
from messages if they are found to cause problems. | from messages if they are found to cause problems. | |||
Other changes include: | Other changes include: | |||
o Resolved contradictions in the text, for example a requirement | * Resolved contradictions in the text -- for example, a requirement | |||
given as a MUST in one paragraph and a SHOULD in the next, a MUST | 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 in one paragraph and a MAY a few paragraphs later, a SHOULD | |||
NOT contradicted later by a MAY, and so on. | NOT contradicted later by a MAY, and so on. | |||
o Merged several later fragmentary addenda placed in appendices (for | ||||
example the handling of certificate renewal) with the body of the | * Merged several later fragmentary addenda placed in appendices (for | |||
example, the handling of certificate renewal) with the body of the | ||||
text. | text. | |||
o Merged the SCEP Transactions and SCEP Transport sections, since | ||||
the latter mostly duplicated (with occasional inconsistencies) the | * Merged the "SCEP Transactions" and "SCEP Transport" sections, | |||
former. | since the latter mostly duplicated (with occasional | |||
o Updated the algorithms to ones dating from at least this century. | inconsistencies) the former. | |||
o Did the same for normative references to other standards. | ||||
o Updated the text to use consistent terminology for the client and | * Updated the algorithms to ones dating from at least this century. | |||
* Did the same for normative references to other standards. | ||||
* Updated the text to use consistent terminology for the client and | ||||
CA rather than a mixture of client, requester, requesting system, | CA rather than a mixture of client, requester, requesting system, | |||
end entity, server, certificate authority, certification | end entity, server, certificate authority, certification | |||
authority, and CA. | authority, and CA. | |||
o Corrected incorrect references to other standards, e.g. | ||||
* Corrected incorrect references to other standards, e.g., | ||||
IssuerAndSerial -> IssuerAndSerialNumber. | IssuerAndSerial -> IssuerAndSerialNumber. | |||
o Corrected errors such as a statement that when both signature and | ||||
* Corrected errors such as a statement that when both signature and | ||||
encryption certificates existed, the signature certificate was | encryption certificates existed, the signature certificate was | |||
used for encryption. | used for encryption. | |||
o Condensed redundant discussions of the same topic spread across | ||||
multiple sections into a single location. For example the | * 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 | description of intermediate CA handling previously existed in | |||
three different locations, with slightly different reqirements in | three different locations, with slightly different requirements in | |||
each one. | each one. | |||
o Added a description of how pkiMessages were processed, which was | ||||
* Added a description of how pkiMessages were processed, which was | ||||
never made explicit in the original specification. This led to | never made explicit in the original specification. This led to | |||
creative interpretations that had security problems but were | creative interpretations that had security problems but were | |||
employed anyway due to the lack of specific guidance on what to | employed anyway due to the lack of specific guidance on what to | |||
do. | do. | |||
o Relaxed some requirements that didn't serve any obvious purpose | * Relaxed some requirements that didn't serve any obvious purpose | |||
and that major implementations didn't seem to be enforcing. For | and that major implementations didn't seem to be enforcing. For | |||
example the requirement that the self-signed certificate used with | example, the requirement that the self-signed certificate used | |||
a request MUST contain a subject name that matched the one in the | with a request MUST contain a subject name that matched the one in | |||
PKCS #10 request was relaxed to a SHOULD because a number of | the PKCS #10 request was relaxed to a SHOULD, because a number of | |||
implementations either ignored the issue entirely or at worst | implementations either ignored the issue entirely or at worst | |||
performed some minor action like creating a log entry after which | performed some minor action like creating a log entry, after which | |||
they continued anyway. | they continued anyway. | |||
o Removed discussion of the transactionID from the security | ||||
* Removed discussion of the transactionID from the security | ||||
considerations, since the instructions there were directly | considerations, since the instructions there were directly | |||
contradicted by the discussion of the use of the transactionID in | contradicted by the discussion of the use of the transactionID in | |||
Section 5. | Section 5. | |||
o Added a requirement that the signed message include the signing | ||||
* Added a requirement that the signed message include the signing | ||||
certificate(s) in the signedData certificates field. This was | certificate(s) in the signedData certificates field. This was | |||
implicit in the original specification (without it, the message | implicit in the original specification (without it, the message | |||
couldn't be verified by the CA) and was handled by the fact that | couldn't be verified by the CA) and was handled by the fact that | |||
most PKCS #7/CMS libraries do this by default, but was never | most PKCS #7/CMS libraries do this by default, but was never | |||
explicitly mentioned. | explicitly mentioned. | |||
o Clarified sections that were unclear or even made no sense, for | ||||
example the requirement for a "hash on the public key" [sic] | * 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. | encoded as a PrintableString. | |||
o Renamed "RA certificates" to "intermediate CA certificates". The | ||||
* Renamed "RA certificates" to "intermediate CA certificates". The | ||||
original document at some point added mention of RA certificates | original document at some point added mention of RA certificates | |||
without specifying how the client was to determine that an RA was | without specifying how the client was to determine that an RA was | |||
in use, how the RA operations were identified in the protocol, or | 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 | 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 | RA or merely an intermediate CA, as opposed to the default | |||
practice of having certificates issued directly from a single root | practice of having certificates issued directly from a single root | |||
CA certificate. This update uses the term "intermediate CA | CA certificate. This update uses the term "intermediate CA | |||
certificates", since this seems to have been the original intent | certificates", since this seems to have been the original intent | |||
of the text. | of the text. | |||
o Redid the PKIMessage diagram to match what was specified in CMS, | ||||
* Redid the PKIMessage diagram to match what was specified in CMS; | ||||
the original diagram omitted a number of fields and nested data | the original diagram omitted a number of fields and nested data | |||
structures which meant that the diagram didn't match either the | structures, which meant that the diagram didn't match either the | |||
text or the CMS specification. | text or the CMS specification. | |||
o Removed the requirement for a CertPoll to contain a | ||||
* Removed the requirement for a CertPoll to contain a | ||||
recipientNonce, since CertPoll is a client message and will never | recipientNonce, since CertPoll is a client message and will never | |||
be sent in response to a message containing a senderNonce. See | be sent in response to a message containing a senderNonce. See | |||
also the note in Section 3.3.2. | also the note in Section 3.3.2. | |||
o Clarified certificate renewal. This represents a capability that | ||||
was bolted onto the original protocol with (at best) vaguely- | * Clarified certificate renewal. This represents a capability that | |||
was bolted onto the original protocol with (at best) vaguely | ||||
defined semantics, including a requirement by the CA to guess | defined semantics, including a requirement by the CA to guess | |||
whether a particular request was a renewal or not. In response to | whether a particular request was a renewal or not. In response to | |||
developer feedback that they either avoided renewal entirely | developer feedback that they either avoided renewal entirely | |||
because of this uncertainty or hardcoded in particular behaviour | because of this uncertainty or hard-coded in particular behaviour | |||
on a per-CA basis, this specification explicitly identifies | on a per-CA basis, this specification explicitly identifies | |||
renewal requests as such, and provides proper semantics for them. | renewal requests as such and provides proper semantics for them. | |||
o Corrected the requirement that "undefined message types are | * Corrected the requirement that "undefined message types are | |||
treated as an error" since this negates the effect of GetCACaps, | treated as an error", since this negates the effect of GetCACaps, | |||
which is used to define new message types. In particular | which is used to define new message types. In particular, | |||
operations such as GetCACaps "Renewal" would be impossible if | operations such as GetCACaps "Renewal" would be impossible if | |||
enforced as written, because the Renewal operation was an | enforced as written, because the Renewal operation was an | |||
undefined message type at the time. | undefined message type at the time. | |||
o In line with the above, added IANA registries for several entries | ||||
that had previously been defined in an ad-hoc manner in different | * In line with the above, added IANA registries for several entries | |||
that had previously been defined in an ad hoc manner in different | ||||
locations in the text. | locations in the text. | |||
o Added the "SCEPStandard" keyword to GetCACaps to indicate that the | ||||
* Added the "SCEPStandard" keyword to GetCACaps to indicate that the | ||||
CA complies with the final version of the SCEP standard, since the | CA complies with the final version of the SCEP standard, since the | |||
definition of what constitutes SCEP standards compliance has | definition of what constitutes SCEP standards compliance has | |||
changed significantly over the years. | changed significantly over the years. | |||
o Added the optional failInfoText attribute to deal with the fact | ||||
* Added the optional failInfoText attribute to deal with the fact | ||||
that failInfo was incapable of adequately communicating to clients | that failInfo was incapable of adequately communicating to clients | |||
why a certificate request operation had been rejected. | why a certificate request operation had been rejected. | |||
o Removed the discussion in the security considerations of | ||||
* Removed the discussion in the security considerations of | ||||
revocation issues, since SCEP doesn't support revocation as part | revocation issues, since SCEP doesn't support revocation as part | |||
of the protocol. | of the protocol. | |||
o Clarified the use of nonces, which if applied as originally | ||||
* Clarified the use of nonces, which if applied as originally | ||||
specified would have made the use of polling in the presence of a | specified would have made the use of polling in the presence of a | |||
lost message impossible. | lost message impossible. | |||
o Removed the discussion of generating a given transactionID by | ||||
* Removed the discussion of generating a given transactionID by | ||||
hashing the public key, since this implied that there was some | hashing the public key, since this implied that there was some | |||
special significance in the value generated this way. Since it | special significance in the value generated this way. Since it | |||
was neither a MUST nor a MAY, it was unsound to imply that servers | 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 | could rely on the value being generated a certain way. In | |||
addition it wouldn't work if multiple transactions as discussed in | addition, it wouldn't work if multiple transactions as discussed | |||
Section 4.4 were initiated, since the deterministic generation via | in Section 4.4 were initiated, since the deterministic generation | |||
hashing would lead to duplicate transactionIDs. | via hashing would lead to duplicate transactionIDs. | |||
o Added examples of SCEP messages to give implementers something to | ||||
* Added examples of SCEP messages to give implementers something to | ||||
aim for. | aim for. | |||
Acknowledgements | ||||
The editor would like to thank all of the previous editors, authors, | ||||
and contributors for their work maintaining the document over the | ||||
years: Cheryl Madson, Xiaoyi Liu, David McGrew, David Cooper, Andy | ||||
Nourse, Max Pritikin, Jan Vilhuber, and others. The IETF reviewers | ||||
provided much useful feedback that helped improve the document, and | ||||
in particular spotted a number of things that were present in SCEP | ||||
through established practice rather than by being explicitly | ||||
described in the text. Numerous other people have contributed during | ||||
the long life cycle of the document, and all deserve thanks. In | ||||
addition, several PKCS #7 / CMS libraries contributed to | ||||
interoperability by doing the right thing despite what earlier SCEP | ||||
documents required. | ||||
The authors of earlier draft versions of this document would like to | ||||
thank Peter William of ValiCert, Inc. (formerly of VeriSign, Inc.), | ||||
Alex Deacon of VeriSign, Inc., and Christopher Welles of IRE, Inc. | ||||
for their contributions to early versions of this protocol and this | ||||
document. | ||||
Author's Address | Author's Address | |||
Peter Gutmann | Peter Gutmann | |||
University of Auckland | University of Auckland | |||
Department of Computer Science | Department of Computer Science | |||
Auckland | Auckland | |||
New Zealand | New Zealand | |||
Email: pgut001@cs.auckland.ac.nz | Email: pgut001@cs.auckland.ac.nz | |||
End of changes. 371 change blocks. | ||||
908 lines changed or deleted | 1060 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |