首页 文章

检测到不安全的服务器(NetworkStream)的SslStream(客户端)连接尝试?

提问于
浏览
1

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

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

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

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

2 回答

  • 1

    我找到了一些有关SSL协议的信息(参考文献12),我可以找到一个标准的 Headers :

    从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 ,它被转换为 <NACK> ,(2byte版本),这是一个2字节长的消息,致命警报,"handshake failed" 3 .

  • 0

    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;
    

    在这里,对于具有协议TLS 1.0( 0x0301 )的握手消息( 0x16 ),'re seeing is before that: it'是record layer . 它应该跟一个长度,然后 0x01 再一个"Client Hello"和一个版本(可能不同:客户端支持的最高值) .

    从实际的角度来看,使用Wireshark查看实际数据包(例如在HTTPS上)是值得的 . 有一些示例捕获和示例on this page(虽然你赢了't need to decipher the traffic for what you'重新尝试) .

相关问题