d943e37241
this stuff.
358 lines
12 KiB
Plaintext
358 lines
12 KiB
Plaintext
|
|
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.
|
|
|