RFC 9883

An Attribute for Statement of Possession of a Private Key

πŸ“… published October 2025, from ietf

Internet Engineering Task Force (IETF) πŸ’–

Okay bestie, this one is literally about proving you own a private key without showing it to anyone πŸ”βœ¨ The header says:

  • Author: R. Housley, Vigil Security πŸŽ€
  • Request for Comments: 9883
  • Category: Standards Track (so it's a real, official spec πŸ‘‘)
  • Date: October 2025 πŸ“
  • ISSN: 2070-1721

This RFC doesn't obsolete or update anything else, so it's a fresh start, no drama πŸ’…


An Attribute for Statement of Possession of a Private Key πŸ¦‹

Abstract 🌸

Okay so the big idea is this: when you ask a Certification Authority (CA) for an X.509 certificate, the CA usually wants proof that you actually have the private key matching the public key you're sending. Normally that's a whole proof-of-possession dance πŸ™ˆ This document defines an attribute that lets you make a signed statement instead, but only in certain cases. The main one: if you already got a signature certificate, you can use a signed statement, validated against that signature cert, to get your key establishment certificate. Iconic efficiency πŸ”₯

Status of This Memo ✨

This is an Internet Standards Track document, so it's officially part of the IETF standards family πŸ’œ

It came out of the IETF process: it reflects the consensus of the IETF community, got public review, and was approved for publication by the Internet Engineering Steering Group (IESG). If you want the full scoop on Internet Standards, check out Section 2 of RFC 7841 🧚

You can find the current status, any errata, and where to send feedback at:

https://www.rfc-editor.org/info/rfc9883

Copyright (c) 2025 IETF Trust and the persons identified as the document authors. All rights reserved. 🫢

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) as they stood on the publication date. Read them carefully, because they spell out your rights and restrictions πŸ“œ Any Code Components pulled out of this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions, and they come without warranty as described in the Revised BSD License ⚠️

Table of Contents πŸ—ΊοΈ

1.  Introduction
  1.1.  ASN.1
  1.2.  Terminology
2.  Overview
3.  Attribute for Statement of Possession of a Private Key
4.  Conventions for PKCS#10
5.  Conventions for CRMF
6.  Security Considerations
7.  IANA Considerations
8.  References
  8.1.  Normative References
  8.2.  Informative References
Appendix A.  ASN.1 Module
Appendix B.  Example Use of the privateKeyPossessionStatement
        Attribute
Acknowledgements
Author's Address

1. Introduction πŸ’…

Same energy as the abstract, just with more detail ✨ This document defines an attribute for a statement of possession of a private key by a certificate subject. X.509 certificate enrollment [RFC5280] often runs on either PKCS#10 [RFC2986] or the Certificate Request Message Format (CRMF) [RFC4211] πŸŽ€

During enrollment, a CA usually wants proof that the subject has the private key matching the to-be-certified public key. Or, alternatively, the CA can accept a signed statement from the subject saying they know that private key πŸ”‘ When a subject needs separate certificates for signing and key establishment, a signed statement that can be checked against the signature certificate they already got for the same subject might be enough to get the key establishment certificate issued later πŸ¦‹

Here's the vibe check. A subject might need a signature certificate with an ML-DSA (Module-Lattice-Based Digital Signature Algorithm) public key, plus a key establishment certificate with an ML-KEM (Module-Lattice-Based Key-Encapsulation Mechanism) public key 🧚 Or they might want an ECDSA (Elliptic Curve Digital Signature Algorithm) public key for signing, plus an ECDH (Elliptic Curve Diffie-Hellman) public key for key establishment πŸ’œ

A statement of possession can stand in for the usual proof-of-possession mechanisms. It's basically a signed assertion that the requestor of a key establishment certificate has the key establishment private key, and the statement is signed with a signature private key that was already shown to belong to the same subject 🌸 If the Certificate Policy [RFC3647] allows it, the CA is allowed to accept this statement instead of proof of possession, like the mechanism in [RFC6955] πŸ“

Now the tea β˜• [RFC6955] has some algorithms for proof of possession with Diffie-Hellman private keys, but they aren't suitable for PKCS#10 [RFC2986], and they don't support key encapsulation mechanism algorithms like ML-KEM πŸ™ˆ The attribute in this document, though, works with both PKCS#10 and CRMF [RFC4211] πŸ‘‘

1.1. ASN.1 🧩

The attribute is generated using ASN.1 [X680] with the Distinguished Encoding Rules (DER) [X690] πŸ¦‹

1.2. Terminology πŸ“–

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here πŸ’–


2. Overview πŸ—ΊοΈ

