2013-01-18 78 views
2

我正在編寫一個客戶端/服務器應用程序,我們將使用SSL通信。我很難弄清楚爲什麼外部緩存不起作用。我不想使用內部緩存,因爲我想將會話存儲在數據庫中。儘管我已經爲SSL_CTX_sess_set_get_cb註冊了callabck,並且SSL_CTX_sess_set_new_cb, SSL_CTX_sess_set_get_cb不會在服務器端和每個連接上調用它創建的新SSL_SESSION。它幾乎看起來像客戶端不握手session_id發送,但我不知道,也沒有ideea如何測試這個。在客戶端,我使用SSL_set_session將會話附加到SSL連接,並在Ubuntu上使用openSSL 0.9.8。在C客戶端/服務器應用程序上重用SSL會話

//for server side 
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_SERVER | SSL_SESS_CACHE_NO_INTERNAL | SSL_SESS_CACHE_NO_AUTO_CLEAR); 

//for client side 
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL | SSL_SESS_CACHE_NO_AUTO_CLEAR); 

基本上客戶端和服務器的流程如下所示。爲了清晰起見,我已經刪除了錯誤處理。如果成功,應用程序將通過所有這些應用程序。

SSL_library_init(); 
SSL_load_error_strings(); 

ctx = SSL_CTX_new(SSLv23_method()); 

SSL_CTX_set_info_callback(ctx, &apps_ssl_info_callback); 
SSL_CTX_load_verify_locations(ctx,calist_file, calist_path); 
SSL_CTX_set_default_verify_paths(ctx); 
SSL_CTX_use_certificate_file(ctx,certfile,SSL_FILETYPE_PEM); 
SSL_CTX_set_default_passwd_cb(ctx,password_cb); 
SSL_CTX_set_default_passwd_cb_userdata(ctx, password); 
SSL_CTX_use_PrivateKey_file(ctx,keyfile,SSL_FILETYPE_PEM); 
SSL_CTX_check_private_key(ctx)); 
SSL_CTX_set_default_passwd_cb(ctx,password_cb); 
SSL_CTX_set_default_passwd_cb_userdata(ctx, password); 
SSL_CTX_use_PrivateKey_file(ctx,keyfile,SSL_FILETYPE_PEM); 
SSL_CTX_check_private_key(ctx); 
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE, verify_callback); 
SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(calist_file)); 
SSL_CTX_set_verify_depth(ctx,2); 

/我的例行程序處理獲取的DH PARAMS和創建RSA臨時密鑰和隨機/

RAND_load_file(random, SIZE); 
load_dh_params(ctx,DHFILE); 
generate_eph_rsa_key(ctx); 

SSL_CTX_set_session_id_context(ctx,(void*)&s_server_session_id_context,sizeof (s_server_session_id_context)); 
mydata_index = SSL_get_ex_new_index(0, "mydata index", NULL, NULL, NULL); 

SSL_CTX_set_session_cache_mode(ctx, (ctx, SSL_SESS_CACHE_SERVER | SSL_SESS_CACHE_NO_INTERNAL | SSL_SESS_CACHE_NO_AUTO_CLEAR); 
SSL_CTX_sess_set_get_cb(ctx, get_session_cb); 
SSL_CTX_sess_set_new_cb(ctx, new_session_cb); 
SSL_CTX_sess_set_remove_cb(ctx, remove_session_cb); 

當客戶端連接的get_session_cb應該叫什麼我想是我在那裏根據一些標準選擇會話ID(將來會話ID將具有某種含義(主機ID)不僅是隨機數,而且這部分現在還沒有實現)。如果沒有符合我的標準的會話,則應用程序將通過new_session_cb創建一個會話。服務器應該有相同的行爲,首先會嘗試在會話池中找到會話,如果發現沒有成功,那麼只能創建一個新會話。

我不確定是否真的有可能爲客戶提供什麼。所以這就是我甚至試圖獲得一個會話並通過SSL_set_session(ssl,session)手動設置的方式。

感謝,

回答

3

這是很難沒有看到所有其他OpenSSL的在你的代碼調用說,我們真的很需要一個獨立的樣本出現該問題。話雖如此,這聽起來像是使用會話票據擴展可能會導致RFC 5077服務器無狀態會話恢復的問題。關閉它避免了一些我與外部的會話遇到的問題:

SSL_CTX_set_options(sslctx, SSL_OP_NO_TICKET); 

但是,如果你想要去的在服務器無狀態會話恢復的道路,這將是完全預料在服務器端沒有調用你的外部會話緩存 - 這就是沒有服務器狀態的會話恢復的確切點。

相關問題