Blame doc/man3/X509_STORE_CTX_set_verify_cb.pod

Packit Service 084de1
=pod
Packit Service 084de1
Packit Service 084de1
=head1 NAME
Packit Service 084de1
Packit Service 084de1
X509_STORE_CTX_get_cleanup,
Packit Service 084de1
X509_STORE_CTX_get_lookup_crls,
Packit Service 084de1
X509_STORE_CTX_get_lookup_certs,
Packit Service 084de1
X509_STORE_CTX_get_check_policy,
Packit Service 084de1
X509_STORE_CTX_get_cert_crl,
Packit Service 084de1
X509_STORE_CTX_get_check_crl,
Packit Service 084de1
X509_STORE_CTX_get_get_crl,
Packit Service 084de1
X509_STORE_CTX_get_check_revocation,
Packit Service 084de1
X509_STORE_CTX_get_check_issued,
Packit Service 084de1
X509_STORE_CTX_get_get_issuer,
Packit Service 084de1
X509_STORE_CTX_get_verify_cb,
Packit Service 084de1
X509_STORE_CTX_set_verify_cb,
Packit Service 084de1
X509_STORE_CTX_verify_cb
Packit Service 084de1
- get and set verification callback
Packit Service 084de1
Packit Service 084de1
=head1 SYNOPSIS
Packit Service 084de1
Packit Service 084de1
 #include <openssl/x509_vfy.h>
Packit Service 084de1
Packit Service 084de1
 typedef int (*X509_STORE_CTX_verify_cb)(int, X509_STORE_CTX *);
Packit Service 084de1
Packit Service 084de1
 X509_STORE_CTX_verify_cb X509_STORE_CTX_get_verify_cb(X509_STORE_CTX *ctx);
Packit Service 084de1
Packit Service 084de1
 void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx,
Packit Service 084de1
                                   X509_STORE_CTX_verify_cb verify_cb);
Packit Service 084de1
Packit Service 084de1
 X509_STORE_CTX_get_issuer_fn X509_STORE_CTX_get_get_issuer(X509_STORE_CTX *ctx);
Packit Service 084de1
 X509_STORE_CTX_check_issued_fn X509_STORE_CTX_get_check_issued(X509_STORE_CTX *ctx);
Packit Service 084de1
 X509_STORE_CTX_check_revocation_fn X509_STORE_CTX_get_check_revocation(X509_STORE_CTX *ctx);
Packit Service 084de1
 X509_STORE_CTX_get_crl_fn X509_STORE_CTX_get_get_crl(X509_STORE_CTX *ctx);
Packit Service 084de1
 X509_STORE_CTX_check_crl_fn X509_STORE_CTX_get_check_crl(X509_STORE_CTX *ctx);
Packit Service 084de1
 X509_STORE_CTX_cert_crl_fn X509_STORE_CTX_get_cert_crl(X509_STORE_CTX *ctx);
Packit Service 084de1
 X509_STORE_CTX_check_policy_fn X509_STORE_CTX_get_check_policy(X509_STORE_CTX *ctx);
Packit Service 084de1
 X509_STORE_CTX_lookup_certs_fn X509_STORE_CTX_get_lookup_certs(X509_STORE_CTX *ctx);
Packit Service 084de1
 X509_STORE_CTX_lookup_crls_fn X509_STORE_CTX_get_lookup_crls(X509_STORE_CTX *ctx);
Packit Service 084de1
 X509_STORE_CTX_cleanup_fn X509_STORE_CTX_get_cleanup(X509_STORE_CTX *ctx);