When you use this attribute to make a statement about the key establishment private key, here's how to get two certificates with PKCS#10, step by step πŸŽ€

  1. The subject generates the signature key pair. πŸ”
  2. The subject composes a PKCS#10 Certificate Signing Request (CSR) the usual way. It includes a signature made with the private key from step 1 ✍️
  3. The subject sends the CSR to the CA and gets back a signature certificate. The signature certificate includes a key usage of digitalSignature, nonRepudiation, or both (see Section 4.2.1.3 of [RFC5280]) 🌈
  4. The subject generates the key establishment key pair. πŸ—οΈ
  5. The subject composes a PKCS#10 CSR containing the key establishment public key. The CSR attributes include the attribute from Section 3 of this document. The subject name matches the one from step 3. The CSR includes a signature made with the private key from step 1 πŸ’…
  6. The subject sends the CSR to the CA and gets back a key establishment certificate. The key establishment certificate includes a key usage of keyEncipherment or keyAgreement (see Section 4.2.1.3 of [RFC5280]) ✨

Usually, the issuer of the key establishment certificate is the same as the issuer of the signature certificate. If the two issuers are different, then the certificate policy of the key establishment certificate's issuer MUST explain the procedure used to verify the subject and subject alternative names πŸ¦‹


3. Attribute for Statement of Possession of a Private Key πŸŽ€

This attribute goes into a certificate request to make this statement:

The subject of the signature certificate that is used to validate the signature on this certificate request states, without providing proof, that it has possession of the private key that corresponds to the public key in the certificate request.

The CA MUST perform certification path validation for the signature certificate as specified in Section 6 of [RFC5280]. If the certification path is not valid, then the CA MUST reject the request for the key establishment certificate 🚫

The CA MUST validate the signature on the certificate request using the public key from the signature certificate. If the signature is not valid, then the CA MUST reject the certificate request πŸ”

The subject in the signature certificate SHOULD be the same as the subject name in the certificate request. If they're different, the certificate policy MUST describe how the CA can tell that the two subject names identify the same entity. If the CA can't tell, then the CA MUST reject the certificate request πŸ™ˆ

If subject alternative names are in the certificate request, they SHOULD match the subject alternative names in the signature certificate. If they're different, the certificate policy MUST describe how the CA can tell that the two subject alternative names identify the same entity. If the CA can't determine that each subject alternative name identifies the same entity named in the signature certificate, then the CA MUST reject the certificate request πŸ’€

When the CA rejects a certificate request for any of the reasons above, the CA SHOULD give the requestor information about the rejection reason to help with debugging. The CA SHOULD also log the rejection events πŸ“

The attribute has this structure:

id-at-statementOfPossession OBJECT IDENTIFIER ::=
  { 1 3 6 1 4 1 22112 2 1 }

privateKeyPossessionStatement ATTRIBUTE ::= {
  TYPE PrivateKeyPossessionStatement
  IDENTIFIED BY id-at-statementOfPossession }

PrivateKeyPossessionStatement ::= SEQUENCE {
  signer  IssuerAndSerialNumber,
  cert    Certificate OPTIONAL }

Here's what the components of the PrivateKeyStatement SEQUENCE mean 🧚

signer: The issuer name and certificate serial number of the signature certificate.

cert: The signature certificate. If the key establishment certificate's issuer is the same as the signature certificate's issuer, then this component MAY be omitted. When the signature certificate is omitted, the signer is assuming that the CA has a mechanism to get all valid certificates it issued 🌸


4. Conventions for PKCS#10 πŸ“

This section lays out the rules for using this attribute with PKCS#10 [RFC2986] when you request a key establishment certificate πŸ’œ

A PKCS#10 CertificationRequest always has three components πŸŽ€

certificationRequestInfo: The subject name SHOULD be the same as the subject name in the signature certificate. The subjectPKInfo MUST contain the public key for the key establishment algorithm. The attributes MUST include the privateKeyPossessionStatement attribute as specified in Section 3 of this document πŸ¦‹

signatureAlgorithm: The signature algorithm MUST be one that can be validated with the public key in the signature certificate πŸ”

signature: The signature over certificationRequestInfo MUST validate with the public key in the signature certificate, and certification path validation for the signature certificate MUST be successful as specified in Section 6 of [RFC5280] πŸ‘‘


Part 1 of 5 is done, bestie 🫢 Keep an eye out for the next part, which picks up with Section 5 (Conventions for CRMF) πŸ’–

5. Conventions for CRMF ✨

Okay so this section is all about how to use the statement-of-possession attribute with CRMF [RFC4211] when you're asking for a key establishment certificate πŸŽ€

The ASN.1 types below are defined for CRMF. They work exactly like the attribute we just covered, same semantics and same syntax πŸ’… The only difference is the naming, which lines up with the Registration Controls in [RFC4211] πŸ¦‹

     regCtrl-privateKeyPossessionStatement ATTRIBUTE ::=
       privateKeyPossessionStatement

     id-regCtrl-statementOfPossession OBJECT IDENTIFIER ::=
       id-at-statementOfPossession

