首页 > 解决方案 > OpenSSL 的内部客户端会话缓存的目的是什么?

问题描述

我正在对客户端 SSL 应用程序进行更改以支持 TLSv1.3。为了支持会话重用,我调用SSL_CTX_sess_set_new_cb注册一个回调,OpenSSL 在与服务器协商新会话时调用该回调。在此回调中,我的应用程序将会话保存在应用程序的会话缓存中,以便可以在以后的连接中重用该会话。

但是,仅当启用 OpenSSL 的内部客户端会话缓存时,OpenSSL 才会调用我的回调 [1]。这是通过以下方式完成的:

SSL_CTX_set_session_cache_mode(sslContext, SSL_SESS_CACHE_CLIENT);

但是现在有一个问题,现在有两个会话缓存复制相同的会话:我的应用程序的“外部”缓存和 OpenSSL 的内部缓存。消除这种重复会很好,但是需要两个缓存。需要内部缓存来启用我的回调函数(根据 OpenSSL 的限制),并且需要外部缓存,因为这是我的应用程序可以查找会话并通过SSL_set_session函数重用它的唯一方法。事实上,在使用内部缓存时,这似乎是一个普遍的问题。根据手册页SSL_CTX_set_session_cache_mode,在SSL_SESS_CACHE_CLIENT[2] 部分下:

由于 OpenSSL 库没有可靠的方法来知道是否应该重用会话或选择哪个会话(由于抽象 BIO 层,SSL 引擎没有关于连接的详细信息),应用程序必须选择要使用的会话通过使用 SSL_set_session(3) 函数重用。

据我了解,这意味着:

这让我想知道除了作为启用会话回调的手段之外,启用内部客户端会话缓存的合法用例是什么。例如,是否存在启用内部缓存但没有外部缓存或存储的情况?是否存在在不使用会话回调函数时启用内部缓存有意义的情况?为了清楚起见,我只谈论客户端应用程序。

[1] https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_sess_set_new_cb.html

[2] https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_session_cache_mode.html

标签: openssltls1.3

解决方案


需要内部缓存才能拥有外部缓存是不正确的。SSL_SESS_CACHE_NO_INTERNAL_STORE如果您希望使用以下选项,您可以只拥有外部缓存:

SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL_STORE);

请参阅此处的文档: https ://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_session_cache_mode.html

可以使用函数访问内部缓存SSL_CTX_sessions。看:

https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_sessions.html

这为您提供了形式的会话缓存,LHASH_OF(SSL_SESSION)然后您可以使用各种 LHASH 函数(例如lh_SSL_SESSION_doall)进行搜索。看:

https://www.openssl.org/docs/man1.1.1/man3/lh_TYPE_doall.html

因此,如果您的缓存需求非常简单,那么内部缓存可能就足够了。


推荐阅读