I think the best way to change a Certificate into a Precertificate would be to 
alter the first field of the tbsCertificate to be non-optional and explicitly 
tagged as something other than tag [0].  Then, reconstruct the actual 
tbsCertificate by changing the first field to tag [0], perform any other 
necessary edits (like, for name redaction), re-encode the validly-tagged 
tbsCertificate to DER, and digest the encoded data.

But, I also proposed (a few years ago) a way to include an issued certificate 
list in a CRL extension to mitigate the Diginotar-style "we didn't know it had 
been issued" problem, and to be able to feed CRL-based OCSP responders with a 
minimum of code changes. That didn't go anywhere, and I expect this suggestion 
to go nowhere as well.

-Kyle H

On September 9, 2014 12:56:11 PM PST, Brian Smith <[email protected]> wrote:
>On Mon, Sep 8, 2014 at 4:24 PM, Rick Andrews
><[email protected]> wrote:
>>> The CA may use a Precertificate Signing Certificate to sign the
>Precertificate, and then sign the final certificate with the production
>CA certificate. Then, there would be no duplicate serial number issues.
>>
>> Brian, even if the CA uses a Precert signing cert, the precert's
>issuer name has to be that of the ultimate issuer, and the serial
>number has to be that of the ultimate certificate, so I don't think
>that solves the problem.
>
>Thanks for pointing that out. Basically, the cause of that problem is
>that a Precertificate is a syntactically-valid X.509 certificate, and
>so it could be considered a duplicate of the final certificate. If the
>Precertificate weren't a syntactically-valid X.509 certificate, then
>there would be no way it could be considered a duplicate. So, why not
>make this simple change to the syntax:
>
>enum { x509_entry(0), precert_entry(1), (65535) } LogEntryType;
>
>  struct {
>    LogEntryType entry_type;
>    select (entry_type) {
>      case x509_entry: ASN.1Cert;
>      case precert_entry: ASN.1Precert;
>    } entry;
>    ASN.1Cert certificate_chain<0..2^24-1>;
>  } LogEntry;
>
>  opaque ASN.1Cert<1..2^24-1>;
>  opaque ASN.1Precert<1..2^24-1>;
>
>where the internal syntax of ASN.1Precert is (in ASN.1):
>
>  ASN1Precert ::=  SEQUENCE  {
>    precertSigningCert [0] EXPLICIT OptionalCertificate,
>    tbsCertificate       TBSCertificate,
>    signatureAlgorithm   AlgorithmIdentifier,
>    signatureValue BIT STRING }
>
>  OptionalCertificate ::= certificate Certificate OPTIONAL;
>
>In other words, ASN1Precert is exactly an X.509 Certificate except
>that it starts with an explicitly-tagged, possibly-empty
>precertSigningCert field. Thus, no X.509 certificate parser would
>parse a precert as though it were a real certificate, and so the
>precert could never be considered a duplicate of the final cert.
>Additionally, there would be no need for the "poison extension"
>because the added precertSigningCert field serves the same purpose.
>
>This strawman only attempts to solve the "duplicate certificate"
>problem, not the "must reserve the serial number in advance" problem.
>However, I suspect that this change would make it more difficult for
>some CAs to create precertificates.
>
>Cheers,
>Brian
>
>_______________________________________________
>Trans mailing list
>[email protected]
>https://www.ietf.org/mailman/listinfo/trans

-- 
Sent from my Android device with K-9 Mail. Please excuse my brevity.
_______________________________________________
Trans mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/trans

Reply via email to