Blame doc/man3/SSL_CTX_set_tmp_dh_callback.pod

Packit Service 084de1
=pod
Packit Service 084de1
Packit Service 084de1
=head1 NAME
Packit Service 084de1
Packit Service 084de1
SSL_CTX_set_tmp_dh_callback, SSL_CTX_set_tmp_dh, SSL_set_tmp_dh_callback, SSL_set_tmp_dh - handle DH keys for ephemeral key exchange
Packit Service 084de1
Packit Service 084de1
=head1 SYNOPSIS
Packit Service 084de1
Packit Service 084de1
 #include <openssl/ssl.h>
Packit Service 084de1
Packit Service 084de1
 void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,
Packit Service 084de1
                                  DH *(*tmp_dh_callback)(SSL *ssl, int is_export,
Packit Service 084de1
                                                         int keylength));
Packit Service 084de1
 long SSL_CTX_set_tmp_dh(SSL_CTX *ctx, DH *dh);
Packit Service 084de1
Packit Service 084de1
 void SSL_set_tmp_dh_callback(SSL *ctx,
Packit Service 084de1
                              DH *(*tmp_dh_callback)(SSL *ssl, int is_export,
Packit Service 084de1
                                                     int keylength));
Packit Service 084de1
 long SSL_set_tmp_dh(SSL *ssl, DH *dh)
Packit Service 084de1
Packit Service 084de1
=head1 DESCRIPTION
Packit Service 084de1
Packit Service 084de1
SSL_CTX_set_tmp_dh_callback() sets the callback function for B<ctx> to be
Packit Service 084de1
used when a DH parameters are required to B<tmp_dh_callback>.
Packit Service 084de1
The callback is inherited by all B<ssl> objects created from B<ctx>.
Packit Service 084de1
Packit Service 084de1
SSL_CTX_set_tmp_dh() sets DH parameters to be used to be B<dh>.
Packit Service 084de1
The key is inherited by all B<ssl> objects created from B<ctx>.
Packit Service 084de1
Packit Service 084de1
SSL_set_tmp_dh_callback() sets the callback only for B<ssl>.
Packit Service 084de1
Packit Service 084de1
SSL_set_tmp_dh() sets the parameters only for B<ssl>.
Packit Service 084de1
Packit Service 084de1
These functions apply to SSL/TLS servers only.
Packit Service 084de1
Packit Service 084de1
=head1 NOTES
Packit Service 084de1
Packit Service 084de1
When using a cipher with RSA authentication, an ephemeral DH key exchange
Packit Service 084de1
can take place. Ciphers with DSA keys always use ephemeral DH keys as well.
Packit Service 084de1
In these cases, the session data are negotiated using the
Packit Service 084de1
ephemeral/temporary DH key and the key supplied and certified
Packit Service 084de1
by the certificate chain is only used for signing.
Packit Service 084de1
Anonymous ciphers (without a permanent server key) also use ephemeral DH keys.
Packit Service 084de1
Packit Service 084de1
Using ephemeral DH key exchange yields forward secrecy, as the connection
Packit Service 084de1
can only be decrypted, when the DH key is known. By generating a temporary
Packit Service 084de1
DH key inside the server application that is lost when the application
Packit Service 084de1
is left, it becomes impossible for an attacker to decrypt past sessions,
Packit Service 084de1
even if he gets hold of the normal (certified) key, as this key was
Packit Service 084de1
only used for signing.
Packit Service 084de1
Packit Service 084de1
In order to perform a DH key exchange the server must use a DH group
Packit Service 084de1
(DH parameters) and generate a DH key. The server will always generate
Packit Service 084de1
a new DH key during the negotiation.
Packit Service 084de1
Packit Service 084de1
As generating DH parameters is extremely time consuming, an application
Packit Service 084de1
should not generate the parameters on the fly but supply the parameters.
Packit Service 084de1
DH parameters can be reused, as the actual key is newly generated during
Packit Service 084de1
the negotiation. The risk in reusing DH parameters is that an attacker
Packit Service 084de1
may specialize on a very often used DH group. Applications should therefore
Packit Service 084de1
generate their own DH parameters during the installation process using the
Packit Service 084de1
openssl L<dhparam(1)> application. This application
Packit Service 084de1
guarantees that "strong" primes are used.
Packit Service 084de1
Packit Service 084de1
Files dh2048.pem, and dh4096.pem in the 'apps' directory of the current
Packit Service 084de1
version of the OpenSSL distribution contain the 'SKIP' DH parameters,
Packit Service 084de1
which use safe primes and were generated verifiably pseudo-randomly.
Packit Service 084de1
These files can be converted into C code using the B<-C> option of the
Packit Service 084de1
L<dhparam(1)> application. Generation of custom DH
Packit Service 084de1
parameters during installation should still be preferred to stop an
Packit Service 084de1
attacker from specializing on a commonly used group. File dh1024.pem
Packit Service 084de1
contains old parameters that must not be used by applications.
Packit Service 084de1
Packit Service 084de1
An application may either directly specify the DH parameters or
Packit Service 084de1
can supply the DH parameters via a callback function.
Packit Service 084de1
Packit Service 084de1
Previous versions of the callback used B<is_export> and B<keylength>
Packit Service 084de1
parameters to control parameter generation for export and non-export
Packit Service 084de1
cipher suites. Modern servers that do not support export cipher suites
Packit Service 084de1
are advised to either use SSL_CTX_set_tmp_dh() or alternatively, use
Packit Service 084de1
the callback but ignore B<keylength> and B<is_export> and simply
Packit Service 084de1
supply at least 2048-bit parameters in the callback.
Packit Service 084de1
Packit Service 084de1
=head1 RETURN VALUES
Packit Service 084de1
Packit Service 084de1
SSL_CTX_set_tmp_dh_callback() and SSL_set_tmp_dh_callback() do not return
Packit Service 084de1
diagnostic output.
Packit Service 084de1
Packit Service 084de1
SSL_CTX_set_tmp_dh() and SSL_set_tmp_dh() do return 1 on success and 0
Packit Service 084de1
on failure. Check the error queue to find out the reason of failure.
Packit Service 084de1
Packit Service 084de1
=head1 EXAMPLES
Packit Service 084de1
Packit Service 084de1
Setup DH parameters with a key length of 2048 bits. (Error handling
Packit Service 084de1
partly left out.)
Packit Service 084de1
Packit Service 084de1
Command-line parameter generation:
Packit Service 084de1
Packit Service 084de1
 $ openssl dhparam -out dh_param_2048.pem 2048
