2010-11-23 117 views
3

我有一個可以與服務器建立SSL連接的工作應用程序。服務器使用自簽名證書,客戶端加載證書頒發機構鏈,告訴它服務器可以信任。我這樣做,在客戶端上這樣的代碼:OpenSSL驗證C++中的對等(客戶端)證書

SSL_METHOD* method = TLSv1_client_method(); 
_ctx = SSL_CTX_new(method); 
if (SSL_CTX_load_verify_locations(_ctx, "ca-all.crt", NULL) != 1) 
{ 
    return false; 
} 
_ssl = SSL_new(_ctx); 
int val = SSL_set_fd(_ssl, _socket->GetFD()); 
if (val != SSL_SUCCESS) 
{ 
    int err = SSL_get_error(_ssl, val); 
    return false; 
} 
val = SSL_connect(_ssl); 

和服務器上:

if (SSL_CTX_use_certificate_chain_file(g_ctx, "ca-chain1.crt") <= 0) { 
    return 1; 
    } 
    ppem_file = getenv("PEM_FILE"); 
    if (ppem_file == NULL) { 
    ppem_file = pem_file; 
    } 
    if (SSL_CTX_use_certificate_file(g_ctx, ppem_file, 
            SSL_FILETYPE_PEM) <= 0) { 
    return 1; 
    } 
    if (SSL_CTX_use_PrivateKey_file(g_ctx, ppem_file, 
            SSL_FILETYPE_PEM) <= 0) { 
    return 2; 
    } 

我試圖修改此代碼,以便服務器也驗證客戶端的對等證書(自 - 簽名,使用與服務器相同的發行者)並且有點麻煩。我沒有在任何地方找到好的「概念概述」文檔,這似乎是OpenSSL庫的典型障礙。

在我加入這個SSL_CTX_load_verify_locations後,客戶端()調用:

if (SSL_CTX_use_certificate_file(_ctx, "generic_client.pem", SSL_FILETYPE_PEM) != 1) 
{ 
    return false; 
} 

在我加入這個SSL_CTX_use_PrivateKey_file()調用後的服務器:

STACK_OF(X509_NAME) *list; 
    list = SSL_load_client_CA_file("ca_chain2.crt"); 
    if(list == NULL) { 
    return 4; 
    } 
    SSL_CTX_set_client_CA_list(g_ctx, list); 
    SSL_CTX_set_verify(g_ctx, SSL_VERIFY_PEER, NULL); 

連接失敗,因爲證書不驗證。客戶似乎加載證書的罰款,如果我註釋掉SSL_CTX_set_verify行,客戶端連接沒有問題(因爲它的證書從未驗證)。

看來服務器不認爲客戶端的證書權限鏈是好的。我在這裏錯過了什麼?

從命令行,我可以運行: OpenSSL的核實-CAfile CA-chain2.crt generic_client.pem 並把它傳遞,所以我有權利證書數據可用,我必須只使用它錯了不知何故。

回答

6

在服務器上,您還必須致電SSL_CTX_load_verify_locations()。該功能告訴服務器使用什麼證書進行證書驗證; SSL_CTX_set_client_CA_list()函數設置握手中發送給客戶端的允許CA的列表。兩者都是必需的。

(您還需要在客戶端撥打SSL_CTX_use_PrivateKey_file(),撥打電話use_certificate_file後,但我想你是這麼做的,只是將它遺漏了)。

+0

謝謝,那正是我所需要的。 – 2010-12-02 22:41:57

0

SSL_CTX_set_client_CA_list設置CA列表。根據定義,CA證書不同於用戶證書(例如,它具有CA位設置)。因此,我建議您創建一個適當的CA(其CA證書是自簽名的),並使用它來簽署客戶端和服務器證書。我假設OpenSSL不希望客戶端也將實際使用CA證書進行通信。