2016-03-25 33 views
3

例如,我开发电子邮件客户端。 我知道一些服务器,例如imap.gmail.com,缓存SSL会话。所以我希望重复使用SSL会话(来自我的缓存)来减少服务器负载。boost :: asio是否使用ssl会话缓存?

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

  1. 如果的boost ::支持ASIO :: SSL ::流不使用SSL会话高速缓存, 我怎么能实现呢?
  2. if 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会话缓存机制。但是,由于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)
相关问题