2012-07-23 67 views
1

我在Linux上編寫了一個使用OpenSSL的SOAP客戶端。我基本上從OpenSSL網站和其他在線資源收集了一些信息,下面的代碼總結了我如何將XML發送到SOAP服務器。在沒有檢查證書的情況下使用OpenSSL,但我的數據是否仍然被加密?

SSL_library_init(); 
    SSL_load_error_strings(); 
    ERR_load_BIO_strings(); 
    OpenSSL_add_all_algorithms(); 

    SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method()); 
    SSL* ssl; 
    BIO* bio = BIO_new_ssl_connect(ctx); 
    if (bio == NULL) { 
    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; 
    } 
    } 
    KeepAliveReq KeepAliveReq(sessionTok,0,iMode); 
    string strMessage = KeepAliveReq.GetXML(false); 
    BIO_puts(bio,strMessage.c_str()); 

這種方法運行良好,並且可靠(如果稍慢)幾周。我故意省略了SSL握手過程的證書檢查階段,因爲當時我並不真正瞭解它的細節,而且我發送的服務器是一家知名公司。我的問題是我可以假設我的數據正在被SSL代碼加密嗎?就我所能從我的代碼中得出的結論而言,我並不明確要求進行加密,我假設這只是SSL通信過程的一部分。我的遺漏證書檢查是否會破壞我的應用程序在加密方面的安全性?

+0

您是如何忽略證書檢查階段的?通過更改密碼或通過設置驗證選項或通過驗證回調?你的代碼沒有顯示。 – Jay 2012-07-23 12:34:36

+0

@Jay我以前有一些我刪除的'SSL_get_verify_result(* ssl)'形式的代碼。我認爲這意味着我沒有驗證證書。我上面的內容正是我所做的 - 沒有別的。這是否意味着我在沒有意識到的情況下使用證書檢查? – mathematician1975 2012-07-23 12:42:42

回答

4

您的數據仍在加密 - 但問題是,誰?

證書檢查過程是我們驗證另一方是他們聲稱的對象的地方。當有人訂購SSL證書時,分發該證書的公司將採取措施確保他們向正在訂購的域名(或其他實體)的合法所有者提供證書和密鑰。然後該公司將用自己的詳細信息簽署證書,而這些信息又由您的計算機已信任的公司簽署。

當您建立連接時,您的計算機會檢查鏈接以確保證書是合法的,即它是由您的計算機信任的人(可能間接通過多層信任)簽署的。

跳過此過程意味着任何人都可以在自己的計算機上爲任何給定網站生成證書。假設他們可以劫持你製造的連接,他們可以讓你的系統輕鬆相信它是知名公司。

您需要檢查證書是否安全。

相關問題