A CRMF CertificationRequest always has three components, so here's the breakdown πŸ“

  • certReq: The certTemplate MUST include the subject and the publicKey components. The same subject name SHOULD match the subject name in the signature certificate, and publicKey MUST contain the public key for the key establishment algorithm.
  • popo: The ProofOfPossession MUST use the signature CHOICE, the poposkInput MUST be present, POPOSigningKeyInput.authInfo MUST use the sender CHOICE, the sender SHOULD be set to the subject name that appears in the signature certificate, the publicKey MUST contain a copy of the public key from the certTemplate, the algorithmIdentifier MUST identify a signature algorithm that can be validated with the public key in the signature certificate, the signature over the poposkInput MUST validate with the public key in the signature certificate, and certification path validation for the signature certificate MUST be successful as specified in Section 6 of [RFC5280]. That's a LOT of checks, bestie 😭πŸ”₯
  • regInfo: The attributes MUST include the privateKeyPossessionStatement attribute as specified in Section 3 of this document πŸ’œ

6. Security Considerations πŸ’€

This part is serious, so let's go 🫢

The privateKeyPossessionStatement attribute MUST NOT be used to obtain a signature certificate. Proof of possession of the signature private key is super easy to do, since you just sign the certificate request πŸ™ˆ

The subject signs the privateKeyPossessionStatement attribute to tell the CA that it has the key establishment private key. This is done instead of giving technical proof of possession. If the subject has lost control of the signature private key, then some other party could generate the signed privateKeyPossessionStatement attribute. Timely revocation of the compromised signature certificate is the only protection against that loss of control 😭

If the CA revokes a compromised signature certificate, then the CA SHOULD also revoke all key establishment certificates that were obtained with privateKeyPossessionStatement attributes signed by that compromised signature certificate 🌸

The signature key pair and the key establishment key pair are expected to have roughly the same security strength. To make sure the statement's signature isn't the weakest link in certificate enrollment, the signature key pair SHOULD be at least as strong as the key establishment key pair πŸ’ͺ

If a CA lets the subject in the key establishment certificate be different from the subject name in the signature certificate, then certificate policy MUST describe how to determine that the two subject names identify the same entity. Likewise, if a CA allows subject alternative names in the key establishment certificate that aren't present in the signature certificate, then certificate policy MUST describe how to determine that those subject alternative names identify the same entity as the one named in the signature certificate πŸ‘‘

Read the policy part twice, babe. Skipping it is how identities get mixed up 🚨

7. IANA Considerations 🌈

For the ASN.1 Module in Appendix A of this document, IANA has assigned an object identifier (OID) for the module identifier (118) with a Description of "id-mod-private-key-possession-stmt-2025" in the "SMI Security for PKIX Module Identifier" registry (1.3.6.1.5.5.7.0) ⭐

8. References πŸ“š

8.1. Normative References

8.2. Informative References

Appendix A. ASN.1 Module πŸŽ€

This ASN.1 Module uses the conventions established by [RFC5912] and [RFC6268] 🧚

   <CODE BEGINS>
   PrivateKeyPossessionStatement-2025
     { iso(1) identified-organization(3) dod(6) internet(1)
       security(5) mechanisms(5) pkix(7) id-mod(0)
       id-mod-private-key-possession-stmt-2025(118) }

   DEFINITIONS IMPLICIT TAGS ::= BEGIN

   EXPORTS ALL;

   IMPORTS
     ATTRIBUTE
     FROM PKIX-CommonTypes-2009 -- in [RFC5912]
       { iso(1) identified-organization(3) dod(6) internet(1)
         security(5) mechanisms(5) pkix(7) id-mod(0)
         id-mod-pkixCommon-02(57) }

     Certificate
     FROM PKIX1Explicit-2009 -- in [RFC5912]
       { iso(1) identified-organization(3) dod(6) internet(1)
         security(5) mechanisms(5) pkix(7) id-mod(0)
         id-mod-pkix1-explicit-02(51) }

     IssuerAndSerialNumber
     FROM CryptographicMessageSyntax-2010 -- [RFC6268]
       { iso(1) member-body(2) us(840) rsadsi(113549)
          pkcs(1) pkcs-9(9) smime(16) modules(0)
          id-mod-cms-2009(58) } ;

   --
   -- Private Key Possession Statement Attribute
   --

   id-at-statementOfPossession OBJECT IDENTIFIER ::=
     { 1 3 6 1 4 1 22112 2 1 }

   privateKeyPossessionStatement ATTRIBUTE ::= {
     TYPE PrivateKeyPossessionStatement
     IDENTIFIED BY id-at-statementOfPossession }

   PrivateKeyPossessionStatement ::= SEQUENCE {
     signer  IssuerAndSerialNumber,
     cert    Certificate OPTIONAL }

   --
   -- Registration Control Support
   --

   RegControlSet ATTRIBUTE ::=
     { regCtrl-privateKeyPossessionStatement, ... }

   regCtrl-privateKeyPossessionStatement ATTRIBUTE ::=
     privateKeyPossessionStatement

   id-regCtrl-statementOfPossession OBJECT IDENTIFIER ::=
     id-at-statementOfPossession

   END
   <CODE ENDS>

