繁体   English   中英

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

[英]Detect an SslStream (client) connection attempt to an insecure Server (NetworkStream)?

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

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

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

如果存在已知的标头,是否可以将响应发送给客户端以告知认证失败(通过NetworkStream)?

我发现了大约SSL协议的一些信息(参考文献12 ),并有,我可以寻找一个标准头:

从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 0x16 [0x?? 0x??] [0x?? 0x??] 0x01 0x16 [0x?? 0x??] [0x?? 0x??] 0x01 (SSL“客户端问候”消息)。

对于拒绝消息,看来我可以发送0x15 0x?? 0x?? 0x00 0x02 0x02 0x28 0x15 0x?? 0x?? 0x00 0x02 0x02 0x28 0x15 0x?? 0x?? 0x00 0x02 0x02 0x28转换为<NACK> (2字节版本),这是一条2字节长的消息,致命警报,“握手失败” 3

SSL / TLS客户端将通过发送“ 客户端问候”消息来发起握手。

在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 )。 后面应跟一个长度,然后是“ Client Hello”,然后是0x01 ,然后是版本(可能不同:客户端支持的最高版本)。

从实际的角度来看,值得使用Wireshark查看实际的数据包(例如,在HTTPS上)。 此页面上有一些示例捕获和示例(尽管您不需要为要执行的操作解密流量)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM