我正在尝试使用 OpenSSL 实现 DTLS 服务器。我可以通过获取应用程序数据,但是当客户端和服务器协商后,我注意到服务器上的 session_id 为空。
检查代码,更具体地说是 ssl_sess.c,session_id_length 显式设置为零,注释参考 RFC4507。
我的问题是在协商连接时,我可以使用什么 ID 来唯一标识客户端?
我注意到在客户端,会话 id 似乎是从票证中计算出来的,但这似乎并没有在服务器上发生。
与任何基于数据报的应用程序相同。根据RFC 4347(数据报传输层安全):
请注意,与 IPsec 不同,DTLS 记录不包含任何关联标识符。应用程序必须安排在关联之间进行多路复用。 对于 UDP,这可能是通过主机/端口号完成的。
(强调我的)
从您的评论看来,您实际上是在尝试跨“会话”(一个模糊但可能适用的描述符)维护状态。跨“会话”维护状态是一个应用层问题。(D)TLS 是传输层(因此得名)。
严格来说,运行在 (D)TLS 上的应用程序需要有自己的“客户端 ID”概念,客户端将其发送到服务器。有无数种方法可以解决这个问题,具体取决于您的应用程序的性质和您的安全要求(当然,用户名+密码是最常见的)。
另一种选择是使用客户端证书代替独立的应用层 ID,但这仍然需要应用层了解正在发生的事情并将客户端的证书与永久状态信息相关联。烦人的是,这需要为每个客户端管理一个单独的证书。这足够繁重,以至于大多数人不走这条路。它确实有一些优点,例如用户不能准确地选择一个错误的密码或将其写在他们显示器上的便签上。另一方面,如果有人可以访问存储证书的文件,那么游戏就结束了。
当然,许多书籍可能(并且经常出现)关于安全和身份验证的主题......