Appendix B. Example Use of the privateKeyPossessionStatement Attribute πŸ¦‹

Let's walk through an example 🌈 First up, here's the self-signed certificate for the CA:

   -----BEGIN CERTIFICATE-----
   MIIB7DCCAXKgAwIBAgIUL149AUxHunELBZMELEQm+isgKCQwCgYIKoZIzj0EAwMw
   NzELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkV4YW1wbGUgQ0ExEzARBgNVBAMTCmNh
   LmV4YW1wbGUwHhcNMjUwMTAzMjAyNzA5WhcNMzUwMTAzMjAyNzA5WjA3MQswCQYD
   VQQGEwJVUzETMBEGA1UEChMKRXhhbXBsZSBDQTETMBEGA1UEAxMKY2EuZXhhbXBs
   ZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDxZdB/Glcxdk1p6Jf1j5en6QfliY9OS
   fjZbtje/w6M58PN8Sb3VFln1rPdvD17UXeazSG9Hr/Dq3enbsHHO0pPntcFOgb8n
   r8R8LUGhxRzjlxkaEJN+pa6Nf7qk49JDeaM/MD0wDwYDVR0TAQH/BAUwAwEB/zAL
   BgNVHQ8EBAMCAgQwHQYDVR0OBBYEFD6YvLLv3DQbvnGS0qP6bbzyZkCqMAoGCCqG
   SM49BAMDA2gAMGUCMGfb61IigoJ3QDnlsRdoktREHe0Dpm6DKw3qOyLL6A0cFK9Z
   g8m11xIwvptlran52gIxAK1VrOjzRsFiHRptO+gFXstTXnQkKBb2/3WQz2SqcIS/
   BWEp+siJ19OXOlz6APDB7w==
   -----END CERTIFICATE-----

Alice generates her ECDSA signature key pair πŸ’– Then she composes a PKCS#10 Certificate Signing Request (CSR) the usual way, as specified in [RFC2986]. The CSR includes a signature made with her ECDSA private key. Here's the CSR:

   -----BEGIN CERTIFICATE REQUEST-----
   MIIBhTCCAQsCAQAwPDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlZBMRAwDgYDVQQH
   EwdIZXJuZG9uMQ4wDAYDVQQDEwVBbGljZTB2MBAGByqGSM49AgEGBSuBBAAiA2IA
   BIAc+6lXN1MIM/82QeWNb55H0zr+lVgWVeF0bf4jzxCb5MCjVaM0eFEvcjXMV5p4
   kzqiJTHC0V2JAoqYMX/DMFIcwZ7xP9uQd9ep6KZ+RXut211L8+W1QI1QJSDNxANR
   saBQME4GCSqGSIb3DQEJDjFBMD8wDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCB4Aw
   IgYDVR0RBBswGYEXYWxpY2VAZW1haWwuZXhhbXBsZS5jb20wCgYIKoZIzj0EAwMD
   aAAwZQIwPa2rOCe60edAF43C/t57IW8liyy+69FE04hMAFgw3Ga+nR+8zDuUsVLw
   xXGAHtcDAjEA6LbvNkZjo6j2z5xRIjrHzEbGgiV4MF4xtnpfSSRI4dB0zT52bWkj
   TZsuS1YWIkjt
   -----END CERTIFICATE REQUEST-----

The CA issues Alice a signature certificate πŸŽ‰

   -----BEGIN CERTIFICATE-----
   MIICJzCCAa6gAwIBAgIUf3Sj/ANs4hR4XFlhTm+N8kxHqHkwCgYIKoZIzj0EAwMw
   NzELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkV4YW1wbGUgQ0ExEzARBgNVBAMTCmNh
   LmV4YW1wbGUwHhcNMjUwMTA5MTcwMzQ4WhcNMjYwMTA5MTcwMzQ4WjA8MQswCQYD
   VQQGEwJVUzELMAkGA1UECBMCVkExEDAOBgNVBAcTB0hlcm5kb24xDjAMBgNVBAMT
   BUFsaWNlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEgBz7qVc3Uwgz/zZB5Y1vnkfT
   Ov6VWBZV4XRt/iPPEJvkwKNVozR4US9yNcxXmniTOqIlMcLRXYkCipgxf8MwUhzB
   nvE/25B316nopn5Fe63bXUvz5bVAjVAlIM3EA1Gxo3YwdDAMBgNVHRMBAf8EAjAA
   MAsGA1UdDwQEAwIHgDAdBgNVHQ4EFgQUIx0A0f7tCzkQEZgYzH3NcM2L05IwHwYD
   VR0jBBgwFoAUPpi8su/cNBu+cZLSo/ptvPJmQKowFwYDVR0gBBAwDjAMBgpghkgB
   ZQMCATAwMAoGCCqGSM49BAMDA2cAMGQCMGu/Uypd7BaVnUjB36UtX9m5ZmPi78y5
   1RA8WhbOv0KQVrcYtj4qOdiMVKBcoVceyAIwRJ6U91048NAb3nicHcrGFf1UYrhb
   DlytK4tCa5HBxD/qAgy4/eUzA5NZwVaLK78u
   -----END CERTIFICATE-----

