boost::asio使用SSL会话缓存吗?

6
例如,我正在开发电子邮件客户端。 我知道一些服务器,例如imap.gmail.com,会缓存SSL会话。因此,我希望重复使用SSL会话(从我的一侧缓存)以减少服务器负载。
我使用boost :: asio作为网络引擎。 问题是:
1. 如果boost :: asio :: ssl :: stream未使用ssl会话缓存,我该如何启用它? 2. 如果boost :: asio :: ssl :: stream使用ssl会话缓存,我该如何关闭它? :)

我认为这是由于ssl_context引起的:https://dev59.com/8ofca4cB1Zd3GeqPodgE#35136363 - sehe
1
@sehe,谢谢,这非常有帮助。我已经明白了,我需要使用ssl::context::native_handle() + SSL_CTX_set_session_cache_mode() + SSL_set_session()等等。我会尝试的) - o2gy
1个回答

4
boost::asio 不直接支持 SSL 会话缓存机制。但是,由于 boost::asio::ssl::stream 在内部保存了来自 OpenSSL 库的 SSL_SESSION 对象,因此可以手动处理。
实现方法如下:
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-tickets (RFC 5077)
  • 会话标识符 (RFC 5246)

我不确定应该把这个放在哪里。我的应用程序基本上是模仿http_server_async_ssl.cpp的,你知道我应该把它放在哪里吗?我认为我可以在调用Session::on_handshake之前立即调用SSL_set_session,但它没有起作用。我也尝试了其他几个地方,但都无济于事。 - Matt
@Matt,你好,这个问题(和答案)是关于客户端的,而不是关于服务器的。你提供的链接示例是一个服务器。很抱歉,我不知道如何在SSL服务器上启用缓存支持,但我认为你应该查看你的ssl库的直接设置。 - o2gy
1
好的,无论如何还是谢谢。我已经找到了答案(如果有人也遇到类似的问题,请参考此页面),结果我需要调用SSL_CTX_set_session_id_context,而且只有在Keep-Alive为false时才会出现问题(这就是为什么我在测试中没有看到它,但在生产中却看到了)。我将其实现到我的最小示例中。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接