There are many extensions available in x.509 v3, but a few core ones are important. Extensions come in two flavors: critical and non-critical. The spec often defines extensions as "MUST be marked critical" or "SHOULD be marked critical." If an extension is marked critical it means that any implementation that doesn't support that extension needs to not accept the certificate. Additionally, some implimentations seem to get very confused by critical extensions in general. For this reason, many SSL rollouts will follow PKIX guidelines everywhere *except* marking extensions as critical.
So what are these important extensions? Glad you asked. There are three that many modern implimentatinos require - especially for non-flat setups (i.e. anything with nested CAs).
- Subject Key Identifier (SKID)
- This is simply a hash of the public key inside the certificate. As it's name suggests, it is used to unquely identify a key in the event a CA has more than one. It is important that CA certificates have this.
- Authority Key Identifier (AKID)
- This can be a few different things. Most commonly, it's the value of the Issuer's Subject Key Identifier. Together SKIDs and AKIDs help us to ensure the chain of authority. However, an AKID can also be the "Issuer" field and "Serial" field *of the issuer*. In other words, if A signs B which signs C, C's AKID can be B's Issuer (i.e., A's subject).
- Basic Constraints
- This defines where or not a certificate can act as a CA or not, and optionally defines the maximum length of the path from this certificate to an end-entity certificate.
The above three are, generally speaking, the three main extensions needed for a V3 certificate. Note that technically a root-level CA doesn't need an AKID (it'd be the same as it's SKID), though it doesn't hurt. Other useful extensions follow.
- This defines the path to find revocation information for that certificate. Since CRLs are generated by a CA, if you think about it, the extension is really defining where the issuer's CRL lives.
- Netscape Cert Type
- Determines what kind of certificate this is: Server, Client, etc.
- Key Usage
- Determines what the private key may be used for: signing, encrypting, etc.