Standard preamble:
========================================================================
..
.... Set up some character translations and predefined strings. \*(-- will
give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
double quote, and \*(R" will give a right double quote. \*(C+ will
give a nicer C++. Capital omega is used to do unbreakable dashes and
therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
nothing in troff, for use with C<>.
.tr \(*W- . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\}
Escape single quotes in literal strings from groff's Unicode transform.
If the F register is >0, we'll generate index entries on stderr for
titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
entries marked with X<> in POD. Of course, you'll have to process the
output yourself in some meaningful fashion.
Avoid warning from groff about undefined register 'F'.
.. .nr rF 0 . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF
Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] .\} . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents . \" corrections for vroff . \" for low resolution devices (crt and lpr) \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} ========================================================================
Title "X509V3_CONFIG 5"
way too many mistakes in technical documents.
Typically the application will contain an option to point to an extension section. Each line of the extension section takes the form:
.Vb 1 extension_name=[critical,] extension_options .Ve
If critical is present then the extension will be critical.
The format of extension_options depends on the value of extension_name.
There are four main types of extension: string extensions, multi-valued extensions, raw and arbitrary extensions.
String extensions simply have a string which contains either the value itself or how it is obtained.
For example:
.Vb 1 nsComment="This is a Comment" .Ve
Multi-valued extensions have a short form and a long form. The short form is a list of names and values:
.Vb 1 basicConstraints=critical,CA:true,pathlen:1 .Ve
The long form allows the values to be placed in a separate section:
.Vb 1 basicConstraints=critical,@bs_section \& [bs_section] \& CA=true pathlen=1 .Ve
Both forms are equivalent.
The syntax of raw extensions is governed by the extension code: it can for example contain data in multiple sections. The correct syntax to use is defined by the extension code itself: check out the certificate policies extension for an example.
If an extension type is unsupported then the arbitrary extension syntax must be used, see the \s-1ARBITRARY EXTENSIONS\s0 section for more details.
For example:
.Vb 1 basicConstraints=CA:TRUE \& basicConstraints=CA:FALSE \& basicConstraints=critical,CA:TRUE, pathlen:0 .Ve
A \s-1CA\s0 certificate must include the basicConstraints value with the \s-1CA\s0 field set to \s-1TRUE.\s0 An end user certificate must either set \s-1CA\s0 to \s-1FALSE\s0 or exclude the extension entirely. Some software may require the inclusion of basicConstraints with \s-1CA\s0 set to \s-1FALSE\s0 for end entity certificates.
The pathlen parameter indicates the maximum number of CAs that can appear below this one in a chain. So if you have a \s-1CA\s0 with a pathlen of zero it can only be used to sign end user certificates and not further CAs.
The supported names are: digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign, cRLSign, encipherOnly and decipherOnly.
Examples:
.Vb 1 keyUsage=digitalSignature, nonRepudiation \& keyUsage=critical, keyCertSign .Ve
These can either be object short names or the dotted numerical form of OIDs. While any \s-1OID\s0 can be used only certain values make sense. In particular the following \s-1PKIX, NS\s0 and \s-1MS\s0 values are meaningful:
.Vb 10 Value Meaning ----- ------- serverAuth SSL/TLS Web Server Authentication. clientAuth SSL/TLS Web Client Authentication. codeSigning Code signing. emailProtection E-mail Protection (S/MIME). timeStamping Trusted Timestamping OCSPSigning OCSP Signing ipsecIKE ipsec Internet Key Exchange msCodeInd Microsoft Individual Code Signing (authenticode) msCodeCom Microsoft Commercial Code Signing (authenticode) msCTLSign Microsoft Trust List Signing msEFS Microsoft Encrypted File System .Ve
Examples:
.Vb 2 extendedKeyUsage=critical,codeSigning,1.2.3.4 extendedKeyUsage=serverAuth,clientAuth .Ve
Example:
.Vb 1 subjectKeyIdentifier=hash .Ve
If the keyid option is present an attempt is made to copy the subject key identifier from the parent certificate. If the value \*(L"always\*(R" is present then an error is returned if the option fails.
The issuer option copies the issuer and serial number from the issuer certificate. This will only be done if the keyid option fails or is not included unless the \*(L"always\*(R" flag will always include the value.
Example:
.Vb 1 authorityKeyIdentifier=keyid,issuer .Ve
The email option include a special 'copy' value. This will automatically include any email addresses contained in the certificate subject name in the extension.
The \s-1IP\s0 address used in the \s-1IP\s0 options can be in either IPv4 or IPv6 format.
The value of dirName should point to a section containing the distinguished name to use as a set of name value pairs. Multi values AVAs can be formed by prefacing the name with a + character.
otherName can include arbitrary data associated with an \s-1OID:\s0 the value should be the \s-1OID\s0 followed by a semicolon and the content in standard \fBASN1_generate_nconf\|(3) format.
Examples:
.Vb 5 subjectAltName=email:copy,email:my@other.address,URI:http://my.url.here/ subjectAltName=IP:192.168.7.1 subjectAltName=IP:13::17 subjectAltName=email:my@other.address,RID:1.2.3.4 subjectAltName=otherName:1.2.3.4;UTF8:some other identifier \& subjectAltName=dirName:dir_sect \& [dir_sect] C=UK O=My Organization OU=My Unit CN=My Name .Ve
Example:
.Vb 1 issuerAltName = issuer:copy .Ve
Example:
.Vb 2 authorityInfoAccess = OCSP;URI:http://ocsp.my.host/ authorityInfoAccess = caIssuers;URI:http://my.ca/ca.html .Ve
For a name:value pair a new DistributionPoint with the fullName field set to the given value both the cRLissuer and reasons fields are omitted in this case.
In the single option case the section indicated contains values for each field. In this section:
If the name is \*(L"fullname\*(R" the value field should contain the full name of the distribution point in the same format as subject alternative name.
If the name is \*(L"relativename\*(R" then the value field should contain a section name whose contents represent a \s-1DN\s0 fragment to be placed in this field.
The name \*(L"CRLIssuer\*(R" if present should contain a value for this field in subject alternative name format.
If the name is \*(L"reasons\*(R" the value field should consist of a comma separated field containing the reasons. Valid reasons are: \*(L"keyCompromise\*(R", \*(L"CACompromise\*(R", \*(L"affiliationChanged\*(R", \*(L"superseded\*(R", \*(L"cessationOfOperation\*(R", \*(L"certificateHold\*(R", \*(L"privilegeWithdrawn\*(R" and \*(L"AACompromise\*(R".
Simple examples:
.Vb 2 crlDistributionPoints=URI:http://myhost.com/myca.crl crlDistributionPoints=URI:http://my.com/my.crl,URI:http://oth.com/my.crl .Ve
Full distribution point example:
.Vb 1 crlDistributionPoints=crldp1_section \& [crldp1_section] \& fullname=URI:http://myhost.com/myca.crl CRLissuer=dirName:issuer_sect reasons=keyCompromise, CACompromise \& [issuer_sect] C=UK O=Organisation CN=Some Name .Ve
The names \*(L"reasons\*(R" and \*(L"CRLissuer\*(R" are not recognized.
The name \*(L"onlysomereasons\*(R" is accepted which sets this field. The value is in the same format as the \s-1CRL\s0 distribution point \*(L"reasons\*(R" field.
The names \*(L"onlyuser\*(R", \*(L"onlyCA\*(R", \*(L"onlyAA\*(R" and \*(L"indirectCRL\*(R" are also accepted the values should be a boolean value (\s-1TRUE\s0 or \s-1FALSE\s0) to indicate the value of the corresponding field.
Example:
.Vb 1 issuingDistributionPoint=critical, @idp_section \& [idp_section] \& fullname=URI:http://myhost.com/myca.crl indirectCRL=TRUE onlysomereasons=keyCompromise, CACompromise \& [issuer_sect] C=UK O=Organisation CN=Some Name .Ve
If you follow the \s-1PKIX\s0 recommendations and just using one \s-1OID\s0 then you just include the value of that \s-1OID.\s0 Multiple OIDs can be set separated by commas, for example:
.Vb 1 certificatePolicies= 1.2.4.5, 1.1.3.4 .Ve
If you wish to include qualifiers then the policy \s-1OID\s0 and qualifiers need to be specified in a separate section: this is done by using the @section syntax instead of a literal \s-1OID\s0 value.
The section referred to must include the policy \s-1OID\s0 using the name policyIdentifier, cPSuri qualifiers can be included using the syntax:
.Vb 1 CPS.nnn=value .Ve
userNotice qualifiers can be set using the syntax:
.Vb 1 userNotice.nnn=@notice .Ve
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 \s-1BOTH\s0 be present. If you use the userNotice option with \s-1IE5\s0 then you need the 'ia5org' option at the top level to modify the encoding: otherwise it will not be interpreted properly.
Example:
.Vb 1 certificatePolicies=ia5org,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 .Ve
The ia5org option changes the type of the organization field. In \s-1RFC2459\s0 it can only be of type DisplayText. In \s-1RFC3280\s0 IA5String is also permissible. Some software (for example some versions of \s-1MSIE\s0) may require ia5org.
\s-1ASN1\s0 type of explicitText can be specified by prepending \s-1UTF8\s0, \fB\s-1BMP\s0 or \s-1VISIBLE\s0 prefix followed by colon. For example:
.Vb 2 [notice] explicitText="UTF8:Explicit Text Here" .Ve
Example:
.Vb 1 policyConstraints = requireExplicitPolicy:3 .Ve
Example:
.Vb 1 inhibitAnyPolicy = 2 .Ve
Examples:
.Vb 1 nameConstraints=permitted;IP:192.168.0.0/255.255.0.0 \& nameConstraints=permitted;email:.somedomain.com \& nameConstraints=excluded;email:.com .Ve
Example:
.Vb 1 noCheck = ignored .Ve
The supported names are: status_request and status_request_v2.
Example:
.Vb 1 tlsfeature = status_request .Ve
Example:
.Vb 1 nsComment = "Some Random Comment" .Ve
Other supported extensions in this category are: nsBaseUrl, \fBnsRevocationUrl, nsCaRevocationUrl, nsRenewalUrl, nsCaPolicyUrl and nsSslServerName.
Acceptable values for nsCertType are: client, server, email, \fBobjsign, reserved, sslCA, emailCA, objCA.
There are two ways to encode arbitrary extensions.
The first way is to use the word \s-1ASN1\s0 followed by the extension content using the same syntax as ASN1_generate_nconf\|(3). For example:
.Vb 1 1.2.3.4=critical,ASN1:UTF8String:Some random data \& 1.2.3.4=ASN1:SEQUENCE:seq_sect \& [seq_sect] \& field1 = UTF8:field1 field2 = UTF8:field2 .Ve
It is also possible to use the word \s-1DER\s0 to include the raw encoded data in any extension.
.Vb 2 1.2.3.4=critical,DER:01:02:03:04 1.2.3.4=DER:01020304 .Ve
The value following \s-1DER\s0 is a hex dump of the \s-1DER\s0 encoding of the extension Any extension can be placed in this form to override the default behaviour. For example:
.Vb 1 basicConstraints=critical,DER:00:01:02:03 .Ve
The \s-1DER\s0 and \s-1ASN1\s0 options should be used with caution. It is possible to create totally invalid extensions if they are not used carefully.
.Vb 1 subjectAltName=URI:ldap://somehost.com/CN=foo,OU=bar .Ve
will produce an error but the equivalent form:
.Vb 1 subjectAltName=@subject_alt_section \& [subject_alt_section] subjectAltName=URI:ldap://somehost.com/CN=foo,OU=bar .Ve
is valid.
Due to the behaviour of the OpenSSL conf library the same field name can only occur once in a section. This means that:
.Vb 1 subjectAltName=@alt_section \& [alt_section] \& email=steve@here email=steve@there .Ve
will only recognize the last value. This can be worked around by using the form:
.Vb 1 [alt_section] \& email.1=steve@here email.2=steve@there .Ve
Licensed under the OpenSSL license (the \*(L"License\*(R"). You may not use this file except in compliance with the License. You can obtain a copy in the file \s-1LICENSE\s0 in the source distribution or at <https://www.openssl.org/source/license.html>.