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.
据我了解,这意味着:
- 客户端应用程序必须完成工作以向 OpenSSL 提供
SSL_SESSION*
以重用会话。即,OpenSSL 无法自行决定是否重用客户端会话——即使该会话存在于其内部缓存中。
- 因此,该指针必须来自某些外部缓存或存储,而不是内部客户端会话缓存。
这让我想知道什么是启用内部客户端会话缓存的合法用例,而不是作为启用会话回调的手段。例如,是否存在启用内部缓存但没有外部缓存或存储有意义的情况?是否存在在不使用会话回调函数时启用内部缓存有意义的情况?明确地说,我只谈论客户端应用程序。
[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
因此,如果您的缓存需求非常简单,那么内部缓存可能就足够了。
我正在更改客户端 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.
据我了解,这意味着:
- 客户端应用程序必须完成工作以向 OpenSSL 提供
SSL_SESSION*
以重用会话。即,OpenSSL 无法自行决定是否重用客户端会话——即使该会话存在于其内部缓存中。 - 因此,该指针必须来自某些外部缓存或存储,而不是内部客户端会话缓存。
这让我想知道什么是启用内部客户端会话缓存的合法用例,而不是作为启用会话回调的手段。例如,是否存在启用内部缓存但没有外部缓存或存储有意义的情况?是否存在在不使用会话回调函数时启用内部缓存有意义的情况?明确地说,我只谈论客户端应用程序。
[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
因此,如果您的缓存需求非常简单,那么内部缓存可能就足够了。