【问题标题】:Detect an SslStream (client) connection attempt to an insecure Server (NetworkStream)?检测到不安全服务器(NetworkStream)的 SslStream(客户端)连接尝试?
【发布时间】:2013-03-09 21:43:34
【问题描述】:

我有一台服务器正在使用TcpListener.BeginAcceptTcpClient() 方法侦听客户端。当客户端连接时,EndAcceptTcpClient 方法给了我TcpClient 对象,然后我调用该客户端流的NetworkStream.BeginRead() 来监听从客户端传输的数据。

在客户端(希望服务器支持 SSL)尝试连接到(不安全的)服务器之前,一切正常。当客户端尝试进行 SSL 握手时从NetworkStream.BeginRead() 回调中检索到的数据当然是胡言乱语,但是在读取数据与来自客户端的“正常”消息之后检测此握手的正确方法是什么?

SSL 握手是否有一个已知的标头/签名标识符,我可以通过查看收到的消息的前几个字节来检查以区分普通消息和 SSL 握手之间的区别?通过检查收到的字节,它看起来可能是 ASCII 0x16 0x03 0x01 0x00(又名 <SYN><ETX><SOH><NUL>)。

如果有一个已知的标头,我是否可以向客户端发送一个响应来告诉它身份验证失败(通过 NetworkStream)?

【问题讨论】:

    标签: c# ssl tcpclient networkstream


    【解决方案1】:

    SSL/TLS 客户端将通过发送Client Hello 消息来发起握手。

    在 XDR 表示法中,这是:

      struct {
          ProtocolVersion client_version;
          Random random;
          SessionID session_id;
          CipherSuite cipher_suites<2..2^16-2>;
          CompressionMethod compression_methods<1..2^8-1>;
          select (extensions_present) {
              case false:
                  struct {};
              case true:
                  Extension extensions<0..2^16-1>;
          };
      } ClientHello;
    

    在这里,您看到的是之前的内容:它是record layer,用于带有协议 TLS 1.0 (0x0301) 的握手消息 (0x16)。它后面应该跟一个长度,然后是 0x01 代表“Client Hello”,再跟一个版本(可能不同:客户端支持的最高版本)。

    从实际的角度来看,使用 Wireshark 查看实际数据包(例如在 HTTPS 上)是值得的。有一些示例捕获和示例on this page(尽管您不需要破译您正在尝试执行的流量)。

    【讨论】:

      【解决方案2】:

      我找到了一些关于 SSL 协议的信息(参考 1、2)并且有一个标准的标头可供我查找:

      来自 IBM 参考网站2:

      Byte   0       = SSL record type = 22 (SSL3_RT_HANDSHAKE)
      Bytes 1-2      = SSL version (major/minor)
      Bytes 3-4      = Length of data in the record (excluding the header itself).
      Byte   5       = Handshake type
      Bytes 6-8      = Length of data to follow in this record
      Bytes 9-n      = Command-specific data
      

      所以我可以查找以0x16 [0x?? 0x??] [0x?? 0x??] 0x01 开头的消息(SSL“Client Hello”消息)。

      对于拒绝消息,看起来我可以发送0x15 0x?? 0x?? 0x00 0x02 0x02 0x28,它被翻译为&lt;NACK&gt;,(2字节版本),这是一个2字节长的消息,致命警报,“握手失败”3。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        • 1970-01-01
        • 2017-12-13
        • 2019-05-20
        • 2017-05-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多