diff options
author | Tomas Mraz <tomas@openssl.org> | 2022-03-07 15:46:58 +0100 |
---|---|---|
committer | Tomas Mraz <tomas@openssl.org> | 2022-03-14 09:39:03 +0100 |
commit | dfb39f73132edf56daaad189e6791d1bdb57c4db (patch) | |
tree | 0b6e37d9fa5a263906d4ca4b6ceef0a14632ff18 /doc | |
parent | 7e1f3ffcc5bc15fb9a12b9e3bb202f544c6ed5aa (diff) |
Replace handling of negative verification result with SSL_set_retry_verify()
Provide a different mechanism to indicate that the application wants
to retry the verification. The negative result of the callback function
now indicates an error again.
Instead the SSL_set_retry_verify() can be called from the callback
to indicate that the handshake should be suspended.
Fixes #17568
Reviewed-by: David von Oheimb <david.von.oheimb@siemens.com>
Reviewed-by: Viktor Dukhovni <viktor@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/17825)
Diffstat (limited to 'doc')
-rw-r--r-- | doc/build.info | 6 | ||||
-rw-r--r-- | doc/man3/SSL_CTX_set_cert_verify_callback.pod | 23 | ||||
-rw-r--r-- | doc/man3/SSL_CTX_set_verify.pod | 15 | ||||
-rw-r--r-- | doc/man3/SSL_set_retry_verify.pod | 70 | ||||
-rw-r--r-- | doc/man3/SSL_want.pod | 4 | ||||
-rw-r--r-- | doc/man3/X509_verify_cert.pod | 4 |
6 files changed, 107 insertions, 15 deletions
diff --git a/doc/build.info b/doc/build.info index 97e6bd3b51..4e1db237d7 100644 --- a/doc/build.info +++ b/doc/build.info @@ -2547,6 +2547,10 @@ DEPEND[html/man3/SSL_set_fd.html]=man3/SSL_set_fd.pod GENERATE[html/man3/SSL_set_fd.html]=man3/SSL_set_fd.pod DEPEND[man/man3/SSL_set_fd.3]=man3/SSL_set_fd.pod GENERATE[man/man3/SSL_set_fd.3]=man3/SSL_set_fd.pod +DEPEND[html/man3/SSL_set_retry_verify.html]=man3/SSL_set_retry_verify.pod +GENERATE[html/man3/SSL_set_retry_verify.html]=man3/SSL_set_retry_verify.pod +DEPEND[man/man3/SSL_set_retry_verify.3]=man3/SSL_set_retry_verify.pod +GENERATE[man/man3/SSL_set_retry_verify.3]=man3/SSL_set_retry_verify.pod DEPEND[html/man3/SSL_set_session.html]=man3/SSL_set_session.pod GENERATE[html/man3/SSL_set_session.html]=man3/SSL_set_session.pod DEPEND[man/man3/SSL_set_session.3]=man3/SSL_set_session.pod @@ -3356,6 +3360,7 @@ html/man3/SSL_set_async_callback.html \ html/man3/SSL_set_bio.html \ html/man3/SSL_set_connect_state.html \ html/man3/SSL_set_fd.html \ +html/man3/SSL_set_retry_verify.html \ html/man3/SSL_set_session.html \ html/man3/SSL_set_shutdown.html \ html/man3/SSL_set_verify_result.html \ @@ -3948,6 +3953,7 @@ man/man3/SSL_set_async_callback.3 \ man/man3/SSL_set_bio.3 \ man/man3/SSL_set_connect_state.3 \ man/man3/SSL_set_fd.3 \ +man/man3/SSL_set_retry_verify.3 \ man/man3/SSL_set_session.3 \ man/man3/SSL_set_shutdown.3 \ man/man3/SSL_set_verify_result.3 \ diff --git a/doc/man3/SSL_CTX_set_cert_verify_callback.pod b/doc/man3/SSL_CTX_set_cert_verify_callback.pod index fdeeaee6d7..ecd312c350 100644 --- a/doc/man3/SSL_CTX_set_cert_verify_callback.pod +++ b/doc/man3/SSL_CTX_set_cert_verify_callback.pod @@ -36,16 +36,18 @@ In server mode, a return value of 0 leads to handshake failure. In client mode, the behaviour is as follows. All values, including 0, are ignored if the verification mode is B<SSL_VERIFY_NONE>. -Otherwise, when the return value is 0, the handshake will fail. - -In client mode I<callback> may also return -1, -typically on failure verifying the server certificate. -This makes the handshake suspend and return control to the calling application -with B<SSL_ERROR_WANT_RETRY_VERIFY>. -The app can for instance fetch further certificates or cert status information -needed for the verification. -Calling L<SSL_connect(3)> again resumes the connection attempt -by retrying the server certificate verification step. +Otherwise, when the return value is less than or equal to 0, the handshake will +fail. + +In client mode I<callback> may also call the L<SSL_set_retry_verify(3)> +function on the B<SSL> object set in the I<x509_store_ctx> ex data (see +L<SSL_get_ex_data_X509_STORE_CTX_idx(3)>) and return 1. This would be +typically done in case the certificate verification was not yet able +to succeed. This makes the handshake suspend and return control to the +calling application with B<SSL_ERROR_WANT_RETRY_VERIFY>. The app can for +instance fetch further certificates or cert status information needed for +the verification. Calling L<SSL_connect(3)> again resumes the connection +attempt by retrying the server certificate verification step. This process may even be repeated if need be. In any case a viable verification result value must be reflected @@ -89,6 +91,7 @@ SSL_CTX_set_cert_verify_callback() does not provide diagnostic information. L<ssl(7)>, L<SSL_CTX_set_verify(3)>, L<X509_STORE_CTX_set_error(3)>, L<SSL_get_verify_result(3)>, +L<SSL_set_retry_verify(3)>, L<SSL_CTX_load_verify_locations(3)> =head1 COPYRIGHT diff --git a/doc/man3/SSL_CTX_set_verify.pod b/doc/man3/SSL_CTX_set_verify.pod index e3271aff01..c085097617 100644 --- a/doc/man3/SSL_CTX_set_verify.pod +++ b/doc/man3/SSL_CTX_set_verify.pod @@ -44,6 +44,21 @@ L<SSL_new(3)>. Within the callback function, B<SSL_get_ex_data_X509_STORE_CTX_idx> can be called to get the data index of the current SSL object that is doing the verification. +In client mode B<verify_callback> may also call the L<SSL_set_retry_verify(3)> +function on the B<SSL> object set in the I<x509_store_ctx> ex data (see +L<SSL_get_ex_data_X509_STORE_CTX_idx(3)>) and return 1. +This would be typically done in case the certificate verification was not yet +able to succeed. +This makes the handshake suspend and return control to the calling application +with B<SSL_ERROR_WANT_RETRY_VERIFY>. +The application can for instance fetch further certificates or cert status +information needed for the verification. +Note that the handshake may still be aborted if a subsequent invocation of the +callback (e.g. at a lower depth, or for a separate error condition) returns 0. +Calling L<SSL_connect(3)> again resumes the connection attempt by retrying the +server certificate verification step. +This process may even be repeated if need be. + SSL_CTX_set_verify_depth() sets the maximum B<depth> for the certificate chain verification that shall be allowed for B<ctx>. diff --git a/doc/man3/SSL_set_retry_verify.pod b/doc/man3/SSL_set_retry_verify.pod new file mode 100644 index 0000000000..4eb7f449ed --- /dev/null +++ b/doc/man3/SSL_set_retry_verify.pod @@ -0,0 +1,70 @@ +=pod + +=head1 NAME + +SSL_set_retry_verify - indicate that certificate verification should be retried + +=head1 SYNOPSIS + + #include <openssl/ssl.h> + + int SSL_set_retry_verify(SSL *ssl); + +=head1 DESCRIPTION + +SSL_set_retry_verify() should be called from the certificate verification +callback on a client when the application wants to indicate that the handshake +should be suspended and the control should be returned to the application. +L<SSL_want_retry_verify(3)> will return 1 as a consequence until the handshake +is resumed again by the application, retrying the verification step. + +Please refer to L<SSL_CTX_set_cert_verify_callback(3)> for further details. + +=head1 NOTES + +The effect of calling SSL_set_retry_verify() outside of the certificate +verification callback on the client side is undefined. + +=head1 RETURN VALUES + +SSL_set_retry verify() returns 1 on success, 0 otherwise. + +=head1 EXAMPLES + +The following code snippet shows how to obtain the B<SSL> object associated +with the B<X509_STORE_CTX> to call the SSL_set_retry_verify() function: + + int idx = SSL_get_ex_data_X509_STORE_CTX_idx(); + SSL *ssl; + + /* this should not happen but check anyway */ + if (idx < 0 + || (ssl = X509_STORE_CTX_get_ex_data(ctx, idx)) == NULL) + return 0; + + if (/* we need to retry verification callback */) + return SSL_set_retry_verify(ssl); + + /* do normal processing of the verification callback */ + +=head1 SEE ALSO + +L<ssl(7)>, L<SSL_connect(3)>, L<SSL_CTX_set_cert_verify_callback(3)>, +L<SSL_want_retry_verify(3)> + +=head1 HISTORY + +SSL_set_retry_verify() was added in OpenSSL 3.0.2 to replace backwards +incompatible handling of a negative return value from the verification +callback. + +=head1 COPYRIGHT + +Copyright 2022 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 diff --git a/doc/man3/SSL_want.pod b/doc/man3/SSL_want.pod index 831094ae0a..22920135b9 100644 --- a/doc/man3/SSL_want.pod +++ b/doc/man3/SSL_want.pod @@ -70,8 +70,8 @@ A call to L<SSL_get_error(3)> should return B<SSL_ERROR_WANT_X509_LOOKUP>. =item SSL_RETRY_VERIFY -The operation did not complete because an application callback set by -SSL_CTX_set_cert_verify_callback() has asked to be called again. +The operation did not complete because a certificate verification callback +has asked to be called again via L<SSL_set_retry_verify(3)>. A call to L<SSL_get_error(3)> should return B<SSL_ERROR_WANT_RETRY_VERIFY>. =item SSL_ASYNC_PAUSED diff --git a/doc/man3/X509_verify_cert.pod b/doc/man3/X509_verify_cert.pod index a14a0b25c4..6172ea5b1f 100644 --- a/doc/man3/X509_verify_cert.pod +++ b/doc/man3/X509_verify_cert.pod @@ -52,9 +52,7 @@ A negative return value from X509_verify_cert() can occur if it is invoked incorrectly, such as with no certificate set in I<ctx>, or when it is called twice in succession without reinitialising I<ctx> for the second call. A negative return value can also happen due to internal resource problems -or because an internal inconsistency has been detected -or if a retry operation is requested during internal lookups -(which never happens with standard lookup methods). +or because an internal inconsistency has been detected. Applications must interpret any return value <= 0 as an error. The X509_STORE_CTX_verify() behaves like X509_verify_cert() except that its |