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

时间:2013-08-03 14:56:46

标签: c++ sockets tcp network-programming openssl

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

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

是否可以“窥视”套接字连接而不会干扰初始TLS握手?

我正在使用OpenSSL来实现TLS。

2 个答案:

答案 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有用的链接。

SO old post