Now Alice generates her ECDH key establishment key pair 🌸 Then she composes a PKCS#10 CSR. The CSR attributes include the privateKeyPossessionStatement attribute, which points to her ECDSA signature certificate. The CSR also includes her ECDH public key and a signature made with her ECDSA private key. The CSR is as follows:

-----BEGIN CERTIFICATE REQUEST-----
MIIEMTCCA7gCAQAwPDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlZBMRAwDgYDVQQH
EwdIZXJuZG9uMQ4wDAYDVQQDEwVBbGljZTB0MA4GBSuBBAEMBgUrgQQAIgNiAAQB
RyQTH+cq1s5F94uFqFe7l1LqGdEC8Tm+e5VYBCfKAC8MJySQMj1GixEEXL+1Wjtg
23XvnJouCDoxSpDCSMqf3kvp5+naM37uxa3ZYgD6DPY3me5EZvyZPvSRJTFl/Bag
ggL9MGcGCSqGSIb3DQEJDjFaMFgwDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCAwgw
IgYDVR0RBBswGYEXYWxpY2VAZW1haWwuZXhhbXBsZS5jb20wFwYDVR0gBBAwDjAM
BgpghkgBZQMCATAwMIICkAYKKwYBBAGBrGACATGCAoAwggJ8ME8wNzELMAkGA1UE
BhMCVVMxEzARBgNVBAoTCkV4YW1wbGUgQ0ExEzARBgNVBAMTCmNhLmV4YW1wbGUC
FH90o/wDbOIUeFxZYU5vjfJMR6h5MIICJzCCAa6gAwIBAgIUf3Sj/ANs4hR4XFlh
Tm+N8kxHqHkwCgYIKoZIzj0EAwMwNzELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkV4
YW1wbGUgQ0ExEzARBgNVBAMTCmNhLmV4YW1wbGUwHhcNMjUwMTA5MTcwMzQ4WhcN
MjYwMTA5MTcwMzQ4WjA8MQswCQYDVQQGEwJVUzELMAkGA1UECBMCVkExEDAOBgNV
BAcTB0hlcm5kb24xDjAMBgNVBAMTBUFsaWNlMHYwEAYHKoZIzj0CAQYFK4EEACID
YgAEgBz7qVc3Uwgz/zZB5Y1vnkfTOv6VWBZV4XRt/iPPEJvkwKNVozR4US9yNcxX
mniTOqIlMcLRXYkCipgxf8MwUhzBnvE/25B316nopn5Fe63bXUvz5bVAjVAlIM3E
A1Gxo3YwdDAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIHgDAdBgNVHQ4EFgQUIx0A
0f7tCzkQEZgYzH3NcM2L05IwHwYDVR0jBBgwFoAUPpi8su/cNBu+cZLSo/ptvPJm
QKowFwYDVR0gBBAwDjAMBgpghkgBZQMCATAwMAoGCCqGSM49BAMDA2cAMGQCMGu/
Uypd7BaVnUjB36UtX9m5ZmPi78y51RA8WhbOv0KQVrcYtj4qOdiMVKBcoVceyAIw
RJ6U91048NAb3nicHcrGFf1UYrhbDlytK4tCa5HBxD/qAgy4/eUzA5NZwVaLK78u
MAoGCCqGSM49BAMDA2cAMGQCL2TNHPULWcCS2DqZCCiQeSwx2JPLMI14Vi977bzy
rImq5p0H3Bel6fAS8BnQ00WNAjEAhHDAlcbRuHhqdW6mOgDd5kWEGGqgixIuvEEc
fVbnNCEyEE4n0mQ99PHURnXoHwqF
-----END CERTIFICATE REQUEST-----

Okay so this is the CSR we're looking at πŸŽ€ and once you decode it, here's what it spills out πŸ‘€βœ¨

