我正在編寫一個客戶端/服務器應用程序,我們將使用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)手動設置的方式。
感謝,