自动检测TCP连接是否使用SSL/TLS?

3
我有一个C++应用程序,可以接受明文和SSL / TLS加密连接。目前,它在2个不同的端口上运行。
我希望能够使用单个端口,并检测客户端是否使用TLS,然后相应地进行响应。
在不干扰初始TLS握手的情况下,有可能“窥视”套接字连接吗?
我正在使用OpenSSL来实现TLS。
2个回答

3

当有一个新的连接进来时,你只需使用 recv() 函数并传入 MSG_PEEK 标志来查看前几个字节,而无需消耗它们,判断这些字节是否符合 RFC 2246 中定义的 SSL ClientHello 消息格式。然后决定是继续使用明文方式通信还是建立 SSL 连接。


2

我认为这个任务没有简单的解决方案。

引自 IETF

RFC 2246 TLS协议版本1.0 1999年1月

接收方可以自行决定是否将此视为致命错误。但是,所有以致命级别传输的消息都必须被视为致命消息。

7.3. 握手协议概述

会话状态的加密参数由TLS握手协议生成,该协议在TLS记录层之上运行。当TLS客户端和服务器首次开始通信时,它们
同意协议版本,选择加密算法,
可选择互相验证身份,并使用公钥加密技术生成共享秘密。

TLS握手协议涉及以下步骤:

  • 交换hello消息以协商算法,交换随机值并检查会话恢复。

  • 交换必要的加密参数,以允许客户端和服务器达成一致的预主秘密。

  • 交换证书和加密信息,以允许客户端和服务器进行身份验证。

  • 从预主秘密和交换的随机值生成主秘密。

  • 向记录层提供安全参数。

  • 允许客户端和服务器验证其对等方是否计算了相同的安全参数,并且握手过程没有被攻击者篡改。

因此,您应该嗅探握手消息,确定其格式并得出结论,以确定客户端是否尝试使用TLS。

另一个有用的链接。

一个SO旧帖子


谢谢,您有什么建议可以让我嗅探套接字,以便SSL_accept()仍然可以找到所有必要的字节吗? - Gene Vincent
听起来对我来说很容易。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接