openssl - 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) 函数重用。
据我了解,这意味着:
- 客户端应用程序必须完成
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
解决方案
需要内部缓存才能拥有外部缓存是不正确的。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
因此,如果您的缓存需求非常简单,那么内部缓存可能就足够了。
推荐阅读
- mysql - 将列转换为sql中的行
- jquery - jquery before() 和 after() 用来创建一个容器未在 after() 中插入结束标签
- php - 如何在 Corcel 或将 Wordpress 导入 Laravel 之间进行选择
- html - 如何将一条线转换成两条线并用css旋转
- typescript - TypeScript 从另一种类型动态派生字段
- android - Flutter中与Jar文件相关的构建错误
- avro - 将 avro 反序列化为没有架构的通用记录
- java - 无法打开嵌套条目 'WEB-INF/lib/example.jar
- javascript - highcharts 不读取数据,使用假数据
- xml - 在 unix shell 脚本中删除 xml 标记之间的新行