mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-06 09:10:28 +00:00
![Pierre Pronchery](/assets/img/avatar_default.png)
Migrate to OpenSSL 3.0 in advance of FreeBSD 14.0. OpenSSL 1.1.1 (the version we were previously using) will be EOL as of 2023-09-11. Most of the base system has already been updated for a seamless switch to OpenSSL 3.0. For many components we've added `-DOPENSSL_API_COMPAT=0x10100000L` to CFLAGS to specify the API version, which avoids deprecation warnings from OpenSSL 3.0. Changes have also been made to avoid OpenSSL APIs that were already deprecated in OpenSSL 1.1.1. The process of updating to contemporary APIs can continue after this merge. Additional changes are still required for libarchive and Kerberos- related libraries or tools; workarounds will immediately follow this commit. Fixes are in progress in the upstream projects and will be incorporated when those are next updated. There are some performance regressions in benchmarks (certain tests in `openssl speed`) and in some OpenSSL consumers in ports (e.g. haproxy). Investigation will continue for these. Netflix's testing showed no functional regression and a rather small, albeit statistically significant, increase in CPU consumption with OpenSSL 3.0. Thanks to ngie@ and des@ for updating base system components, to antoine@ and bofh@ for ports exp-runs and port fixes/workarounds, and to Netflix and everyone who tested prior to commit or contributed to this update in other ways. PR: 271615 PR: 271656 [exp-run] Relnotes: Yes Sponsored by: The FreeBSD Foundation
586 lines
18 KiB
Plaintext
586 lines
18 KiB
Plaintext
=pod
|
|
|
|
=head1 NAME
|
|
|
|
config - OpenSSL CONF library configuration files
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
This page documents the syntax of OpenSSL configuration files,
|
|
as parsed by L<NCONF_load(3)> and related functions.
|
|
This format is used by many of the OpenSSL commands, and to
|
|
initialize the libraries when used by any application.
|
|
|
|
The first part describes the general syntax of the configuration
|
|
files, and subsequent sections describe the semantics of individual
|
|
modules. Other modules are described in L<fips_config(5)> and
|
|
L<x509v3_config(5)>.
|
|
The syntax for defining ASN.1 values is described in
|
|
L<ASN1_generate_nconf(3)>.
|
|
|
|
=head1 SYNTAX
|
|
|
|
A configuration file is a series of lines. Blank lines, and whitespace
|
|
between the elements of a line, have no significance. A comment starts
|
|
with a B<#> character; the rest of the line is ignored. If the B<#>
|
|
is the first non-space character in a line, the entire line is ignored.
|
|
|
|
=head2 Directives
|
|
|
|
Two directives can be used to control the parsing of configuration files:
|
|
B<.include> and B<.pragma>.
|
|
|
|
For compatibility with older versions of OpenSSL, an equal sign after the
|
|
directive will be ignored. Older versions will treat it as an assignment,
|
|
so care should be taken if the difference in semantics is important.
|
|
|
|
A file can include other files using the include syntax:
|
|
|
|
.include [=] pathname
|
|
|
|
If B<pathname> is a simple filename, that file is included directly at
|
|
that point. Included files can have B<.include> statements that specify
|
|
other files. If B<pathname> is a directory, all files within that directory
|
|
that have a C<.cnf> or C<.conf> extension will be included. (This is only
|
|
available on systems with POSIX IO support.) Any sub-directories found
|
|
inside the B<pathname> are B<ignored>. Similarly, if a file is opened
|
|
while scanning a directory, and that file has an B<.include> directive
|
|
that specifies a directory, that is also ignored.
|
|
|
|
As a general rule, the B<pathname> should be an absolute path; this can
|
|
be enforced with the B<abspath> and B<includedir> pragmas, described below.
|
|
The environment variable B<OPENSSL_CONF_INCLUDE>, if it exists,
|
|
is prepended to all relative pathnames.
|
|
If the pathname is still relative, it is interpreted based on the
|
|
current working directory.
|
|
|
|
To require all file inclusions to name absolute paths, use the following
|
|
directive:
|
|
|
|
.pragma [=] abspath:value
|
|
|
|
The default behavior, where the B<value> is B<false> or B<off>, is to allow
|
|
relative paths. To require all B<.include> pathnames to be absolute paths,
|
|
use a B<value> of B<true> or B<on>.
|
|
|
|
In these files, the dollar sign, B<$>, is used to reference a variable, as
|
|
described below. On some platforms, however, it is common to treat B<$>
|
|
as a regular character in symbol names. Supporting this behavior can be
|
|
done with the following directive:
|
|
|
|
.pragma [=] dollarid:value
|
|
|
|
The default behavior, where the B<value> is B<false> or B<off>, is to treat
|
|
the dollarsign as indicating a variable name; C<foo$bar> is interpreted as
|
|
C<foo> followed by the expansion of the variable C<bar>. If B<value> is
|
|
B<true> or B<on>, then C<foo$bar> is a single seven-character name and
|
|
variable expansions must be specified using braces or parentheses.
|
|
|
|
.pragma [=] includedir:value
|
|
|
|
If a relative pathname is specified in the B<.include> directive, and
|
|
the B<OPENSSL_CONF_INCLUDE> environment variable doesn't exist, then
|
|
the value of the B<includedir> pragma, if it exists, is prepended to the
|
|
pathname.
|
|
|
|
=head2 Settings
|
|
|
|
A configuration file is divided into a number of I<sections>. A section
|
|
begins with the section name in square brackets, and ends when a new
|
|
section starts, or at the end of the file. The section name can consist
|
|
of alphanumeric characters and underscores.
|
|
Whitespace between the name and the brackets is removed.
|
|
|
|
The first section of a configuration file is special and is referred to
|
|
as the B<default> section. This section is usually unnamed and spans from
|
|
the start of file until the first named section. When a name is being
|
|
looked up, it is first looked up in the current or named section,
|
|
and then the default section if necessary.
|
|
|
|
The environment is mapped onto a section called B<ENV>.
|
|
|
|
Within a section are a series of name/value assignments, described in more
|
|
detail below. As a reminder, the square brackets shown in this example
|
|
are required, not optional:
|
|
|
|
[ section ]
|
|
name1 = This is value1
|
|
name2 = Another value
|
|
...
|
|
[ newsection ]
|
|
name1 = New value1
|
|
name3 = Value 3
|
|
|
|
The B<name> can contain any alphanumeric characters as well as a few
|
|
punctuation symbols such as B<.> B<,> B<;> and B<_>.
|
|
Whitespace after the name and before the equal sign is ignored.
|
|
|
|
If a name is repeated in the same section, then all but the last
|
|
value are ignored. In certain circumstances, such as with
|
|
Certificate DNs, the same field may occur multiple times.
|
|
In order to support this, commands like L<openssl-req(1)> ignore any
|
|
leading text that is preceded with a period. For example:
|
|
|
|
1.OU = First OU
|
|
2.OU = Second OU
|
|
|
|
The B<value> consists of the string following the B<=> character until end
|
|
of line with any leading and trailing whitespace removed.
|
|
|
|
The value string undergoes variable expansion. The text C<$var> or C<${var}>
|
|
inserts the value of the named variable from the current section.
|
|
To use a value from another section use C<$section::name>
|
|
or C<${section::name}>.
|
|
By using C<$ENV::name>, the value of the specified environment
|
|
variable will be substituted.
|
|
|
|
Variables must be defined before their value is referenced, otherwise
|
|
an error is flagged and the file will not load.
|
|
This can be worked around by specifying a default value in the B<default>
|
|
section before the variable is used.
|
|
|
|
Any name/value settings in an B<ENV> section are available
|
|
to the configuration file, but are not propagated to the environment.
|
|
|
|
It is an error if the value ends up longer than 64k.
|
|
|
|
It is possible to escape certain characters by using a single B<'> or
|
|
double B<"> quote around the value, or using a backslash B<\> before the
|
|
character,
|
|
By making the last character of a line a B<\>
|
|
a B<value> string can be spread across multiple lines. In addition
|
|
the sequences B<\n>, B<\r>, B<\b> and B<\t> are recognized.
|
|
|
|
The expansion and escape rules as described above that apply to B<value>
|
|
also apply to the pathname of the B<.include> directive.
|
|
|
|
=head1 OPENSSL LIBRARY CONFIGURATION
|
|
|
|
The sections below use the informal term I<module> to refer to a part
|
|
of the OpenSSL functionality. This is not the same as the formal term
|
|
I<FIPS module>, for example.
|
|
|
|
The OpenSSL configuration looks up the value of B<openssl_conf>
|
|
in the default section and takes that as the name of a section that specifies
|
|
how to configure any modules in the library. It is not an error to leave
|
|
any module in its default configuration. An application can specify a
|
|
different name by calling CONF_modules_load_file(), for example, directly.
|
|
|
|
OpenSSL also looks up the value of B<config_diagnostics>.
|
|
If this exists and has a nonzero numeric value, any error suppressing flags
|
|
passed to CONF_modules_load() will be ignored.
|
|
This is useful for diagnosing misconfigurations but its use in
|
|
production requires additional consideration. With this option enabled,
|
|
a configuration error will completely prevent access to a service.
|
|
Without this option and in the presence of a configuration error, access
|
|
will be allowed but the desired configuration will B<not> be used.
|
|
|
|
# These must be in the default section
|
|
config_diagnostics = 1
|
|
openssl_conf = openssl_init
|
|
|
|
[openssl_init]
|
|
oid_section = oids
|
|
providers = providers
|
|
alg_section = evp_properties
|
|
ssl_conf = ssl_configuration
|
|
engines = engines
|
|
random = random
|
|
|
|
[oids]
|
|
... new oids here ...
|
|
|
|
[providers]
|
|
... provider stuff here ...
|
|
|
|
[evp_properties]
|
|
... EVP properties here ...
|
|
|
|
[ssl_configuration]
|
|
... SSL/TLS configuration properties here ...
|
|
|
|
[engines]
|
|
... engine properties here ...
|
|
|
|
[random]
|
|
... random properties here ...
|
|
|
|
The semantics of each module are described below. The phrase "in the
|
|
initialization section" refers to the section identified by the
|
|
B<openssl_conf> or other name (given as B<openssl_init> in the
|
|
example above). The examples below assume the configuration above
|
|
is used to specify the individual sections.
|
|
|
|
=head2 ASN.1 Object Identifier Configuration
|
|
|
|
The name B<oid_section> in the initialization section names the section
|
|
containing name/value pairs of OID's.
|
|
The name is the short name; the value is an optional long name followed
|
|
by a comma, and the numeric value.
|
|
While some OpenSSL commands have their own section for specifying OID's,
|
|
this section makes them available to all commands and applications.
|
|
|
|
[oids]
|
|
shortName = a very long OID name, 1.2.3.4
|
|
newoid1 = 1.2.3.4.1
|
|
some_other_oid = 1.2.3.5
|
|
|
|
If a full configuration with the above fragment is in the file
|
|
F<example.cnf>, then the following command line:
|
|
|
|
OPENSSL_CONF=example.cnf openssl asn1parse -genstr OID:1.2.3.4.1
|
|
|
|
will output:
|
|
|
|
0:d=0 hl=2 l= 4 prim: OBJECT :newoid1
|
|
|
|
showing that the OID "newoid1" has been added as "1.2.3.4.1".
|
|
|
|
=head2 Provider Configuration
|
|
|
|
The name B<providers> in the initialization section names the section
|
|
containing cryptographic provider configuration. The name/value assignments
|
|
in this section each name a provider, and point to the configuration section
|
|
for that provider. The provider-specific section is used to specify how
|
|
to load the module, activate it, and set other parameters.
|
|
|
|
Within a provider section, the following names have meaning:
|
|
|
|
=over 4
|
|
|
|
=item B<identity>
|
|
|
|
This is used to specify an alternate name, overriding the default name
|
|
specified in the list of providers. For example:
|
|
|
|
[providers]
|
|
foo = foo_provider
|
|
|
|
[foo_provider]
|
|
identity = my_fips_module
|
|
|
|
=item B<module>
|
|
|
|
Specifies the pathname of the module (typically a shared library) to load.
|
|
|
|
=item B<activate>
|
|
|
|
If present, the module is activated. The value assigned to this name is not
|
|
significant.
|
|
|
|
=back
|
|
|
|
All parameters in the section as well as sub-sections are made
|
|
available to the provider.
|
|
|
|
=head3 Default provider and its activation
|
|
|
|
If no providers are activated explicitly, the default one is activated implicitly.
|
|
See L<OSSL_PROVIDER-default(7)> for more details.
|
|
|
|
If you add a section explicitly activating any other provider(s),
|
|
you most probably need to explicitly activate the default provider,
|
|
otherwise it becomes unavailable in openssl. It may make the system remotely unavailable.
|
|
|
|
=head2 EVP Configuration
|
|
|
|
The name B<alg_section> in the initialization section names the section
|
|
containing algorithmic properties when using the B<EVP> API.
|
|
|
|
Within the algorithm properties section, the following names have meaning:
|
|
|
|
=over 4
|
|
|
|
=item B<default_properties>
|
|
|
|
The value may be anything that is acceptable as a property query
|
|
string for EVP_set_default_properties().
|
|
|
|
=item B<fips_mode> (deprecated)
|
|
|
|
The value is a boolean that can be B<yes> or B<no>. If the value is
|
|
B<yes>, this is exactly equivalent to:
|
|
|
|
default_properties = fips=yes
|
|
|
|
If the value is B<no>, nothing happens. Using this name is deprecated, and
|
|
if used, it must be the only name in the section.
|
|
|
|
=back
|
|
|
|
=head2 SSL Configuration
|
|
|
|
The name B<ssl_conf> in the initialization section names the section
|
|
containing the list of SSL/TLS configurations.
|
|
As with the providers, each name in this section identifies a
|
|
section with the configuration for that name. For example:
|
|
|
|
[ssl_configuration]
|
|
server = server_tls_config
|
|
client = client_tls_config
|
|
system_default = tls_system_default
|
|
|
|
[server_tls_config]
|
|
... configuration for SSL/TLS servers ...
|
|
|
|
[client_tls_config]
|
|
... configuration for SSL/TLS clients ...
|
|
|
|
The configuration name B<system_default> has a special meaning. If it
|
|
exists, it is applied whenever an B<SSL_CTX> object is created. For example,
|
|
to impose system-wide minimum TLS and DTLS protocol versions:
|
|
|
|
[tls_system_default]
|
|
MinProtocol = TLSv1.2
|
|
MinProtocol = DTLSv1.2
|
|
|
|
The minimum TLS protocol is applied to B<SSL_CTX> objects that are TLS-based,
|
|
and the minimum DTLS protocol to those are DTLS-based.
|
|
The same applies also to maximum versions set with B<MaxProtocol>.
|
|
|
|
Each configuration section consists of name/value pairs that are parsed
|
|
by B<SSL_CONF_cmd(3)>, which will be called by SSL_CTX_config() or
|
|
SSL_config(), appropriately. Note that any characters before an initial
|
|
dot in the configuration section are ignored, so that the same command can
|
|
be used multiple times. This probably is most useful for loading different
|
|
key types, as shown here:
|
|
|
|
[server_tls_config]
|
|
RSA.Certificate = server-rsa.pem
|
|
ECDSA.Certificate = server-ecdsa.pem
|
|
|
|
=head2 Engine Configuration
|
|
|
|
The name B<engines> in the initialization section names the section
|
|
containing the list of ENGINE configurations.
|
|
As with the providers, each name in this section identifies an engine
|
|
with the configuration for that engine.
|
|
The engine-specific section is used to specify how to load the engine,
|
|
activate it, and set other parameters.
|
|
|
|
Within an engine section, the following names have meaning:
|
|
|
|
=over 4
|
|
|
|
=item B<engine_id>
|
|
|
|
This is used to specify an alternate name, overriding the default name
|
|
specified in the list of engines. If present, it must be first.
|
|
For example:
|
|
|
|
[engines]
|
|
foo = foo_engine
|
|
|
|
[foo_engine]
|
|
engine_id = myfoo
|
|
|
|
=item B<dynamic_path>
|
|
|
|
This loads and adds an ENGINE from the given path. It is equivalent to
|
|
sending the ctrls B<SO_PATH> with the path argument followed by B<LIST_ADD>
|
|
with value B<2> and B<LOAD> to the dynamic ENGINE. If this is not the
|
|
required behaviour then alternative ctrls can be sent directly to the
|
|
dynamic ENGINE using ctrl commands.
|
|
|
|
=item B<init>
|
|
|
|
This specifies whether to initialize the ENGINE. If the value is B<0> the
|
|
ENGINE will not be initialized, if the value is B<1> an attempt is made
|
|
to initialize
|
|
the ENGINE immediately. If the B<init> command is not present then an
|
|
attempt will be made to initialize the ENGINE after all commands in its
|
|
section have been processed.
|
|
|
|
=item B<default_algorithms>
|
|
|
|
This sets the default algorithms an ENGINE will supply using the function
|
|
ENGINE_set_default_string().
|
|
|
|
=back
|
|
|
|
All other names are taken to be the name of a ctrl command that is
|
|
sent to the ENGINE, and the value is the argument passed with the command.
|
|
The special value B<EMPTY> means no value is sent with the command.
|
|
For example:
|
|
|
|
[engines]
|
|
foo = foo_engine
|
|
|
|
[foo_engine]
|
|
dynamic_path = /some/path/fooengine.so
|
|
some_ctrl = some_value
|
|
default_algorithms = ALL
|
|
other_ctrl = EMPTY
|
|
|
|
=head2 Random Configuration
|
|
|
|
The name B<random> in the initialization section names the section
|
|
containing the random number generater settings.
|
|
|
|
Within the random section, the following names have meaning:
|
|
|
|
=over 4
|
|
|
|
=item B<random>
|
|
|
|
This is used to specify the random bit generator.
|
|
For example:
|
|
|
|
[random]
|
|
random = CTR-DRBG
|
|
|
|
The available random bit generators are:
|
|
|
|
=over 4
|
|
|
|
=item B<CTR-DRBG>
|
|
|
|
=item B<HASH-DRBG>
|
|
|
|
=item B<HMAC-DRBG>
|
|
|
|
=back
|
|
|
|
=item B<cipher>
|
|
|
|
This specifies what cipher a B<CTR-DRBG> random bit generator will use.
|
|
Other random bit generators ignore this name.
|
|
The default value is B<AES-256-CTR>.
|
|
|
|
=item B<digest>
|
|
|
|
This specifies what digest the B<HASH-DRBG> or B<HMAC-DRBG> random bit
|
|
generators will use. Other random bit generators ignore this name.
|
|
|
|
=item B<properties>
|
|
|
|
This sets the property query used when fetching the random bit generator and
|
|
any underlying algorithms.
|
|
|
|
=item B<seed>
|
|
|
|
This sets the randomness source that should be used. By default B<SEED-SRC>
|
|
will be used outside of the FIPS provider. The FIPS provider uses call backs
|
|
to access the same randomness sources from outside the validated boundary.
|
|
|
|
=item B<seed_properties>
|
|
|
|
This sets the property query used when fetching the randomness source.
|
|
|
|
=back
|
|
|
|
=head1 EXAMPLES
|
|
|
|
This example shows how to use quoting and escaping.
|
|
|
|
# This is the default section.
|
|
HOME = /temp
|
|
configdir = $ENV::HOME/config
|
|
|
|
[ section_one ]
|
|
# Quotes permit leading and trailing whitespace
|
|
any = " any variable name "
|
|
other = A string that can \
|
|
cover several lines \
|
|
by including \\ characters
|
|
message = Hello World\n
|
|
|
|
[ section_two ]
|
|
greeting = $section_one::message
|
|
|
|
This example shows how to expand environment variables safely.
|
|
In this example, the variable B<tempfile> is intended to refer
|
|
to a temporary file, and the environment variable B<TEMP> or
|
|
B<TMP>, if present, specify the directory where the file
|
|
should be put.
|
|
Since the default section is checked if a variable does not
|
|
exist, it is possible to set B<TMP> to default to F</tmp>, and
|
|
B<TEMP> to default to B<TMP>.
|
|
|
|
# These two lines must be in the default section.
|
|
TMP = /tmp
|
|
TEMP = $ENV::TMP
|
|
|
|
# This can be used anywhere
|
|
tmpfile = ${ENV::TEMP}/tmp.filename
|
|
|
|
This example shows how to enforce FIPS mode for the application
|
|
F<sample>.
|
|
|
|
sample = fips_config
|
|
|
|
[fips_config]
|
|
alg_section = evp_properties
|
|
|
|
[evp_properties]
|
|
default_properties = "fips=yes"
|
|
|
|
=head1 ENVIRONMENT
|
|
|
|
=over 4
|
|
|
|
=item B<OPENSSL_CONF>
|
|
|
|
The path to the config file, or the empty string for none.
|
|
Ignored in set-user-ID and set-group-ID programs.
|
|
|
|
=item B<OPENSSL_ENGINES>
|
|
|
|
The path to the engines directory.
|
|
Ignored in set-user-ID and set-group-ID programs.
|
|
|
|
=item B<OPENSSL_MODULES>
|
|
|
|
The path to the directory with OpenSSL modules, such as providers.
|
|
Ignored in set-user-ID and set-group-ID programs.
|
|
|
|
=item B<OPENSSL_CONF_INCLUDE>
|
|
|
|
The optional path to prepend to all B<.include> paths.
|
|
|
|
=back
|
|
|
|
=head1 BUGS
|
|
|
|
There is no way to include characters using the octal B<\nnn> form. Strings
|
|
are all null terminated so nulls cannot form part of the value.
|
|
|
|
The escaping isn't quite right: if you want to use sequences like B<\n>
|
|
you can't use any quote escaping on the same line.
|
|
|
|
The limit that only one directory can be opened and read at a time
|
|
can be considered a bug and should be fixed.
|
|
|
|
=head1 HISTORY
|
|
|
|
An undocumented API, NCONF_WIN32(), used a slightly different set
|
|
of parsing rules there were intended to be tailored to
|
|
the Microsoft Windows platform.
|
|
Specifically, the backslash character was not an escape character and
|
|
could be used in pathnames, only the double-quote character was recognized,
|
|
and comments began with a semi-colon.
|
|
This function was deprecated in OpenSSL 3.0; applications with
|
|
configuration files using that syntax will have to be modified.
|
|
|
|
=head1 SEE ALSO
|
|
|
|
L<openssl-x509(1)>, L<openssl-req(1)>, L<openssl-ca(1)>,
|
|
L<openssl-fipsinstall(1)>,
|
|
L<ASN1_generate_nconf(3)>,
|
|
L<EVP_set_default_properties(3)>,
|
|
L<CONF_modules_load(3)>,
|
|
L<CONF_modules_load_file(3)>,
|
|
L<fips_config(5)>, and
|
|
L<x509v3_config(5)>.
|
|
|
|
=head1 COPYRIGHT
|
|
|
|
Copyright 2000-2023 The OpenSSL Project Authors. All Rights Reserved.
|
|
|
|
Licensed under the Apache License 2.0 (the "License"). You may not use
|
|
this file except in compliance with the License. You can obtain a copy
|
|
in the file LICENSE in the source distribution or at
|
|
L<https://www.openssl.org/source/license.html>.
|
|
|
|
=cut
|