我正在对客户端 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) 函数重用。
据我了解,这意味着:
- 客户端应用程序必须完成
SSL_SESSION*
向 OpenSSL 提供重用会话的工作。即,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