Packit Service 084de1
Packit Service 084de1
=head1 DESCRIPTION
Packit Service 084de1
Packit Service 084de1
X509_STORE_CTX_set_verify_cb() sets the verification callback of B<ctx> to
Packit Service 084de1
B<verify_cb> overwriting any existing callback.
Packit Service 084de1
Packit Service 084de1
The verification callback can be used to customise the operation of certificate
Packit Service 084de1
verification, either by overriding error conditions or logging errors for
Packit Service 084de1
debugging purposes.
Packit Service 084de1
Packit Service 084de1
However a verification callback is B<not> essential and the default operation
Packit Service 084de1
is often sufficient.
Packit Service 084de1
Packit Service 084de1
The B<ok> parameter to the callback indicates the value the callback should
Packit Service 084de1
return to retain the default behaviour. If it is zero then an error condition
Packit Service 084de1
is indicated. If it is 1 then no error occurred. If the flag
Packit Service 084de1
B<X509_V_FLAG_NOTIFY_POLICY> is set then B<ok> is set to 2 to indicate the
Packit Service 084de1
policy checking is complete.
Packit Service 084de1
Packit Service 084de1
The B<ctx> parameter to the callback is the B<X509_STORE_CTX> structure that
Packit Service 084de1
is performing the verification operation. A callback can examine this
Packit Service 084de1
structure and receive additional information about the error, for example
Packit Service 084de1
by calling X509_STORE_CTX_get_current_cert(). Additional application data can
Packit Service 084de1
be passed to the callback via the B<ex_data> mechanism.
Packit Service 084de1
Packit Service 084de1
X509_STORE_CTX_get_verify_cb() returns the value of the current callback
Packit Service 084de1
for the specific B<ctx>.
Packit Service 084de1
Packit Service 084de1
X509_STORE_CTX_get_get_issuer(),
Packit Service 084de1
X509_STORE_CTX_get_check_issued(), X509_STORE_CTX_get_check_revocation(),
Packit Service 084de1
X509_STORE_CTX_get_get_crl(), X509_STORE_CTX_get_check_crl(),
Packit Service 084de1
X509_STORE_CTX_get_cert_crl(), X509_STORE_CTX_get_check_policy(),
Packit Service 084de1
X509_STORE_CTX_get_lookup_certs(), X509_STORE_CTX_get_lookup_crls()
Packit Service 084de1
and X509_STORE_CTX_get_cleanup() return the function pointers cached
Packit Service 084de1
from the corresponding B<X509_STORE>, please see
Packit Service 084de1
L<X509_STORE_set_verify(3)> for more information.
Packit Service 084de1
Packit Service 084de1
Packit Service 084de1
=head1 WARNINGS
Packit Service 084de1
Packit Service 084de1
In general a verification callback should B<NOT> unconditionally return 1 in
Packit Service 084de1
all circumstances because this will allow verification to succeed no matter
Packit Service 084de1
what the error. This effectively removes all security from the application
Packit Service 084de1
because B<any> certificate (including untrusted generated ones) will be
Packit Service 084de1
accepted.
Packit Service 084de1
Packit Service 084de1
=head1 NOTES
Packit Service 084de1
Packit Service 084de1
The verification callback can be set and inherited from the parent structure
Packit Service 084de1
performing the operation. In some cases (such as S/MIME verification) the
Packit Service 084de1
B<X509_STORE_CTX> structure is created and destroyed internally and the
Packit Service 084de1
only way to set a custom verification callback is by inheriting it from the
Packit Service 084de1
associated B<X509_STORE>.
Packit Service 084de1
Packit Service 084de1
=head1 RETURN VALUES
Packit Service 084de1
Packit Service 084de1
X509_STORE_CTX_set_verify_cb() does not return a value.
Packit Service 084de1
Packit Service 084de1
=head1 EXAMPLES
Packit Service 084de1
Packit Service 084de1
Default callback operation:
Packit Service 084de1
Packit Service 084de1
 int verify_callback(int ok, X509_STORE_CTX *ctx) {
Packit Service 084de1
     return ok;
Packit Service 084de1
 }
Packit Service 084de1
Packit Service 084de1
Simple example, suppose a certificate in the chain is expired and we wish
Packit Service 084de1
to continue after this error:
Packit Service 084de1
Packit Service 084de1
 int verify_callback(int ok, X509_STORE_CTX *ctx) {
Packit Service 084de1
     /* Tolerate certificate expiration */
Packit Service 084de1
     if (X509_STORE_CTX_get_error(ctx) == X509_V_ERR_CERT_HAS_EXPIRED)
Packit Service 084de1
         return 1;
Packit Service 084de1
     /* Otherwise don't override */
Packit Service 084de1
     return ok;
Packit Service 084de1
 }
Packit Service 084de1
Packit Service 084de1
More complex example, we don't wish to continue after B<any> certificate has
Packit Service 084de1
expired just one specific case:
Packit Service 084de1
Packit Service 084de1
 int verify_callback(int ok, X509_STORE_CTX *ctx)
