To whomever may have an answer,

     I am writing a SSL/TLS proxy server for my work that is multi-threaded.
 I recently replaced my OpenSSL version with 1.0.0a from 0.9.8g.   In this
application I need to verify the server certificate otherwise all the
security will be bypassed.  However, when I use SSL_get_verify_result() I
almost always get an error code "20 unable to get local issuer certificate."
 This is almost always at depth 0, and sometimes depth 1.
    I am loading the certificate stores from /etc/ssl/certs which contains
the stores that mozilla, chrome, and the like all verify from, but no matter
what I do I can't get a single certificate to verify.
    When I revert to OpenSSL 0.9.8g I can successfully verify several
certificates, but I still get the same error code for about half of the
websites I try, and are known to be valid (e.g. www.gmail.com:443).

    This is not just a difference in my program either, in both s_client and
verify from the command line, 0.9.8g will return a X509_V_OK code, and
1.0.0a will return error 20.  I am completely at a loss as to why this is.
 I am not so much concerned with getting the command line to work as I am
with my program.  I can't post my code because of a non disclosure
agreement, but I will post the steps that I am taking that are relevant to
 verify.

Before I create any ssl objects I am setting up the context:

    if((SSL_CTX_load_verify_locations(_ssl_ctx, NULL, "/etc/ssl/certs/" ))!=
1)
        cout << "couldn't load verify locations" << endl;
    if((SSL_CTX_set_default_verify_paths(_ssl_ctx))!=1)
        cout << "couldn't load defaults" << endl;
 //This is set to none because if set to PEER no connections can be made
because of the invalid cert
    SSL_CTX_set_verify(_ssl_client_ctx, SSL_VERIFY_NONE, verify_callback);
    SSL_CTX_set_verify_depth(_ssl_ctx, 9);

Verify_callback is defined as this:

static int verify_callback(int ok, X509_STORE_CTX* store){
    if(!ok){
        X509 * cert = X509_STORE_CTX_get_current_cert(store);
        int depth = X509_STORE_CTX_get_error_depth(store);
        int err = X509_STORE_CTX_get_error(store);
        cout << "Error at depth: " << depth<< endl;
        cout << "Error Text: " << X509_verify_cert_error_string(err) <<
endl;
    }
    return ok;
}

After this, I read the verification code when I obtain the cert:

    X509 *server_cert = SSL_get_peer_certificate(server_ssl);
    if(!server_cert){
        //couldn't get certificate, exit here
        exit(1);
    }

    long certValid = SSL_get_verify_result(server_ssl);
    if(certValid == X509_V_OK)
        cout << endl << "Certificate is valid" << endl;

If you need any more information please let me know and I will post what I
can.  Thank you in advanced for the help.

    Thanks,

          Sam

-- 
Sam Jantz
Software Engineer

Reply via email to