diff -u --recursive --new-file curl-7.10.8.original/include/curl/curl.h curl-7.10.8.certicate_verify_callback/include/curl/curl.h
--- curl-7.10.8.original/include/curl/curl.h	2003-11-01 12:25:51.000000000 +0100
+++ curl-7.10.8.certicate_verify_callback/include/curl/curl.h	2003-12-04 22:34:03.000000000 +0100
@@ -223,6 +223,12 @@
   CURL_LAST /* never use! */
 } CURLcode;
 
+typedef int (*curl_ssl_cert_verify_callback)(int ok,
+                                            void *ctx,      /* actually an
+                                                               OpenSSL
+                                                               X509_STORE_CTX */
+                                            void *userptr);
+
 typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl,    /* easy handle */
                                           void *ssl_ctx, /* actually an
                                                             OpenSSL SSL_CTX */
@@ -694,6 +700,15 @@
      an HTTP or FTP server. */
   CINIT(MAXFILESIZE, LONG, 114),
 
+  /* Set the ssl server certificate verification callback function, currently
+     only for OpenSSL cert_ctx in second argument. The function must be
+     matching the curl_ssl_cert_verify_callback proto. */
+  CINIT(SSL_CERT_VERIFY_FUNCTION, FUNCTIONPOINT, 115),
+
+  /* Set the userdata for the ssl server certificate verification callback
+     function's third argument */
+  CINIT(SSL_CERT_VERIFY_DATA, OBJECTPOINT, 116),
+
   CURLOPT_LASTENTRY /* the last unused */
 } CURLoption;
 
diff -u --recursive --new-file curl-7.10.8.original/lib/ssluse.c curl-7.10.8.certicate_verify_callback/lib/ssluse.c
--- curl-7.10.8.original/lib/ssluse.c	2003-10-24 22:03:11.000000000 +0200
+++ curl-7.10.8.certicate_verify_callback/lib/ssluse.c	2003-12-04 22:20:48.000000000 +0100
@@ -378,11 +378,32 @@
 static
 int cert_verify_callback(int ok, X509_STORE_CTX *ctx)
 {
+  SSL *handle;
+  struct SessionHandle *data;
   X509 *err_cert;
   char buf[256];
 
-  err_cert=X509_STORE_CTX_get_current_cert(ctx);
-  X509_NAME_oneline(X509_get_subject_name(err_cert),buf,256);
+  /* Get the SSL handle from the certificate context */
+  handle = X509_STORE_CTX_get_ex_data(ctx,
+                                      SSL_get_ex_data_X509_STORE_CTX_idx());
+  if (!handle) {
+    /* This should'nt happen */
+    return 0;
+  }
+
+  /* Get the CURL SessionHandle from the SSL handle */
+  data = SSL_get_app_data(handle);
+  if (!data) {
+    /* This shouldn't happen */
+    return 0;
+  }
+
+  if (data->set.ssl.fcert) {
+    ok = data->set.ssl.fcert(ok, ctx, data->set.ssl.fcertp);
+  } else {
+    err_cert=X509_STORE_CTX_get_current_cert(ctx);
+    X509_NAME_oneline(X509_get_subject_name(err_cert),buf,256);
+  }
 
   return ok;
 }
@@ -1030,6 +1051,9 @@
   conn->ssl.handle = SSL_new (conn->ssl.ctx);
   SSL_set_connect_state (conn->ssl.handle);
 
+  /* Set the application data for the certificate validation function */
+  SSL_set_app_data (conn->ssl.handle, data);
+
   conn->ssl.server_cert = 0x0;
 
   if(!conn->bits.reuse) {
diff -u --recursive --new-file curl-7.10.8.original/lib/url.c curl-7.10.8.certicate_verify_callback/lib/url.c
--- curl-7.10.8.original/lib/url.c	2003-10-31 22:18:01.000000000 +0100
+++ curl-7.10.8.certicate_verify_callback/lib/url.c	2003-12-04 22:34:51.000000000 +0100
@@ -1106,6 +1106,19 @@
      */
     data->set.ssl.verifyhost = va_arg(param, long);
     break;
+  case CURLOPT_SSL_CERT_VERIFY_FUNCTION:
+    /*
+     * Set a SSL server certificate verificaction function callback
+     */
+    data->set.ssl.fcert = va_arg(param, curl_ssl_cert_verify_callback);
+    break;
+  case CURLOPT_SSL_CERT_VERIFY_DATA:
+    /*
+     * Set a SSL server certificate verification function callback parameter
+     * pointer
+     */
+    data->set.ssl.fcertp = va_arg(param, void *);
+    break;
   case CURLOPT_SSL_CTX_FUNCTION:
     /*
      * Set a SSL_CTX callback
diff -u --recursive --new-file curl-7.10.8.original/lib/urldata.h curl-7.10.8.certicate_verify_callback/lib/urldata.h
--- curl-7.10.8.original/lib/urldata.h	2003-10-18 22:14:33.000000000 +0200
+++ curl-7.10.8.certicate_verify_callback/lib/urldata.h	2003-12-04 22:22:28.000000000 +0100
@@ -148,6 +148,9 @@
   long verifyhost;       /* 0: no verify
                             1: check that CN exists
                             2: CN must match hostname */
+  curl_ssl_cert_verify_callback fcert;  /* function to verify SSL server
+                                           certificate */
+  void *fcertp;          /* parameter for call back */
   char *CApath;          /* DOES NOT WORK ON WINDOWS */
   char *CAfile;          /* cerficate to verify peer against */
   char *random_file;     /* path to file containing "random" data */

