| 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/ | ||||