| 
									
										
										
										
											2009-10-17 20:46:52 +08:00
										 |  |  | =pod | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 NAME | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 04:33:09 +08:00
										 |  |  | X509_build_chain, | 
					
						
							| 
									
										
										
										
											2021-01-28 07:28:25 +08:00
										 |  |  | X509_verify_cert, | 
					
						
							| 
									
										
										
										
											2020-12-29 04:33:09 +08:00
										 |  |  | X509_STORE_CTX_verify - build and verify X509 certificate chain | 
					
						
							| 
									
										
										
										
											2009-10-17 20:46:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 SYNOPSIS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-28 07:28:25 +08:00
										 |  |  |  #include <openssl/x509_vfy.h> | 
					
						
							| 
									
										
										
										
											2009-10-17 20:46:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 04:33:09 +08:00
										 |  |  |  STACK_OF(X509) *X509_build_chain(X509 *target, STACK_OF(X509) *certs, | 
					
						
							|  |  |  |                                   X509_STORE *store, int with_self_signed, | 
					
						
							|  |  |  |                                   OSSL_LIB_CTX *libctx, const char *propq); | 
					
						
							| 
									
										
										
										
											2009-10-17 20:46:52 +08:00
										 |  |  |  int X509_verify_cert(X509_STORE_CTX *ctx); | 
					
						
							| 
									
										
										
										
											2021-01-28 07:28:25 +08:00
										 |  |  |  int X509_STORE_CTX_verify(X509_STORE_CTX *ctx); | 
					
						
							| 
									
										
										
										
											2009-10-17 20:46:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 DESCRIPTION | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 04:33:09 +08:00
										 |  |  | X509_build_chain() builds a certificate chain starting from I<target> | 
					
						
							|  |  |  | using the optional list of intermediate CA certificates I<certs>. | 
					
						
							|  |  |  | If I<store> is NULL it builds the chain as far down as possible, ignoring errors. | 
					
						
							|  |  |  | Else the chain must reach a trust anchor contained in I<store>. | 
					
						
							|  |  |  | It internally uses a B<X509_STORE_CTX> structure associated with the library | 
					
						
							|  |  |  | context I<libctx> and property query string I<propq>, both of which may be NULL. | 
					
						
							|  |  |  | In case there is more than one possibility for the chain, only one is taken. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | On success it returns a pointer to a new stack of (up_ref'ed) certificates | 
					
						
							|  |  |  | starting with I<target> and followed by all available intermediate certificates. | 
					
						
							|  |  |  | A self-signed trust anchor is included only if I<target> is the trust anchor | 
					
						
							|  |  |  | of I<with_self_signed> is 1. | 
					
						
							|  |  |  | If a non-NULL stack is returned the caller is responsible for freeing it. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-17 20:46:52 +08:00
										 |  |  | The X509_verify_cert() function attempts to discover and validate a | 
					
						
							| 
									
										
										
										
											2021-01-28 07:28:25 +08:00
										 |  |  | certificate chain based on parameters in I<ctx>. | 
					
						
							| 
									
										
										
										
											2020-11-04 19:21:10 +08:00
										 |  |  | The verification context, of type B<X509_STORE_CTX>, can be constructed | 
					
						
							|  |  |  | using L<X509_STORE_CTX_new(3)> and L<X509_STORE_CTX_init(3)>. | 
					
						
							| 
									
										
										
										
											2021-01-28 07:28:25 +08:00
										 |  |  | It usually includes a target certificate to be verified, | 
					
						
							|  |  |  | a set of certificates serving as trust anchors, | 
					
						
							|  |  |  | a list of non-trusted certificates that may be helpful for chain construction, | 
					
						
							| 
									
										
										
										
											2020-11-04 19:21:10 +08:00
										 |  |  | flags such as X509_V_FLAG_X509_STRICT, and various other optional components | 
					
						
							|  |  |  | such as a callback function that allows customizing the verification outcome. | 
					
						
							|  |  |  | A complete description of the certificate verification process is contained in | 
					
						
							| 
									
										
										
										
											2020-11-04 21:04:27 +08:00
										 |  |  | the L<openssl-verification-options(1)> manual page. | 
					
						
							| 
									
										
										
										
											2009-10-17 20:46:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Applications rarely call this function directly but it is used by | 
					
						
							|  |  |  | OpenSSL internally for certificate validation, in both the S/MIME and | 
					
						
							|  |  |  | SSL/TLS code. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-17 09:38:03 +08:00
										 |  |  | A negative return value from X509_verify_cert() can occur if it is invoked | 
					
						
							| 
									
										
										
										
											2021-01-28 07:28:25 +08:00
										 |  |  | 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. | 
					
						
							| 
									
										
										
										
											2021-02-07 05:41:40 +08:00
										 |  |  | A negative return value can also happen due to internal resource problems | 
					
						
							| 
									
										
										
										
											2022-03-07 22:46:58 +08:00
										 |  |  | or because an internal inconsistency has been detected. | 
					
						
							| 
									
										
										
										
											2021-02-07 05:41:40 +08:00
										 |  |  | Applications must interpret any return value <= 0 as an error. | 
					
						
							| 
									
										
										
										
											2009-10-17 20:46:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-28 07:28:25 +08:00
										 |  |  | The X509_STORE_CTX_verify() behaves like X509_verify_cert() except that its | 
					
						
							|  |  |  | target certificate is the first element of the list of untrusted certificates | 
					
						
							|  |  |  | in I<ctx> unless a target certificate is set explicitly. | 
					
						
							| 
									
										
										
										
											2019-10-13 05:45:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-28 03:23:33 +08:00
										 |  |  | When the verification target is a raw public key, rather than a certificate, | 
					
						
							|  |  |  | both functions validate the target raw public key. | 
					
						
							|  |  |  | In that case the number of possible checks is significantly reduced. | 
					
						
							|  |  |  | The raw public key can be authenticated only via DANE TLSA records, either | 
					
						
							|  |  |  | locally synthesised or obtained by the application from DNS. | 
					
						
							|  |  |  | Raw public key DANE TLSA records may be added via L<SSL_add_expected_rpk(3)> or | 
					
						
							|  |  |  | L<SSL_dane_tlsa_add(3)>. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-28 07:28:25 +08:00
										 |  |  | =head1 RETURN VALUES | 
					
						
							| 
									
										
										
										
											2019-10-13 05:45:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 04:33:09 +08:00
										 |  |  | X509_build_chain() returns NULL on error, else a stack of certificates. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Both X509_verify_cert() and X509_STORE_CTX_verify() | 
					
						
							|  |  |  | return 1 if a complete chain can be built and validated, | 
					
						
							| 
									
										
										
										
											2021-01-28 07:28:25 +08:00
										 |  |  | otherwise they return 0, and in exceptional circumstances (such as malloc | 
					
						
							|  |  |  | failure and internal errors) they can also return a negative code. | 
					
						
							| 
									
										
										
										
											2009-10-17 20:46:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-07 05:41:40 +08:00
										 |  |  | If a complete chain can be built and validated both functions return 1. | 
					
						
							|  |  |  | If the certificate must be rejected on the basis of the data available | 
					
						
							|  |  |  | or any required certificate status data is not available they return 0. | 
					
						
							|  |  |  | If no definite answer possible they usually return a negative code. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-28 07:28:25 +08:00
										 |  |  | On error or failure additional error information can be obtained by | 
					
						
							| 
									
										
										
										
											2021-02-08 15:17:23 +08:00
										 |  |  | examining I<ctx> using, for example, L<X509_STORE_CTX_get_error(3)>.  Even if | 
					
						
							|  |  |  | verification indicated success, the stored error code may be different from | 
					
						
							|  |  |  | X509_V_OK, likely because a verification callback function has waived the error. | 
					
						
							| 
									
										
										
										
											2009-10-17 20:46:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | =head1 SEE ALSO | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-28 03:23:33 +08:00
										 |  |  | L<SSL_add_expected_rpk(3)>, | 
					
						
							|  |  |  | L<SSL_CTX_dane_enable(3)>, | 
					
						
							|  |  |  | L<SSL_dane_tlsa_add(3)>, | 
					
						
							|  |  |  | L<X509_STORE_CTX_new(3)>, | 
					
						
							|  |  |  | L<X509_STORE_CTX_init(3)>, | 
					
						
							|  |  |  | L<X509_STORE_CTX_init_rpk(3)>, | 
					
						
							| 
									
										
										
										
											2015-08-18 03:21:33 +08:00
										 |  |  | L<X509_STORE_CTX_get_error(3)> | 
					
						
							| 
									
										
										
										
											2009-10-17 20:46:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-28 07:28:25 +08:00
										 |  |  | =head1 HISTORY | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 04:33:09 +08:00
										 |  |  | X509_build_chain() and X509_STORE_CTX_verify() were added in OpenSSL 3.0. | 
					
						
							| 
									
										
										
										
											2021-01-28 07:28:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-18 23:44:05 +08:00
										 |  |  | =head1 COPYRIGHT | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-28 03:23:33 +08:00
										 |  |  | Copyright 2009-2023 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2016-05-18 23:44:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-06 21:04:44 +08:00
										 |  |  | Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2016-05-18 23:44:05 +08:00
										 |  |  | 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 |