我有一个接受普通和 SSL / TLS 加密连接的 C++ 应用程序。目前它在 2 个单独的端口上执行此操作。
我希望能够使用单个端口并检测客户端是否使用 TLS 并做出相应的响应。
是否可以在不干扰初始 TLS 握手的情况下“窥视”套接字连接?
我正在使用 OpenSSL 来实现 TLS。
我有一个接受普通和 SSL / TLS 加密连接的 C++ 应用程序。目前它在 2 个单独的端口上执行此操作。
我希望能够使用单个端口并检测客户端是否使用 TLS 并做出相应的响应。
是否可以在不干扰初始 TLS 握手的情况下“窥视”套接字连接?
我正在使用 OpenSSL 来实现 TLS。
您只需要查看新传入连接的前几个字节而不使用它们(recv()
使用MSG_PEEK
标志调用),并查看它们是否看起来像 RFC 2246 中定义的 SSL ClientHello 消息。然后决定是作为纯文本继续还是通过 SSL。
我不相信有一个简单的解决方案来完成这项任务。
取自IETF。
RFC 2246 TLS 协议 1.0 版 1999 年 1 月
接收方可自行决定是否将此视为致命错误。但是,所有以致命级别传输的消息都必须被视为致命消息。
7.3. 握手协议概述
会话状态的加密参数由 TLS 握手协议生成,该协议在 TLS 记录层之上运行。当 TLS 客户端和服务器第一次开始通信时,他们
就协议版本达成一致,选择加密算法,
可选地相互验证,并使用公钥加密
技术生成共享机密。TLS 握手协议涉及以下步骤:
交换问候消息以就算法达成一致,交换随机值,并检查会话恢复。
交换必要的加密参数以允许客户端和服务器就预主密钥达成一致。
交换证书和加密信息以允许客户端和服务器进行身份验证。
从预主密钥生成主密钥并交换随机值。
向记录层提供安全参数。
允许客户端和服务器验证他们的对等方计算了相同的安全参数,并且握手发生时没有被攻击者篡改。
因此,您应该嗅探握手消息,确定其格式并得出客户端是否尝试使用 TLS 的结论。
另一个有用的链接。
这么老的帖子。