我有一个C++应用程序,可以接受明文和SSL / TLS加密连接。目前,它在2个不同的端口上运行。
我希望能够使用单个端口,并检测客户端是否使用TLS,然后相应地进行响应。
在不干扰初始TLS握手的情况下,有可能“窥视”套接字连接吗?
我正在使用OpenSSL来实现TLS。
我希望能够使用单个端口,并检测客户端是否使用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握手协议涉及以下步骤:
交换hello消息以协商算法,交换随机值并检查会话恢复。
交换必要的加密参数,以允许客户端和服务器达成一致的预主秘密。
交换证书和加密信息,以允许客户端和服务器进行身份验证。
从预主秘密和交换的随机值生成主秘密。
向记录层提供安全参数。
允许客户端和服务器验证其对等方是否计算了相同的安全参数,并且握手过程没有被攻击者篡改。
因此,您应该嗅探握手消息,确定其格式并得出结论,以确定客户端是否尝试使用TLS。
另一个有用的链接。
一个SO旧帖子。