3

我有一个接受普通和 SSL / TLS 加密连接的 C++ 应用程序。目前它在 2 个单独的端口上执行此操作。

我希望能够使用单个端口并检测客户端是否使用 TLS 并做出相应的响应。

是否可以在不干扰初始 TLS 握手的情况下“窥视”套接字连接?

我正在使用 OpenSSL 来实现 TLS。

4

2 回答 2

3

您只需要查看新传入连接的前几个字节而不使用它们(recv()使用MSG_PEEK标志调用),并查看它们是否看起来像 RFC 2246 中定义的 SSL ClientHello 消息。然后决定是作为纯文本继续还是通过 SSL。

于 2013-08-04T01:12:18.443 回答
2

我不相信有一个简单的解决方案来完成这项任务。

取自IETF

RFC 2246 TLS 协议 1.0 版 1999 年 1 月

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

7.3. 握手协议概述

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

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

  • 交换问候消息以就算法达成一致,交换随机值,并检查会话恢复。

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

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

  • 从预主密钥生成主密钥并交换随机值。

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

  • 允许客户端和服务器验证他们的对等方计算了相同的安全参数,并且握手发生时没有被攻击者篡改。

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

另一个有用的链接。

这么老的帖子

于 2013-08-03T15:30:32.870 回答