2012-09-02 95 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

相關問題