Packit Service 084de1
 {
Packit Service 084de1
     int err = X509_STORE_CTX_get_error(ctx);
Packit Service 084de1
     X509 *err_cert = X509_STORE_CTX_get_current_cert(ctx);
Packit Service 084de1
Packit Service 084de1
     if (err == X509_V_ERR_CERT_HAS_EXPIRED) {
Packit Service 084de1
         if (check_is_acceptable_expired_cert(err_cert)
Packit Service 084de1
             return 1;
Packit Service 084de1
     }
Packit Service 084de1
     return ok;
Packit Service 084de1
 }
Packit Service 084de1
Packit Service 084de1
Full featured logging callback. In this case the B<bio_err> is assumed to be
Packit Service 084de1
a global logging B<BIO>, an alternative would to store a BIO in B<ctx> using
Packit Service 084de1
B<ex_data>.
Packit Service 084de1
Packit Service 084de1
 int verify_callback(int ok, X509_STORE_CTX *ctx)
Packit Service 084de1
 {
Packit Service 084de1
     X509 *err_cert;
Packit Service 084de1
     int err, depth;
Packit Service 084de1
Packit Service 084de1
     err_cert = X509_STORE_CTX_get_current_cert(ctx);
Packit Service 084de1
     err = X509_STORE_CTX_get_error(ctx);
Packit Service 084de1
     depth = X509_STORE_CTX_get_error_depth(ctx);
Packit Service 084de1
Packit Service 084de1
     BIO_printf(bio_err, "depth=%d ", depth);
Packit Service 084de1
     if (err_cert) {
Packit Service 084de1
         X509_NAME_print_ex(bio_err, X509_get_subject_name(err_cert),
Packit Service 084de1
                            0, XN_FLAG_ONELINE);
Packit Service 084de1
         BIO_puts(bio_err, "\n");
Packit Service 084de1
     }
Packit Service 084de1
     else
Packit Service 084de1
         BIO_puts(bio_err, "<no cert>\n");
Packit Service 084de1
     if (!ok)
Packit Service 084de1
         BIO_printf(bio_err, "verify error:num=%d:%s\n", err,
Packit Service 084de1
                    X509_verify_cert_error_string(err));
Packit Service 084de1
     switch (err) {
Packit Service 084de1
     case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
Packit Service 084de1
         BIO_puts(bio_err, "issuer= ");
Packit Service 084de1
         X509_NAME_print_ex(bio_err, X509_get_issuer_name(err_cert),
Packit Service 084de1
                            0, XN_FLAG_ONELINE);
Packit Service 084de1
         BIO_puts(bio_err, "\n");
Packit Service 084de1
         break;
Packit Service 084de1
     case X509_V_ERR_CERT_NOT_YET_VALID:
Packit Service 084de1
     case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
Packit Service 084de1
         BIO_printf(bio_err, "notBefore=");
Packit Service 084de1
         ASN1_TIME_print(bio_err, X509_get_notBefore(err_cert));
Packit Service 084de1
         BIO_printf(bio_err, "\n");
Packit Service 084de1
         break;
Packit Service 084de1
     case X509_V_ERR_CERT_HAS_EXPIRED:
Packit Service 084de1
     case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
Packit Service 084de1
         BIO_printf(bio_err, "notAfter=");
Packit Service 084de1
         ASN1_TIME_print(bio_err, X509_get_notAfter(err_cert));
Packit Service 084de1
         BIO_printf(bio_err, "\n");
Packit Service 084de1
         break;
Packit Service 084de1
     case X509_V_ERR_NO_EXPLICIT_POLICY:
Packit Service 084de1
         policies_print(bio_err, ctx);
Packit Service 084de1
         break;
Packit Service 084de1
     }
Packit Service 084de1
     if (err == X509_V_OK && ok == 2)
Packit Service 084de1
         /* print out policies */
Packit Service 084de1
Packit Service 084de1
     BIO_printf(bio_err, "verify return:%d\n", ok);
Packit Service 084de1
     return(ok);
Packit Service 084de1
 }
Packit Service 084de1
Packit Service 084de1
=head1 SEE ALSO
Packit Service 084de1
Packit Service 084de1
L<X509_STORE_CTX_get_error(3)>
Packit Service 084de1
L<X509_STORE_set_verify_cb_func(3)>
Packit Service 084de1
L<X509_STORE_CTX_get_ex_new_index(3)>
Packit Service 084de1
Packit Service 084de1
=head1 HISTORY
Packit Service 084de1
Packit Service 084de1
The
Packit Service 084de1
X509_STORE_CTX_get_get_issuer(),
Packit Service 084de1
X509_STORE_CTX_get_check_issued(), X509_STORE_CTX_get_check_revocation(),
Packit Service 084de1
X509_STORE_CTX_get_get_crl(), X509_STORE_CTX_get_check_crl(),
Packit Service 084de1
X509_STORE_CTX_get_cert_crl(), X509_STORE_CTX_get_check_policy(),
Packit Service 084de1
X509_STORE_CTX_get_lookup_certs(), X509_STORE_CTX_get_lookup_crls()
Packit Service 084de1
and X509_STORE_CTX_get_cleanup() functions were added in OpenSSL 1.1.0.
Packit Service 084de1
Packit Service 084de1
=head1 COPYRIGHT
Packit Service 084de1
Packit Service 084de1
Copyright 2009-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