无法使用OpenSSL验证服务器证书

Failing to validate server certificate with OpenSSL

本文关键字:验证 服务器 证书 OpenSSL      更新时间:2023-10-16

我已经使用OpenSSL编写了一个SOAP客户端(在Ubuntu 12.04上用C++编写),但它目前可以在不检查服务器安全证书的情况下工作。这是我用来设置连接和检查证书的功能

bool bInitialiseSSL(SSL_CTX* &ctx, SSL* &ssl, BIO* &bio)
{
    ctx = SSL_CTX_new(SSLv23_client_method());  
    bio = BIO_new_ssl_connect(ctx);
    if (bio == NULL) {
        ERR_print_errors_fp(stderr);    
        SSL_CTX_free(ctx);
        return false;
    }
    BIO_get_ssl(bio, &ssl);
    SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
    char target[]  = "api.betfair.com:https";
    BIO_set_conn_hostname(bio, target);
    BIO_set_nbio(bio,1);
    while (1) {
        if (BIO_do_connect(bio) <= 0) {
            if (!BIO_should_retry(bio)) {
                cout << "Connect failed." << endl;
                BIO_free_all(bio);
                SSL_CTX_free(ctx);
                return false;
            }
        } else {
            break;
        }
    }
    if (BIO_do_handshake(bio) <= 0) {
        BIO_free_all(bio);
        SSL_CTX_free(ctx);
        return false;
    }
    X509 *cert;
    bool bValid  = false;
    cert = SSL_get_peer_certificate(ssl); 
    if ( cert != NULL ) {
        long res = SSL_get_verify_result(ssl);
        if (res == X509_V_OK) {
            bValid = true;
        } else {
            cout << "Error in security validation: " << res << endl;
        }
        X509_free(cert);   
    }
    return bValid;
}

这很好,但SSL_get_verify_result的返回值是20,对应于

X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:无法获取本地颁发者证书

我已经阅读了一些关于OpenSSL功能的文档,但它对用户不是特别友好。我看了很多网络教程,看不出我做错了什么。在我尝试实现证书检查之前,我的软件运行得很好,但我看不到我需要做什么。我需要在机器上配置设置吗?服务器很安全,我很难相信他们没有有效的SSL证书。如果有人能告诉我我做错了什么,我将不胜感激。

这取决于服务器的证书。

  • 如果是公共有效证书,则可以将CA证书文件包含在SSL_CTX中

代码:

ctx = SSL_CTX_new(SSLv23_client_method()); 
// You can load CA certs into SSL_CTX
SSL_CTX_load_verify_locations(ctx, cafile, NULL); // cafile: CA PEM certs file

您可以从cURL网站CA certs从mozilla.org 下载公共CA证书文件

  • 如果它是私有证书,并且您有证书文件,则可以使用SSL_CTX_use_certificate_file而不是SSL_CTX_load_verify_locations