2015-01-16 35 views
2

我已經使用OpenSSL建立了我的客戶端 - 服務器通信,並且我的服務器正在發送它的證書。現在,我想讓我的客戶端也向服務器發送證書。在我的客戶端,我有以下代碼:在認證期間讓客戶端向服務器發送證書

ctx = InitCTX(); 
LoadCertificates(ctx, "clientCert.pem", "clientCert.pem"); /* load certs */ 
server = OpenConnection(hostname, atoi(portnum)); 
ssl = SSL_new(ctx);  /* create new SSL connection state */ 
SSL_set_fd(ssl, server); /* attach the socket descriptor */ 

,這是我LoadCertificates功能:

void LoadCertificates(SSL_CTX* ctx, char* CertFile, char* KeyFile) 
{ 
    if (SSL_CTX_use_certificate_file(ctx, CertFile, SSL_FILETYPE_PEM) <= 0) 
    { 
     ERR_print_errors_fp(stderr); 
     abort(); 
    } 
    /* set the private key from KeyFile (may be the same as CertFile) */ 
    if (SSL_CTX_use_PrivateKey_file(ctx, KeyFile, SSL_FILETYPE_PEM) <= 0) 
    { 
     ERR_print_errors_fp(stderr); 
     abort(); 
    } 
    /* verify private key */ 
    if (!SSL_CTX_check_private_key(ctx)) 
    { 
     fprintf(stderr, "Private key does not match the public certificate\n"); 
     abort(); 
    } 
    printf("Certificate attached.\n"); 
} 

我已經在服務器端相同LoadCertificates功能,這似乎是完美的工作。

但是,我的客戶端證書未在服務器端檢測到。我需要在客戶端做什麼不同的事情來發送證書? http://simplestcodings.blogspot.in/2010/08/secure-server-client-using-openssl-in-c.html

回答

0

我想該證書被髮送,但沒有被服務器接受,那就是它不能對受信任的CA進行驗證:

我使用的代碼從這裏作爲基地做出修改客戶端代碼在服務器上。服務器端有關no certificate returned的錯誤消息可能會引起誤解,請參閱https://stackoverflow.com/a/27951490/3081018

我建議使用wireshark或openssl s_server來檢查證書是否未發送,或者是否只是未被對方接受。

1

...我的客戶端證書未在服務器端檢測到。我需要在客戶端做什麼不同的事情來發送證書?

服務器需要撥打SSL_CTX_set_client_CA_list。它會通知服務器發送一個可接受的用於客戶端身份驗證的專有名稱(DN)列表。

服務器需要撥打SSL_CTX_load_verify_locations(或朋友)。這是服務器實際信任發送給客戶端的列表中的CA的地方。

最後,服務器應該調用SSL_CTX_set_verify並設置SSL_VERIFY_PEERSSL_VERIFY_FAIL_IF_NO_PEER_CERT

相關問題