2011-12-06 32 views
1

我想在C++中編寫一個Gnutls客戶端。 不幸的是沒有太多的文檔或例子。 我設置這樣一個環節:如何創建一個將證書發送到服務器的Gnutls客戶端?

gnutls_certificate_allocate_credentials (&x509_cred); 
gnutls_certificate_set_x509_key_file (x509_cred, certfile.c_str(), keyfile.c_str(),GNUTLS_X509_FMT_PEM); 
gnutls_certificate_set_verify_function (x509_cred, _verify_certificate_callback); 
gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, x509_cred); 

但我的服務器沒有收到證書。 它可以工作,如果我使用gnutls-cli programm,所以我認爲它應該是在上面的代碼中的東西。

我該怎麼做?

的希望awnser,

斯巴達克斯

+0

看這裏:第8章http://www.gnu.org/software/gnutls/manual/gnutls.pdf你能找到一些例子。 – alk

+0

也許像這裏一樣的問題? http://comments.gmane.org/gmane.network.gnutls.general/145 – nob

回答

2

按照上面我提到的討論的提示[1]我可以得到的GnuTLS客戶端發送的證書:

服務器必須索要證書,否則客戶端不會發送任何東西。

gnutls_certificate_server_set_request (mSession, GNUTLS_CERT_REQUEST);

客戶端會自動發送只有在符合CA的服務器信任哪些證書

如果要覆蓋這一點,你必須在客戶端證書請求安裝一個回調。

gnutls_certificate_client_set_retrieve_function (credentials, cert_callback);

裏面的回調可以選擇證書/鍵發送:

static int cert_callback (gnutls_session_t session, 
     const gnutls_datum_t * req_ca_rdn, 
     int nreqs, 
     const gnutls_pk_algorithm_t * sign_algos, int sign_algos_length, 
     gnutls_retr_st * st) { 
     // Check CA's requested by server 
     // Check Algorithms accepted by server 

     // Putting in our key/cert, even if not trusted by the sever 
     st->cert.x509 = &myCert; 
     st->ncerts = 1; 
     st->key.x509 = myKey; 
     st->deinit_all = 0; 
     return 0; // no error 
} 

欲瞭解更多來自gnutls-cli的cli.c的cert_callback完整源代碼,

來源: [1] http://comments.gmane.org/gmane.network.gnutls.general/145

相關問題