okay so this is where the CA finally hands Alice her key establishment certificate πŸŽ€βœ¨ it's giving "here's your official ID, bestie" πŸ’… the whole thing is a big ASN.1 SEQUENCE, so I'm keeping every byte exact so you can check it yourself πŸ”πŸ¦‹

      0 1073: SEQUENCE {
      4  952:  SEQUENCE {
      8    1:   INTEGER 0
     11   60:   SEQUENCE {
     13   11:    SET {
     15    9:     SEQUENCE {
     17    3:      OBJECT IDENTIFIER countryName (2 5 4 6)
     22    2:      PrintableString 'US'
            :       }
            :      }
     26   11:    SET {
     28    9:     SEQUENCE {
     30    3:      OBJECT IDENTIFIER stateOrProvinceName (2 5 4 8)
     35    2:      PrintableString 'VA'
            :       }
            :      }
     39   16:    SET {
     41   14:     SEQUENCE {
     43    3:      OBJECT IDENTIFIER localityName (2 5 4 7)
     48    7:      PrintableString 'Herndon'
            :       }
            :      }
     57   14:    SET {
     59   12:     SEQUENCE {
     61    3:      OBJECT IDENTIFIER commonName (2 5 4 3)
     66    5:      PrintableString 'Alice'
            :       }
            :      }
            :     }
     73  116:   SEQUENCE {
     75   14:    SEQUENCE {
     77    5:     OBJECT IDENTIFIER ECDH (1 3 132 1 12)
     84    5:     OBJECT IDENTIFIER secp384r1 (1 3 132 0 34)
            :      }
     91   98:    BIT STRING
            :     04 01 47 24 13 1F E7 2A D6 CE 45 F7 8B 85 A8 57
            :     BB 97 52 EA 19 D1 02 F1 39 BE 7B 95 58 04 27 CA
            :     00 2F 0C 27 24 90 32 3D 46 8B 11 04 5C BF B5 5A
            :     3B 60 DB 75 EF 9C 9A 2E 08 3A 31 4A 90 C2 48 CA
            :     9F DE 4B E9 E7 E9 DA 33 7E EE C5 AD D9 62 00 FA
            :     0C F6 37 99 EE 44 66 FC 99 3E F4 91 25 31 65 FC
            :     16
            :     }
    191  765:   [0] {
    195  103:    SEQUENCE {
    197    9:     OBJECT IDENTIFIER
            :      extensionRequest (1 2 840 113549 1 9 14)
    208   90:     SET {
    210   88:      SEQUENCE {
    212   12:       SEQUENCE {
    214    3:        OBJECT IDENTIFIER
            :         basicConstraints (2 5 29 19)
    219    1:        BOOLEAN TRUE
    222    2:        OCTET STRING, encapsulates {
    224    0:         SEQUENCE {}
            :          }
            :         }
    226   11:       SEQUENCE {
    228    3:        OBJECT IDENTIFIER keyUsage (2 5 29 15)
    233    4:        OCTET STRING, encapsulates {
    235    2:         BIT STRING 3 unused bits
            :          '10000'B (bit 4)
            :          }
            :         }
    239   34:       SEQUENCE {
    241    3:        OBJECT IDENTIFIER subjectAltName (2 5 29 17)
    246   27:        OCTET STRING, encapsulates {
    248   25:         SEQUENCE {
    250   23:          [1] 'alice@email.example.com'
            :           }
            :          }
            :         }
    275   23:       SEQUENCE {
    277    3:        OBJECT IDENTIFIER
            :         certificatePolicies (2 5 29 32)
    282   16:        OCTET STRING, encapsulates {
    284   14:         SEQUENCE {
    286   12:          SEQUENCE {
    288   10:           OBJECT IDENTIFIER
            :            testCertPolicy (2 16 840 1 101 3 2 1 48 48)
            :            }
            :           }
            :          }
            :         }
            :        }
            :       }
            :      }
    300  656:    SEQUENCE {
    304   10:     OBJECT IDENTIFIER
            :      statementOfPossession (1 3 6 1 4 1 22112 2 1)
    316  640:     SET {
    320  636:      SEQUENCE {
    324   79:       SEQUENCE {
    326   55:        SEQUENCE {
    328   11:         SET {
    330    9:          SEQUENCE {
    332    3:           OBJECT IDENTIFIER countryName (2 5 4 6)
    337    2:           PrintableString 'US'
            :            }
            :           }
    341   19:         SET {
    343   17:          SEQUENCE {
    345    3:           OBJECT IDENTIFIER
            :            organizationName (2 5 4 10)
    350   10:           PrintableString 'Example CA'
            :            }
            :           }
    362   19:         SET {
    364   17:          SEQUENCE {
    366    3:           OBJECT IDENTIFIER commonName (2 5 4 3)
    371   10:           PrintableString 'ca.example'
            :            }
            :           }
            :          }
    383   20:        INTEGER
            :      7F 74 A3 FC 03 6C E2 14 78 5C 59 61 4E 6F 8D F2
            :      4C 47 A8 79
            :         }
    405  551:       SEQUENCE {
    409  430:        SEQUENCE {
    413    3:         [0] {
    415    1:          INTEGER 2
            :           }
    418   20:         INTEGER
            :      7F 74 A3 FC 03 6C E2 14 78 5C 59 61 4E 6F 8D F2
            :      4C 47 A8 79
    440   10:         SEQUENCE {
    442    8:          OBJECT IDENTIFIER
            :           ecdsaWithSHA384 (1 2 840 10045 4 3 3)
            :           }
    452   55:         SEQUENCE {
    454   11:          SET {
    456    9:           SEQUENCE {
    458    3:            OBJECT IDENTIFIER
            :             countryName (2 5 4 6)
    463    2:            PrintableString 'US'
            :             }
            :            }
    467   19:          SET {
    469   17:           SEQUENCE {
    471    3:            OBJECT IDENTIFIER
            :             organizationName (2 5 4 10)
    476   10:            PrintableString 'Example CA'
            :             }
            :            }
    488   19:          SET {
    490   17:           SEQUENCE {
    492    3:            OBJECT IDENTIFIER
            :             commonName (2 5 4 3)
    497   10:            PrintableString 'ca.example'
            :             }
            :            }
            :           }
    509   30:         SEQUENCE {
    511   13:          UTCTime 09/01/2025 17:03:48 GMT
    526   13:          UTCTime 09/01/2026 17:03:48 GMT
            :           }
    541   60:         SEQUENCE {
    543   11:          SET {
    545    9:           SEQUENCE {
    547    3:            OBJECT IDENTIFIER
            :             countryName (2 5 4 6)
    552    2:            PrintableString 'US'
            :             }
            :            }
    556   11:          SET {
    558    9:           SEQUENCE {
    560    3:            OBJECT IDENTIFIER
            :             stateOrProvinceName (2 5 4 8)
    565    2:            PrintableString 'VA'
            :             }
            :            }
    569   16:          SET {
    571   14:           SEQUENCE {
    573    3:            OBJECT IDENTIFIER
            :             localityName (2 5 4 7)
    578    7:            PrintableString 'Herndon'
            :             }
            :            }
    587   14:          SET {
    589   12:           SEQUENCE {
    591    3:            OBJECT IDENTIFIER
            :             commonName (2 5 4 3)
    596    5:            PrintableString 'Alice'
            :             }
            :            }
            :           }
    603  118:         SEQUENCE {
    605   16:          SEQUENCE {
    607    7:           OBJECT IDENTIFIER
            :            ecPublicKey (1 2 840 10045 2 1)
    616    5:           OBJECT IDENTIFIER
            :            secp384r1 (1 3 132 0 34)
            :            }
    623   98:          BIT STRING
            :      04 80 1C FB A9 57 37 53 08 33 FF 36 41 E5 8D 6F
            :      9E 47 D3 3A FE 95 58 16 55 E1 74 6D FE 23 CF 10
            :      9B E4 C0 A3 55 A3 34 78 51 2F 72 35 CC 57 9A 78
            :      93 3A A2 25 31 C2 D1 5D 89 02 8A 98 31 7F C3 30
            :      52 1C C1 9E F1 3F DB 90 77 D7 A9 E8 A6 7E 45 7B
            :      AD DB 5D 4B F3 E5 B5 40 8D 50 25 20 CD C4 03 51
            :      B1
            :           }
    723  118:         [3] {
    725  116:          SEQUENCE {
    727   12:           SEQUENCE {
    729    3:            OBJECT IDENTIFIER
            :             basicConstraints (2 5 29 19)
    734    1:            BOOLEAN TRUE
    737    2:            OCTET STRING, encapsulates {
    739    0:             SEQUENCE {}
            :              }
            :             }
    741   11:           SEQUENCE {
    743    3:            OBJECT IDENTIFIER
            :             keyUsage (2 5 29 15)
    748    4:            OCTET STRING, encapsulates {
    750    2:             BIT STRING 7 unused bits
            :              '1'B (bit 0)
            :              }
            :             }
    754   29:           SEQUENCE {
    756    3:            OBJECT IDENTIFIER
            :             subjectKeyIdentifier (2 5 29 14)
    761   22:            OCTET STRING, encapsulates {
    763   20:             OCTET STRING
            :      23 1D 00 D1 FE ED 0B 39 10 11 98 18 CC 7D CD 70
            :      CD 8B D3 92
            :              }
            :             }
    785   31:           SEQUENCE {
    787    3:            OBJECT IDENTIFIER
            :             authorityKeyIdentifier (2 5 29 35)
    792   24:            OCTET STRING, encapsulates {
    794   22:             SEQUENCE {
    796   20:              [0]
            :      3E 98 BC B2 EF DC 34 1B BE 71 92 D2 A3 FA 6D BC
            :      F2 66 40 AA
            :               }
            :              }
            :             }
    818   23:           SEQUENCE {
    820    3:            OBJECT IDENTIFIER
            :             certificatePolicies (2 5 29 32)
    825   16:            OCTET STRING, encapsulates {
    827   14:             SEQUENCE {
    829   12:              SEQUENCE {
    831   10:               OBJECT IDENTIFIER
            :                testCertPolicy (2 16 840 1 101 3 2 1 48 48)
            :                }
            :               }
            :              }
            :             }
            :            }
            :           }
            :          }
    843   10:        SEQUENCE {
    845    8:         OBJECT IDENTIFIER ecdsaWithSHA384 (1 2 840 10045 4 3 3)
            :          }
    855  103:        BIT STRING, encapsulates {
    858  100:         SEQUENCE {
    860   48:          INTEGER
            :      6B BF 53 2A 5D EC 16 95 9D 48 C1 DF A5 2D 5F D9
            :      B9 66 63 E2 EF CC B9 D5 10 3C 5A 16 CE BF 42 90
            :      56 B7 18 B6 3E 2A 39 D8 8C 54 A0 5C A1 57 1E C8
    910   48:          INTEGER
            :      44 9E 94 F7 5D 38 F0 D0 1B DE 78 9C 1D CA C6 15
            :      FD 54 62 B8 5B 0E 5C AD 2B 8B 42 6B 91 C1 C4 3F
            :      EA 02 0C B8 FD E5 33 03 93 59 C1 56 8B 2B BF 2E
            :           }
            :          }
            :         }
            :        }
            :       }
            :      }
            :     }
            :    }
    960   10:  SEQUENCE {
    962    8:   OBJECT IDENTIFIER ecdsaWithSHA384 (1 2 840 10045 4 3 3)
            :    }
    972  103:  BIT STRING, encapsulates {
    975  100:   SEQUENCE {
    977   47:    INTEGER
            :     64 CD 1C F5 0B 59 C0 92 D8 3A 99 08 28 90 79 2C
            :     31 D8 93 CB 30 8D 78 56 2F 7B ED BC F2 AC 89 AA
            :     E6 9D 07 DC 17 A5 E9 F0 12 F0 19 D0 D3 45 8D
   1026   49:    INTEGER
            :     00 84 70 C0 95 C6 D1 B8 78 6A 75 6E A6 3A 00 DD
            :     E6 45 84 18 6A A0 8B 12 2E BC 41 1C 7D 56 E7 34
            :     21 32 10 4E 27 D2 64 3D F4 F1 D4 46 75 E8 1F 0A
            :     85
            :     }
            :    }
            :   }

