3

SSL 通信を使用するクライアント/サーバー アプリケーションを作成しています。外部キャッシュが機能しない理由を理解するのに苦労しています。セッションをデータベースに保存したいので、内部キャッシュを使用したくありません。私はcallabckを登録しましたSSL_CTX_sess_set_get_cbSSL_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)を介して手動で設定しようとしました。

ありがとう、

4

1 に答える 1

4

コード内の他のすべてのOpenSSL呼び出しを見ずに言うのは非常に難しいので、問題を示す自己完結型のサンプルが本当に必要です。そうは言っても、これは、セッションチケット拡張機能を使用したRFC5077サーバーのステートレスセッション再開で問題が発生する可能性があるように思われます。オフにすると、外部セッションで発生した問題の一部が回避されました。

SSL_CTX_set_options(sslctx, SSL_OP_NO_TICKET);

ただし、サーバーステートレスセッション再開の道を進みたい場合は、サーバー側で外部セッションキャッシュへの呼び出しがないことが完全に予想されます。これは、サーバーステートなしのセッション再開の正確なポイントです。

于 2013-01-18T13:01:49.280 に答える