| |
| This is some preliminary documentation for OpenSSL. |
| |
| ============================================================================== |
| BUFFER Library |
| ============================================================================== |
| |
| [Note: I wrote this when I saw a Malloc version of strdup() in there which |
| I'd written myself anyway. I was so annoyed at not noticing this I decided to |
| document it :-) Steve.] |
| |
| The buffer library handles simple character arrays. Buffers are used for various |
| purposes in the library, most notably memory BIOs. |
| |
| The library uses the BUF_MEM structure defined in buffer.h: |
| |
| typedef struct buf_mem_st |
| { |
| int length; /* current number of bytes */ |
| char *data; |
| int max; /* size of buffer */ |
| } BUF_MEM; |
| |
| 'length' is the current size of the buffer in bytes, 'max' is the amount of |
| memory allocated to the buffer. There are three functions which handle these |
| and one "miscelanous" function. |
| |
| BUF_MEM *BUF_MEM_new() |
| |
| This allocates a new buffer of zero size. Returns the buffer or NULL on error. |
| |
| void BUF_MEM_free(BUF_MEM *a) |
| |
| This frees up an already existing buffer. The data is zeroed before freeing |
| up in case the buffer contains sensitive data. |
| |
| int BUF_MEM_grow(BUF_MEM *str, int len) |
| |
| This changes the size of an already existing buffer. It returns zero on error |
| or the new size (i.e. 'len'). Any data already in the buffer is preserved if |
| it increases in size. |
| |
| char * BUF_strdup(char *str) |
| |
| This is the previously mentioned strdup function: like the standard library |
| strdup() it copies a null terminated string into a block of allocated memory |
| and returns a pointer to the allocated block. |
| |
| Unlike the standard C library strdup() this function uses Malloc() and so |
| should be used in preference to the standard library strdup() because it can |
| be used for memory leak checking or replacing the malloc() function. |
| |
| The memory allocated from BUF_strdup() should be freed up using the Free() |
| function. |
| |
| ============================================================================== |
| OpenSSL X509V3 extension configuration |
| ============================================================================== |
| |
| OpenSSL X509V3 extension configuration: preliminary documentation. |
| |
| INTRODUCTION. |
| |
| For OpenSSL 0.9.2 the extension code has be considerably enhanced. It is now |
| possible to add and print out common X509 V3 certificate and CRL extensions. |
| |
| For more information about the meaning of extensions see: |
| |
| http://www.imc.org/ietf-pkix/ |
| http://home.netscape.com/eng/security/certs.html |
| |
| PRINTING EXTENSIONS. |
| |
| Extension values are automatically printed out for supported extensions. |
| |
| openssl x509 -in cert.pem -text |
| openssl crl -in crl.pem -text |
| |
| will give information in the extension printout, for example: |
| |
| |
| X509v3 extensions: |
| X509v3 Basic Constraints: |
| CA:TRUE |
| X509v3 Subject Key Identifier: |
| 73:FE:F7:59:A7:E1:26:84:44:D6:44:36:EE:79:1A:95:7C:B1:4B:15 |
| X509v3 Authority Key Identifier: |
| keyid:73:FE:F7:59:A7:E1:26:84:44:D6:44:36:EE:79:1A:95:7C:B1:4B:15, DirName:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/Email=email@1.address/Email=email@2.address, serial:00 |
| X509v3 Key Usage: |
| Certificate Sign, CRL Sign |
| X509v3 Subject Alternative Name: |
| email:email@1.address, email:email@2.address |
| |
| CONFIGURATION FILES. |
| |
| The OpenSSL utilities 'ca' and 'req' can now have extension sections listing |
| which certificate extensions to include. In each case a line: |
| |
| x509_extensions = extension_section |
| |
| indicates which section contains the extensions. In the case of 'req' the |
| extension section is used when the -x509 option is present to create a |
| self signed root certificate. |
| |
| You can also add extensions to CRLs: a line |
| |
| crl_extensions = crl_extension_section |
| |
| will include extensions when the -gencrl option is used with the 'ca' utility. |
| You can add any extension to a CRL but of the supported extensions only |
| issuerAltName and authorityKeyIdentifier make any real sense. Note: these are |
| CRL extensions NOT CRL *entry* extensions which cannot currently be generated. |
| CRL entry extensions can be displayed. |
| |
| EXTENSION SYNTAX. |
| |
| Extensions have the basic form: |
| |
| extension_name=[critical,] extension_options |
| |
| the use of the critical option makes the extension critical. Extreme caution |
| should be made when using the critical flag. If an extension is marked |
| as critical then any client that does not understand the extension should |
| reject it as invalid. Some broken software will reject certificates which |
| have *any* critical extensions (these violates PKIX but we have to live |
| with it). |
| |
| There are three main types of extension, string extensions, multi valued |
| extensions, and raw extensions. |
| |
| String extensions simply have a string which defines the value of the or how |
| it is obtained. |
| |
| For example: |
| |
| nsComment="This is a Comment" |
| |
| Multi valued extensions have a short form and a long form. The short form |
| is a list of names and values: |
| |
| basicConstraints=critical,CA:true,pathlen:1 |
| |
| The long form allows the values to be placed in a separate section: |
| |
| basicConstraints=critical,@bs_section |
| |
| [bs_section] |
| |
| CA=true |
| pathlen=1 |
| |
| Both forms are equivalent. However it should be noted that in some cases the |
| same name can appear multiple times, for example, |
| |
| subjectAltName=email:steve@here,email:steve@there |
| |
| in this case an equivalent long form is: |
| |
| subjectAltName=@alt_section |
| |
| [alt_section] |
| |
| email.1=steve@here |
| email.2=steve@there |
| |
| This is because the configuration file code cannot handle the same name |
| occurring twice in the same extension. |
| |
| Raw extensions allow arbitrary data to be placed in an extension. For |
| example |
| |
| 1.2.3.4=critical,RAW:01:02:03:04 |
| 1.2.3.4=RAW:01020304 |
| |
| The value following RAW is a hex dump of the extension contents. Any extension |
| can be placed in this form to override the default behaviour. For example: |
| |
| basicConstraints=critical,RAW:00:01:02:03 |
| |
| WARNING: raw extensions should be used with caution. It is possible to create |
| totally invalid extensions unless care is taken. |
| |
| CURRENTLY SUPPORTED EXTENSIONS. |
| |
| Literal String extensions. |
| |
| In each case the 'value' of the extension is placed directly in the extension. |
| Currently supported extensions in this category are: nsBaseUrl, nsRevocationUrl |
| nsCaRevocationUrl, nsRenewalUrl, nsCaPolicyUrl, nsSslServerName and |
| nsComment. |
| |
| For example: |
| |
| nsComment="This is a test comment" |
| |
| Bit Strings. |
| |
| Bit string extensions just consist of a list of suppported bits, currently |
| two extensions are in this category: PKIX keyUsage and the Netscape specific |
| nsCertType. |
| |
| nsCertType (netscape certificate type) takes the flags: client, server, email, |
| objsign, reserved, sslCA, emailCA, objCA. |
| |
| keyUsage (PKIX key usage) takes the flags: digitalSignature, nonRepudiation, |
| keyEncipherment, dataEncipherment, keyAgreement, keyCertSign, cRLSign, |
| encipherOnly, decipherOnly. |
| |
| For example: |
| |
| nsCertType=server |
| |
| keyUsage=critical, digitalSignature, nonRepudiation |
| |
| |
| Basic Constraints. |
| |
| Basic constraints is a multi valued extension that supports a CA and an |
| optional pathlen option. The CA option takes the values true and false and |
| pathlen takes an integer. Note if the CA option is false the pathlen option |
| should be omitted. |
| |
| Examples: |
| |
| basicConstraints=CA:TRUE |
| basicConstraints=critical,CA:TRUE, pathlen:10 |
| |
| NOTE: for a CA to be considered valid it must have the CA option set to |
| TRUE. An end user certificate MUST NOT have the CA value set to true. |
| According to PKIX recommendations it should exclude the extension entirely |
| however some software may require CA set to FALSE for end entity certificates. |
| |
| Subject Key Identifier. |
| |
| This is really a string extension and can take two possible values. Either |
| a hex string giving details of the extension value to include or the word |
| 'hash' which then automatically follow PKIX guidelines in selecting and |
| appropriate key identifier. The use of the hex string is strongly discouraged. |
| |
| Example: subjectKeyIdentifier=hash |
| |
| Authority Key Identifier. |
| |
| The authority key identifier extension permits two options. keyid and issuer: |
| both can take the optional value "always". |
| |
| If the keyid option is present an attempt is made to copy the subject key |
| identifier from the parent certificate. If the value "always" is present |
| then an error is returned if the option fails. |
| |
| The issuer option copies the issuer and serial number from the issuer |
| certificate. Normally this will only be done if the keyid option fails or |
| is not included: the "always" flag will always include the value. |
| |
| Subject Alternative Name. |
| |
| The subject alternative name extension allows various literal values to be |
| included in the configuration file. These include "email" (an email address) |
| "URI" a uniform resource indicator, "DNS" (a DNS domain name), RID (a |
| registered ID: OBJECT IDENTIFIER) and IP (and IP address). |
| |
| Also the email option include a special 'copy' value. This will automatically |
| include and email addresses contained in the certificate subject name in |
| the extension. |
| |
| Examples: |
| |
| subjectAltName=email:copy,email:my@other.address,URL:http://my.url.here/ |
| subjectAltName=email:my@other.address,RID:1.2.3.4 |
| |
| Issuer Alternative Name. |
| |
| The issuer alternative name option supports all the literal options of |
| subject alternative name. It does *not* support the email:copy option because |
| that would not make sense. It does support an additional issuer:copy option |
| that will copy all the subject alternative name values from the issuer |
| certificate (if possible). |
| |
| CRL distribution points. |
| |
| This is a multivalued extension that supports all the literal options of |
| subject alternative name. Of the few software packages that currently interpret |
| this extension most only interpret the URI option. |
| |
| Currently each option will set a new DistributionPoint with the fullName |
| field set to the given value. |
| |
| Other fields like cRLissuer and reasons cannot currently be set or displayed: |
| at this time no examples were available that used these fields. |
| |
| If you see this extension with <UNSUPPORTED> when you attempt to print it out |
| or it doesn't appear to display correctly then let me know, including the |
| certificate (mail me at steve@openssl.org) . |
| |
| Examples: |
| |
| crlDistributionPoints=URI:http://www.myhost.com/myca.crl |
| crlDistributionPoints=URI:http://www.my.com/my.crl,URI:http://www.oth.com/my.crl |
| |
| Certificate Policies. |
| |
| This is a RAW extension. It attempts to display the contents of this extension: |
| unfortuntately this extension is often improperly encoded. |
| |
| The certificate policies extension will rarely be used in practice: few |
| software packages interpret it correctly or at all. |
| |
| All the fields of this extension can be set by using the appropriate syntax. |
| |
| If you follow the PKIX recommendations of not including any qualifiers and just |
| using only one OID then you just include the value of that OID. Multiple OIDs |
| can be set separated by commas, for example: |
| |
| certificatePolicies= 1.2.4.5, 1.1.3.4 |
| |
| If you wish to include qualifiers then the policy OID and qualifiers need to |
| be specified in a separate section: this is done by using the @section syntax |
| instead of a literal OID value. |
| |
| The section referred to must include the policy OID using the name |
| policyIdentifier, cPSuri qualifiers can be included using the syntax: |
| |
| CPS.nnn=value |
| |
| userNotice qualifiers can be set using the syntax: |
| |
| userNotice.nnn=@notice |
| |
| The value of the userNotice qualifier is specified in the relevant section. This |
| section can include explicitText, organization and noticeNumbers options. |
| explicitText and organization are text strings, noticeNumbers is a comma |
| separated list of numbers. The organization and noticeNumbers options (if |
| included) must BOTH be present. |
| |
| Example: |
| |
| certificatePolicies=1.2.3.4,1.5.6.7.8,@polsect |
| |
| [polsect] |
| |
| policyIdentifier = 1.3.5.8 |
| CPS.1="http://my.host.name/" |
| CPS.2="http://my.your.name/" |
| userNotice.1=@notice |
| |
| [notice] |
| |
| explicitText="Explicit Text Here" |
| organization="Organisation Name" |
| noticeNumbers=1,2,3,4 |
| |
| Display only extensions. |
| |
| Some extensions are only partially supported and currently are only displayed |
| but cannot be set. These include private key usage period, CRL number, and |
| CRL reason. |
| |