OpenSSL 的内部客户端会话缓存的目的是什么?

What's the purpose of OpenSSL's internal client-side session cache?

我正在更改客户端 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] 部分下:

As there is no reliable way for the OpenSSL library to know whether a session should be reused or which session to choose (due to the abstract BIO layer the SSL engine does not have details about the connection), the application must select the session to be reused by using the SSL_set_session(3) function.

据我了解,这意味着:

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

[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

为了拥有外部缓存需要内部缓存是不正确的。如果您希望使用 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

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