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