2016-03-25 27 views
3

たとえば、私は電子メールクライアントを開発します。 私はいくつかのサーバー、例えばimap.gmail.com、キャッシュSSLセッションを知っています。だから私はサーバーの負荷を軽減するために(私の側のキャッシュから)SSLセッションを再利用したい。boost :: asioはsslセッションキャッシュを使用しますか?

私はboost :: asioをネットワークエンジンとして使用します。 質問は以下のとおりです。

  1. ブースト:: ASIO :: SSL ::ストリームがSSLセッション・キャッシュを使用しない、 は、私はそれをどのように有効にすることができますか?
  2. boost :: asio :: ssl :: stream ssl-session-cacheを使用するにはどうすればいいですか? :)
+0

私はそれがssl_contextのためだと思う:http://stackoverflow.com/a/35136363/85371 – sehe

+1

@sehe、ありがとう、それは非常に有用です。私は、 'ssl :: context :: native_handle()' + 'SSL_CTX_set_session_cache_mode()' + 'SSL_set_session()'などを使う必要があることを理解しました。試してみます ) – o2gy

答えて

2

boost :: asioは、ssl-sessionキャッシュメカニズムを直接サポートしていません。しかし、boost :: asio :: ssl :: streamはSSL_SESSIONオブジェクト(opensslライブラリから)を内部に保持するので、手動で行うのは簡単です。

次のように実装は次のようになります。

boost::asio::io_service io; 
boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23_client); 
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> backend(io, ctx); 

// need some object that will store the cache 
std::map<std::string, SSL_SESSION*> ssl_cache; 

// add session to the cache after a successful connection 
SSL_SESSION *session = SSL_get1_session(backend.native_handle()); 
ssl_cache[host] = session; 

// before a new connection to the 'host', check the cache 
auto cached_session = ssl_cache.find(host); 
if (cached_session != ssl_cache.end()) 
{ 
    SSL_SESSION *session = cached_session->second; 
    SSL_set_session(backend.native_handle(), session); 
} 

// after a connection can check if ssl-session was reused 
if (SSL_session_reused(backend.native_handle())) 
{ 
    // reused 
} 

このアプローチは、両方のキャッシュメカニズムをサポートしていることが重要である:

  • SSL-チケット(RFC 5077)
  • セッション識別子(RFC 5246)
関連する問題