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證書。如果有人能告訴我我做錯了什麼,我會非常感激。
感謝您的回答 - 我如何發現它是私人或公共證書? – mathematician1975
如果它是外部服務器,則應嘗試第一種替代方法。 –
如果您使用的是客戶端證書,'SSL_CTX_use_PrivateKey_file'用於將您的私鑰作爲客戶端。這與擁有「私人」證書毫無關係(在這種情況下,這沒有任何意義)。如果您的單獨CA不在默認的Mozilla列表中(或您選擇使用的列表),請將其添加到主CA列表中。 – Bruno