=pod

=head1 NAME

SSL_CTX_config, SSL_config - configure SSL_CTX or SSL structure

=head1 SYNOPSIS

 #include <openssl/ssl.h>

 int SSL_CTX_config(SSL_CTX *ctx, const char *name);
 int SSL_config(SSL *s, const char *name);

=head1 DESCRIPTION

The functions SSL_CTX_config() and SSL_config() configure an B<SSL_CTX> or
B<SSL> structure using the configuration B<name>.

By calling SSL_CTX_config() or SSL_config() an application can perform many
complex tasks based on the contents of the configuration file: greatly
simplifying application configuration code. A degree of future proofing
can also be achieved: an application can support configuration features
in newer versions of OpenSSL automatically.

A configuration file must have been previously loaded, for example using
CONF_modules_load_file(). See L<config(5)> for details of the configuration
file syntax.

=head1 RETURN VALUES

SSL_CTX_config() and SSL_config() return 1 for success or 0 if an error
occurred.

=head1 EXAMPLES

If the file "config.cnf" contains the following:

 testapp = test_sect

 [test_sect]
 # list of configuration modules

 ssl_conf = ssl_sect

 [ssl_sect]
 server = server_section

 [server_section]
 RSA.Certificate = server-rsa.pem
 ECDSA.Certificate = server-ecdsa.pem
 Ciphers = ALL:!RC4

An application could call:

 if (CONF_modules_load_file("config.cnf", "testapp", 0) <= 0) {
     fprintf(stderr, "Error processing config file\n");
     goto err;
 }

 ctx = SSL_CTX_new(TLS_server_method());

 if (SSL_CTX_config(ctx, "server") == 0) {
     fprintf(stderr, "Error configuring server.\n");
     goto err;
 }

In this example two certificates and the cipher list are configured without
the need for any additional application code.

=head1 SEE ALSO

L<ssl(7)>,
L<config(5)>,
L<SSL_CONF_cmd(3)>,
L<CONF_modules_load_file(3)>

=head1 HISTORY

The SSL_CTX_config() and SSL_config() functions were added in OpenSSL 1.1.0.

=head1 COPYRIGHT

Copyright 2015-2020 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
