boost::asio 是否使用 ssl 会话缓存?

o2g*_*2gy 5 c++ ssl boost

例如,我开发了电子邮件客户端。我知道某些服务器(例如imap.gmail.com)会缓存 SSL 会话。所以我想重用 SSL 会话(来自我这边的缓存)来减少服务器负载。

我使用boost::asio作为网络引擎。问题是:

  1. 如果boost::asio::ssl::stream不使用 ssl-session-cache,我该如何启用它?
  2. 如果boost::asio::ssl::stream使用 ssl-session-cache,我该如何关闭它?:)

o2g*_*2gy 4

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
}
Run Code Online (Sandbox Code Playgroud)

重要的是,这种方法支持两种缓存机制:

  • ssl 票证 (RFC 5077)
  • 会话标识符 (RFC 5246)