SSL 通信を使用するクライアント/サーバー アプリケーションを作成しています。外部キャッシュが機能しない理由を理解するのに苦労しています。セッションをデータベースに保存したいので、内部キャッシュを使用したくありません。私はcallabckを登録しましたSSL_CTX_sess_set_get_cb
がSSL_CTX_sess_set_new_cb, SSL_CTX_sess_set_get_cb
、サーバー側では呼び出されず、接続ごとに新しいSSL_SESSIONが作成されます。クライアントがハンドシェイクで session_id を送信していないように見えますが、これをテストする方法がわかりません。クライアント側では、SSL_set_session を使用してセッションを SSL 接続に接続し、Ubuntu で openSSL 0.9.8 を使用しています。
//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 パラメータのフェッチと 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 を介してセッションを作成します。サーバーは同じ動作をする必要があります。最初に、セッションのプールでセッションを見つけようとし、検出が失敗した場合にのみ、新しいセッションを作成します。
私がクライアントに望んでいることが本当に可能かどうかはわかりません。そのため、セッションを1つだけ取得して、SSL_set_session(ssl、session)を介して手動で設定しようとしました。
ありがとう、