Packit Service 084de1
Packit Service 084de1
Code for setting up parameters during server initialization:
Packit Service 084de1
Packit Service 084de1
 SSL_CTX ctx = SSL_CTX_new();
Packit Service 084de1
Packit Service 084de1
 DH *dh_2048 = NULL;
Packit Service 084de1
 FILE *paramfile = fopen("dh_param_2048.pem", "r");
Packit Service 084de1
Packit Service 084de1
 if (paramfile) {
Packit Service 084de1
     dh_2048 = PEM_read_DHparams(paramfile, NULL, NULL, NULL);
Packit Service 084de1
     fclose(paramfile);
Packit Service 084de1
 } else {
Packit Service 084de1
     /* Error. */
Packit Service 084de1
 }
Packit Service 084de1
 if (dh_2048 == NULL)
Packit Service 084de1
     /* Error. */
Packit Service 084de1
 if (SSL_CTX_set_tmp_dh(ctx, dh_2048) != 1)
Packit Service 084de1
     /* Error. */
Packit Service 084de1
 ...
Packit Service 084de1
Packit Service 084de1
=head1 SEE ALSO
Packit Service 084de1
Packit Service 084de1
L<ssl(7)>, L<SSL_CTX_set_cipher_list(3)>,
Packit Service 084de1
L<SSL_CTX_set_options(3)>,
Packit Service 084de1
L<ciphers(1)>, L<dhparam(1)>
Packit Service 084de1
Packit Service 084de1
=head1 COPYRIGHT
Packit Service 084de1
Packit Service 084de1
Copyright 2001-2019 The OpenSSL Project Authors. All Rights Reserved.
Packit Service 084de1
Packit Service 084de1
Licensed under the OpenSSL license (the "License").  You may not use
Packit Service 084de1
this file except in compliance with the License.  You can obtain a copy
Packit Service 084de1
in the file LICENSE in the source distribution or at
Packit Service 084de1
L<https://www.openssl.org/source/license.html>.
Packit Service 084de1
Packit Service 084de1
=cut