基于证书“串行”字段的 TLS 平衡器

问题描述

我目前在客户端部署了许多设备(“D1”、“D2”、...),它们使用 TLS 连接到我的服务器(“S1”)。现在我希望(仅)其中的一部分与新服务器(“S2”)进行通信。 我唯一标识客户端的唯一方法是基于连接打开时证书的“串行”字段。我无法更改设备端的任何内容

理想情况下,我想要一个未终止的代理/平衡器,它根据证书的串行字段通过 S1 或 S2 重定向 TLS 连接。我不想在平衡器端终止,以免需要生产证书、密钥、...(以及它暗示的安全威胁)。

根据我的知识,这是我的设想:

一个从一台服务器到另一台服务器的端口重定向`

但是所有设备都在 S1 或 S2 上

将“ClientHello”从 D1 转发到 S1 S2,将“ServerHello,...,ServerHellodone”从 S1 或 S2 转发到 D1,根据“ClientKeyExchange”“serial”字段选择 S1 或S2 用于后面的消息

如果“ServerHello,ServerHellodone”由 S1 完成,我预计连接会中断一半,但连接稍后会在 S2 上继续

将所有数据包随机转发到S1或S2,一旦D1发送“ClientKeyExchange”,如果是错误的服务器,则断开连接,等待D1重试

最终这会起作用,但我想避免让 D1 重试 10 次以打开连接,因为它不走运

使用终止的平衡器(如带有选项“ssl_c_serial”的HAproxy)

这需要生产证书,密钥,...,我想避免它



这甚至可能吗?我的意思是,由于 D1 发送的第一个数据包中不包含“串行”,因此无法识别它,直到为时已晚。希望有一些我没有想到的东西。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...