2012-09-02 68 views
2

我已经使用OpenSSL(在Ubuntu 12.04上用C++编写)编写了一个SOAP客户端,但它目前工作时未检查服务器安全证书。这是我用来建立连接,并检查证书未能通过OpenSSL验证服务器证书

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的文档的功能,但它是不是特别人性化。我看了一些网络教程,我看不到我做错了什么。在我尝试实施证书检查之前,我的软件完美工作,但我看不到我需要做什么。我需要在我的机器上配置设置吗?服务器是betfair,据说非常安全,我很难相信他们没有有效的SSL证书。如果有人能告诉我我做错了什么,我会非常感激。

回答

1

这取决于服务器的证书。

  • 如果是公共有效证书,则可以将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 

您也可以下载公共CA证书由卷曲网站CA Certs from mozilla.org

  • 如果是私人证书,你有证书文件的文件,你可以使用SSL_CTX_use_certificate_file而不是SSL_CTX_load_verify_locations
+0

感谢您的回答 - 我如何发现它是私人或公共证书? – mathematician1975

+0

如果它是外部服务器,则应尝试第一种替代方法。 –

+1

如果您使用的是客户端证书,'SSL_CTX_use_PrivateKey_file'用于将您的私钥作为客户端。这与拥有“私人”证书毫无关系(在这种情况下,这没有任何意义)。如果您的单独CA不在默认的Mozilla列表中(或您选择使用的列表),请将其添加到主CA列表中。 – Bruno

相关问题