| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  | =pod | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 NAME | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SSL_CTX_set_verify, SSL_set_verify, SSL_CTX_set_verify_depth, SSL_set_verify_depth - set peer certificate verification parameters | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 SYNOPSIS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  #include <openssl/ssl.h> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, | 
					
						
							|  |  |  |                          int (*verify_callback)(int, X509_STORE_CTX *)); | 
					
						
							|  |  |  |  void SSL_set_verify(SSL *s, int mode, | 
					
						
							|  |  |  |                      int (*verify_callback)(int, X509_STORE_CTX *)); | 
					
						
							| 
									
										
										
										
											2016-07-19 21:27:53 +08:00
										 |  |  |  void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |  void SSL_set_verify_depth(SSL *s, int depth); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  int verify_callback(int preverify_ok, X509_STORE_CTX *x509_ctx); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 DESCRIPTION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SSL_CTX_set_verify() sets the verification flags for B<ctx> to be B<mode> and | 
					
						
							|  |  |  | specifies the B<verify_callback> function to be used. If no callback function | 
					
						
							|  |  |  | shall be specified, the NULL pointer can be used for B<verify_callback>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SSL_set_verify() sets the verification flags for B<ssl> to be B<mode> and | 
					
						
							|  |  |  | specifies the B<verify_callback> function to be used. If no callback function | 
					
						
							|  |  |  | shall be specified, the NULL pointer can be used for B<verify_callback>. In | 
					
						
							|  |  |  | this case last B<verify_callback> set specifically for this B<ssl> remains. If | 
					
						
							|  |  |  | no special B<callback> was set before, the default callback for the underlying | 
					
						
							| 
									
										
										
										
											2009-02-15 05:49:38 +08:00
										 |  |  | B<ctx> is used, that was valid at the time B<ssl> was created with | 
					
						
							| 
									
										
										
										
											2015-08-18 03:21:33 +08:00
										 |  |  | L<SSL_new(3)>. | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | SSL_CTX_set_verify_depth() sets the maximum B<depth> for the certificate chain | 
					
						
							|  |  |  | verification that shall be allowed for B<ctx>. (See the BUGS section.) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SSL_set_verify_depth() sets the maximum B<depth> for the certificate chain | 
					
						
							|  |  |  | verification that shall be allowed for B<ssl>. (See the BUGS section.) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 NOTES | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The verification of certificates can be controlled by a set of logically | 
					
						
							|  |  |  | or'ed B<mode> flags: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =over 4 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item SSL_VERIFY_NONE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | B<Server mode:> the server will not send a client certificate request to the | 
					
						
							|  |  |  | client, so the client will not send a certificate. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | B<Client mode:> if not using an anonymous cipher (by default disabled), the | 
					
						
							|  |  |  | server will send a certificate which will be checked. The result of the | 
					
						
							|  |  |  | certificate verification process can be checked after the TLS/SSL handshake | 
					
						
							| 
									
										
										
										
											2015-08-18 03:21:33 +08:00
										 |  |  | using the L<SSL_get_verify_result(3)> function. | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  | The handshake will be continued regardless of the verification result. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item SSL_VERIFY_PEER | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | B<Server mode:> the server sends a client certificate request to the client. | 
					
						
							|  |  |  | The certificate returned (if any) is checked. If the verification process | 
					
						
							| 
									
										
										
										
											2001-08-23 23:00:11 +08:00
										 |  |  | fails, the TLS/SSL handshake is | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  | immediately terminated with an alert message containing the reason for | 
					
						
							|  |  |  | the verification failure. | 
					
						
							|  |  |  | The behaviour can be controlled by the additional | 
					
						
							|  |  |  | SSL_VERIFY_FAIL_IF_NO_PEER_CERT and SSL_VERIFY_CLIENT_ONCE flags. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | B<Client mode:> the server certificate is verified. If the verification process | 
					
						
							| 
									
										
										
										
											2001-08-23 23:00:11 +08:00
										 |  |  | fails, the TLS/SSL handshake is | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  | immediately terminated with an alert message containing the reason for | 
					
						
							|  |  |  | the verification failure. If no server certificate is sent, because an | 
					
						
							|  |  |  | anonymous cipher is used, SSL_VERIFY_PEER is ignored. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item SSL_VERIFY_FAIL_IF_NO_PEER_CERT | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | B<Server mode:> if the client did not return a certificate, the TLS/SSL | 
					
						
							|  |  |  | handshake is immediately terminated with a "handshake failure" alert. | 
					
						
							|  |  |  | This flag must be used together with SSL_VERIFY_PEER. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | B<Client mode:> ignored | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =item SSL_VERIFY_CLIENT_ONCE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | B<Server mode:> only request a client certificate on the initial TLS/SSL | 
					
						
							|  |  |  | handshake. Do not ask for a client certificate again in case of a | 
					
						
							|  |  |  | renegotiation. This flag must be used together with SSL_VERIFY_PEER. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | B<Client mode:> ignored | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =back | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-03 04:47:48 +08:00
										 |  |  | If the B<mode> is SSL_VERIFY_NONE none of the other flags may be set. | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-23 23:00:11 +08:00
										 |  |  | The actual verification procedure is performed either using the built-in | 
					
						
							|  |  |  | verification procedure or using another application provided verification | 
					
						
							|  |  |  | function set with | 
					
						
							| 
									
										
										
										
											2015-08-18 03:21:33 +08:00
										 |  |  | L<SSL_CTX_set_cert_verify_callback(3)>. | 
					
						
							| 
									
										
										
										
											2001-08-23 23:00:11 +08:00
										 |  |  | The following descriptions apply in the case of the built-in procedure. An | 
					
						
							|  |  |  | application provided procedure also has access to the verify depth information | 
					
						
							|  |  |  | and the verify_callback() function, but the way this information is used | 
					
						
							|  |  |  | may be different. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  | SSL_CTX_set_verify_depth() and SSL_set_verify_depth() set the limit up | 
					
						
							|  |  |  | to which depth certificates in a chain are used during the verification | 
					
						
							|  |  |  | procedure. If the certificate chain is longer than allowed, the certificates | 
					
						
							|  |  |  | above the limit are ignored. Error messages are generated as if these | 
					
						
							|  |  |  | certificates would not be present, most likely a | 
					
						
							|  |  |  | X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY will be issued. | 
					
						
							|  |  |  | The depth count is "level 0:peer certificate", "level 1: CA certificate", | 
					
						
							|  |  |  | "level 2: higher level CA certificate", and so on. Setting the maximum | 
					
						
							| 
									
										
										
										
											2014-07-03 10:42:40 +08:00
										 |  |  | depth to 2 allows the levels 0, 1, and 2. The default depth limit is 100, | 
					
						
							|  |  |  | allowing for the peer certificate and additional 100 CA certificates. | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | The B<verify_callback> function is used to control the behaviour when the | 
					
						
							|  |  |  | SSL_VERIFY_PEER flag is set. It must be supplied by the application and | 
					
						
							|  |  |  | receives two arguments: B<preverify_ok> indicates, whether the verification of | 
					
						
							|  |  |  | the certificate in question was passed (preverify_ok=1) or not | 
					
						
							|  |  |  | (preverify_ok=0). B<x509_ctx> is a pointer to the complete context used | 
					
						
							|  |  |  | for the certificate chain verification. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The certificate chain is checked starting with the deepest nesting level | 
					
						
							|  |  |  | (the root CA certificate) and worked upward to the peer's certificate. | 
					
						
							|  |  |  | At each level signatures and issuer attributes are checked. Whenever | 
					
						
							|  |  |  | a verification error is found, the error number is stored in B<x509_ctx> | 
					
						
							|  |  |  | and B<verify_callback> is called with B<preverify_ok>=0. By applying | 
					
						
							|  |  |  | X509_CTX_store_* functions B<verify_callback> can locate the certificate | 
					
						
							|  |  |  | in question and perform additional steps (see EXAMPLES). If no error is | 
					
						
							|  |  |  | found for a certificate, B<verify_callback> is called with B<preverify_ok>=1 | 
					
						
							|  |  |  | before advancing to the next level. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The return value of B<verify_callback> controls the strategy of the further | 
					
						
							|  |  |  | verification process. If B<verify_callback> returns 0, the verification | 
					
						
							|  |  |  | process is immediately stopped with "verification failed" state. If | 
					
						
							|  |  |  | SSL_VERIFY_PEER is set, a verification failure alert is sent to the peer and | 
					
						
							|  |  |  | the TLS/SSL handshake is terminated. If B<verify_callback> returns 1, | 
					
						
							|  |  |  | the verification process is continued. If B<verify_callback> always returns | 
					
						
							| 
									
										
										
										
											2003-06-26 22:03:03 +08:00
										 |  |  | 1, the TLS/SSL handshake will not be terminated with respect to verification | 
					
						
							|  |  |  | failures and the connection will be established. The calling process can | 
					
						
							|  |  |  | however retrieve the error code of the last verification error using | 
					
						
							| 
									
										
										
										
											2015-08-18 03:21:33 +08:00
										 |  |  | L<SSL_get_verify_result(3)> or by maintaining its | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  | own error storage managed by B<verify_callback>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If no B<verify_callback> is specified, the default callback will be used. | 
					
						
							|  |  |  | Its return value is identical to B<preverify_ok>, so that any verification | 
					
						
							|  |  |  | failure will lead to a termination of the TLS/SSL handshake with an | 
					
						
							|  |  |  | alert message, if SSL_VERIFY_PEER is set. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-27 17:46:25 +08:00
										 |  |  | =head1 BUGS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In client mode, it is not checked whether the SSL_VERIFY_PEER flag | 
					
						
							|  |  |  | is set, but whether any flags are set. This can lead to | 
					
						
							|  |  |  | unexpected behaviour if SSL_VERIFY_PEER and other flags are not used as | 
					
						
							|  |  |  | required. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  | =head1 RETURN VALUES | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The SSL*_set_verify*() functions do not provide diagnostic information. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 EXAMPLES | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The following code sequence realizes an example B<verify_callback> function | 
					
						
							|  |  |  | that will always continue the TLS/SSL handshake regardless of verification | 
					
						
							|  |  |  | failure, if wished. The callback realizes a verification depth limit with | 
					
						
							|  |  |  | more informational output. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-24 02:28:30 +08:00
										 |  |  | All verification errors are printed; information about the certificate chain | 
					
						
							|  |  |  | is printed on request. | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  | The example is realized for a server that does allow but not require client | 
					
						
							|  |  |  | certificates. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-21 00:22:43 +08:00
										 |  |  | The example makes use of the ex_data technique to store application data | 
					
						
							|  |  |  | into/retrieve application data from the SSL structure | 
					
						
							| 
									
										
										
										
											2015-08-18 03:21:33 +08:00
										 |  |  | (see L<SSL_get_ex_new_index(3)>, | 
					
						
							|  |  |  | L<SSL_get_ex_data_X509_STORE_CTX_idx(3)>). | 
					
						
							| 
									
										
										
										
											2001-01-21 00:22:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |  ... | 
					
						
							| 
									
										
										
										
											2001-01-21 00:22:43 +08:00
										 |  |  |  typedef struct { | 
					
						
							|  |  |  |    int verbose_mode; | 
					
						
							|  |  |  |    int verify_depth; | 
					
						
							|  |  |  |    int always_continue; | 
					
						
							|  |  |  |  } mydata_t; | 
					
						
							|  |  |  |  int mydata_index; | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |  ... | 
					
						
							|  |  |  |  static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) | 
					
						
							|  |  |  |  { | 
					
						
							|  |  |  |     char    buf[256]; | 
					
						
							|  |  |  |     X509   *err_cert; | 
					
						
							|  |  |  |     int     err, depth; | 
					
						
							| 
									
										
										
										
											2001-01-21 00:22:43 +08:00
										 |  |  |     SSL    *ssl; | 
					
						
							|  |  |  |     mydata_t *mydata; | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     err_cert = X509_STORE_CTX_get_current_cert(ctx); | 
					
						
							|  |  |  |     err = X509_STORE_CTX_get_error(ctx); | 
					
						
							|  |  |  |     depth = X509_STORE_CTX_get_error_depth(ctx); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-21 00:22:43 +08:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Retrieve the pointer to the SSL of the connection currently treated | 
					
						
							|  |  |  |      * and the application specific data stored into the SSL object. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()); | 
					
						
							|  |  |  |     mydata = SSL_get_ex_data(ssl, mydata_index); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |     X509_NAME_oneline(X509_get_subject_name(err_cert), buf, 256); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Catch a too long certificate chain. The depth limit set using | 
					
						
							|  |  |  |      * SSL_CTX_set_verify_depth() is by purpose set to "limit+1" so | 
					
						
							|  |  |  |      * that whenever the "depth>verify_depth" condition is met, we | 
					
						
							|  |  |  |      * have violated the limit and want to log this error condition. | 
					
						
							| 
									
										
										
										
											2000-10-19 06:51:34 +08:00
										 |  |  |      * We must do it here, because the CHAIN_TOO_LONG error would not | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |      * be found explicitly; only errors introduced by cutting off the | 
					
						
							|  |  |  |      * additional certificates would be logged. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2001-01-21 00:22:43 +08:00
										 |  |  |     if (depth > mydata->verify_depth) { | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |         preverify_ok = 0; | 
					
						
							|  |  |  |         err = X509_V_ERR_CERT_CHAIN_TOO_LONG; | 
					
						
							|  |  |  |         X509_STORE_CTX_set_error(ctx, err); | 
					
						
							| 
									
										
										
										
											2016-05-20 20:11:46 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |     if (!preverify_ok) { | 
					
						
							|  |  |  |         printf("verify error:num=%d:%s:depth=%d:%s\n", err, | 
					
						
							|  |  |  |                  X509_verify_cert_error_string(err), depth, buf); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-01-21 00:22:43 +08:00
										 |  |  |     else if (mydata->verbose_mode) | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         printf("depth=%d:%s\n", depth, buf); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * At this point, err contains the last verification error. We can use | 
					
						
							|  |  |  |      * it for something special | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2002-12-04 21:30:58 +08:00
										 |  |  |     if (!preverify_ok && (err == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT)) | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-10-17 15:30:14 +08:00
										 |  |  |       X509_NAME_oneline(X509_get_issuer_name(err_cert), buf, 256); | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |       printf("issuer= %s\n", buf); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-21 00:22:43 +08:00
										 |  |  |     if (mydata->always_continue) | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |       return 1; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       return preverify_ok; | 
					
						
							|  |  |  |  } | 
					
						
							| 
									
										
										
										
											2001-01-21 00:22:43 +08:00
										 |  |  |  ... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  mydata_t mydata; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  ... | 
					
						
							|  |  |  |  mydata_index = SSL_get_ex_new_index(0, "mydata index", NULL, NULL, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |  ... | 
					
						
							|  |  |  |  SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE, | 
					
						
							|  |  |  |                     verify_callback); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  /* | 
					
						
							|  |  |  |   * Let the verify_callback catch the verify_depth error so that we get | 
					
						
							|  |  |  |   * an appropriate error in the logfile. | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |  SSL_CTX_set_verify_depth(verify_depth + 1); | 
					
						
							| 
									
										
										
										
											2001-01-21 00:22:43 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |  /* | 
					
						
							|  |  |  |   * Set up the SSL specific data into "mydata" and store it into th SSL | 
					
						
							|  |  |  |   * structure. | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |  mydata.verify_depth = verify_depth; ... | 
					
						
							|  |  |  |  SSL_set_ex_data(ssl, mydata_index, &mydata); | 
					
						
							| 
									
										
										
										
											2016-05-04 04:40:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |  ... | 
					
						
							| 
									
										
										
										
											2016-05-20 20:11:46 +08:00
										 |  |  |  SSL_accept(ssl);       /* check of success left out for clarity */ | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  |  if (peer = SSL_get_peer_certificate(ssl)) | 
					
						
							|  |  |  |  { | 
					
						
							|  |  |  |    if (SSL_get_verify_result(ssl) == X509_V_OK) | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |      /* The client sent a certificate which verified OK */ | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | =head1 SEE ALSO | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 16:33:09 +08:00
										 |  |  | L<ssl(7)>, L<SSL_new(3)>, | 
					
						
							| 
									
										
										
										
											2015-08-18 03:21:33 +08:00
										 |  |  | L<SSL_CTX_get_verify_mode(3)>, | 
					
						
							|  |  |  | L<SSL_get_verify_result(3)>, | 
					
						
							|  |  |  | L<SSL_CTX_load_verify_locations(3)>, | 
					
						
							|  |  |  | L<SSL_get_peer_certificate(3)>, | 
					
						
							|  |  |  | L<SSL_CTX_set_cert_verify_callback(3)>, | 
					
						
							|  |  |  | L<SSL_get_ex_data_X509_STORE_CTX_idx(3)>, | 
					
						
							|  |  |  | L<SSL_get_ex_new_index(3)> | 
					
						
							| 
									
										
										
										
											2000-10-12 17:56:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-18 23:44:05 +08:00
										 |  |  | =head1 COPYRIGHT | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Licensed under the OpenSSL license (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 |