Are you sure there is an ExtendedKeyUsage indicating a "Certificate Sign"
OID? Cert Sign AFAIK is only indicated in KeyUsage extension.

-Sandeep

On Sat, Oct 1, 2011 at 9:24 AM, <jb-open...@wisemo.com> wrote:

> On 01-10-2011 01:09, Dave Thompson wrote:
>
>> From: owner-openssl-users@openssl.**org <owner-openssl-us...@openssl.org>On 
>> Behalf Of
>>> jb-open...@wisemo.com
>>> Sent: Thursday, 29 September, 2011 18:46
>>> Because the attributes mentioned are only meaningful if covered by the
>>> digital signature on the certificate, it cannot change in any format
>>> conversion that keeps the certificate valid.
>>>
>>> The true format of certificates is binary BER encoded X.509.
>>>
>>> A .cer file is simply that structure directly.
>>>
>> Yes, or sometimes converted to PEM format. PEM is the binary
>> represented in base64 plus dashes-BEGIN-x and dashes-END-x lines.
>> It looks different in e.g. notepad but is fundamentally the same.
>>
> I was trying to keep it simple for the OP.  In fact both .cer and .p7b
> files can be Base64 encoded PEM style.  PEM encoding a .p12/.pfx
> file is less useful and might not even be allowed.
>
>
>  A P7b/PKCS#7 file is really a digitally signed message with
>>> zero or more
>>> attached signatures to help the recipient to check the signature, each
>>>
>> OYM attached *certificates* to help check the signature(s)
>>
> Sorry, typo, I was in a hurry when I wrote the message.
>
>  certificate is the same X.509 BER structure, just placed inside a list
>>> (SEQUENCE) inside a PKCS#7 structure (which is also BER encoded just
>>> like the certificate).  When using a P7b file to transport
>>> certificates,
>>> the message and signature fields are just left blank.
>>>
>>> A P12/PFX/PKCS#12 file is an encrypted file which stores various
>>> certificates (the same X.509 BER structure as before), various
>>> private keys and hints on where these items should be imported
>>> into CryptoAPI and/or the old Netscape browser.
>>>
>>>  Yes.
>>
>>  So whatever the format, after loading and unpacking, you are left
>>> with an X.509 structure which contains a few mandatory fields
>>> (such as Subject, Issuer, Public Key, Private Key, Serial Number),
>>>
>> NOT PrivateKey! Also validityPeriod (start-time and end-time).
>> BTW originally serialNumber often was truly serial (1, 2, 3, etc.)
>> but for some time now it has been more common to make it
>> a large unique (random or obscured) number.
>>
> Oops! big typo, of cause not the private key.  "Such as" means there are
> other fields not mentioned.
>
>  and a lot of optional fields.  One of those optional fields is a
>>> list of "authenticated attributes".  Each entry in that list has
>>>
>> Although included in the signed part, it is just called 'extensions'.
>> 'authenticatedAttributes' and separate 'unauthenticatedAttributes'
>> are fields in PKCS#7/CMS SignedData.
>>
> Sorry about that, Its hard to keep track of these subtle variations
> without looking them up.
>
>  a "type OID", a "critical" flag and some data.  The entries may
>>> be found in any order, your code needs to work whatever field
>>> entry comes first, needs to ignore any entry whose "type OID"
>>> you don't understand.
>>>
>>>  You can ignore an extension you don't understand if it is
>> non-critical; you should give an error if it is critical
>> and you are actually relying on the cert for something.
>> If just looking at a specific extension, as here, you
>> don't need to even see other/unknown extensions.
>>
> I would have mentioned it, but for the OPs problem (deciding the
> certificate
> category), ignoring critical extensions is fine, so I removed that part
> from
> my post before hitting send.
>
>  The optional "CA" occurs in this list as an entry with the "CA"
>>> OID and a TRUE/FALSE value.  So CA may be "not there", TRUE
>>> or FALSE.
>>>
>>>  Actually the extension is BasicConstraints; it contains
>> CA: boolean and pathLen: OPTIONAL INTEGER. You can have:
>> - omitted
>> - CA=false
>> - CA=true pathlen=unspecified
>> - CA=true pathlen=somenumber
>> For deciding 'CA or not' pathlen doesn't matter.
>>
> Oh, I forgot it was in the same Ext, this may affect any manual
> parsing the OP might write.
>
>  The optional "Key Usage" also occurs in this list as an entry
>>> with the "Key Usage" OID and a value which is a list of OIDs
>>> (one for each usage).  So Key Usage mat be "not there",
>>> "there" with the "certificate sign" OID listed in its value,
>>> or "there" without the "certificate sign" OID in its value.
>>>
>>>  You have two things conflated here.
>> KeyUsage value is 9 predefined bits, including certSign.
>> *Extended*KeyUsage value is a list of extensible OIDs.
>> A cert can have either or both or neither.
>> If you have both and they conflict, reliers should reject.
>>
> Oops, I really was a bit fast yesterday, so there are really 3 exts to
> check for "can act as a CA at all":
>
> - BasicConstraints (look for CA:TRUE bit)
> - KeyUsage (look for "certificate sign" bit being set)
> - ExtendedKeyUsage (look for "certificate sign" OID in list)
>
> If any of these 3 are present, it is a CA (root or intermediate)
> If none of these 3 are present, it is an end entity cert (CA issued or
> toy).
>
>
>  I don't remember the function names to look at the
>>> "authenticated attribute" list in OpenSSL and/or CryptoAPI,
>>> but there should be functions that will let you check if the
>>> list is there at all, and if so loop over all the entries, looking
>>> at each to see if it is one you care about today.
>>>
>>>  OpenSSL: AFAICS the functions never distinguish between extensions
>> omitted entirely or present but empty (zero-length sequence),
>> which should make no semantic difference to anyone ever.
>> But unlike some other OpenSSL data structures these aren't
>> hidden, so you can just look if you really care.
>>
>> Or you can just ask for a particular extension by OID
>> or NID (which is OpenSSL's internal equivalent).
>>
>> And for this particular decision you can just call X509_check_ca
>> which isn't in the manpage but is public in x509v3.h and appears
>> to have been stable for years. It checks KU and BC.CA if present,
>> or otherwise does some guessing that looks reasonable to me
>> and even if you disagree you might use it as a starting point.
>>
>>  On 29-09-2011 17:33, Harshvir Sidhu wrote:
>>>
>> <snip>
>>
>>
>>
> ______________________________**______________________________**__________
> OpenSSL Project                                 http://www.openssl.org
> User Support Mailing List                    openssl-users@openssl.org
> Automated List Manager                           majord...@openssl.org
>

Reply via email to