Okay bestie, here's Alice's certificate, the one that proves she holds the private key πŸ”βœ¨

-----BEGIN CERTIFICATE-----
MIICJTCCAaygAwIBAgIUf3Sj/ANs4hR4XFlhTm+N8kxHqHowCgYIKoZIzj0EAwMw
NzELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkV4YW1wbGUgQ0ExEzARBgNVBAMTCmNh
LmV4YW1wbGUwHhcNMjUwMTA5MTcwNTAwWhcNMjYwMTA5MTcwNTAwWjA8MQswCQYD
VQQGEwJVUzELMAkGA1UECBMCVkExEDAOBgNVBAcTB0hlcm5kb24xDjAMBgNVBAMT
BUFsaWNlMHQwDgYFK4EEAQwGBSuBBAAiA2IABAFHJBMf5yrWzkX3i4WoV7uXUuoZ
0QLxOb57lVgEJ8oALwwnJJAyPUaLEQRcv7VaO2Dbde+cmi4IOjFKkMJIyp/eS+nn
6dozfu7FrdliAPoM9jeZ7kRm/Jk+9JElMWX8FqN2MHQwDAYDVR0TAQH/BAIwADAL
BgNVHQ8EBAMCAwgwHQYDVR0OBBYEFAnLfJvnEUcvLXaPUDZMZlQ/zZ3WMB8GA1Ud
IwQYMBaAFD6YvLLv3DQbvnGS0qP6bbzyZkCqMBcGA1UdIAQQMA4wDAYKYIZIAWUD
AgEwMDAKBggqhkjOPQQDAwNnADBkAjARQ5LuV6yz8A5DZCll1S/gfxZ+QSJl/pKc
cTL6Sdr1IS18U/zY8VUJeB2H0nBamLwCMBRQ6sEWpNoeeR8Bonpoot/zYD2luQ1V
2jevmYsnBihKF0debgfhGvh8WIgBR69DZg==
-----END CERTIFICATE-----

Acknowledgements πŸ™πŸŒΈ

Big thank yous to Sean Turner, Joe Mandel, Mike StJohns, Mike Ounsworth, John Gray, Carl Wallace, Corey Bonnell, Hani Ezzadeen, Deb Cooley, Mohamed Boucadair, and Bron Gondwana for their constructive comments πŸ’œ you all literally made this spec better, iconic behaviour fr πŸ‘‘

Author's Address πŸ¦‹

Russ Housley Vigil Security, LLC Herndon, VA United States of America Email: housley@vigilsec.com πŸ’Œ

πŸ“¦ where this page comes from