2013-03-20 54 views
1

我有一個服務器正在傾聽客戶的方法TcpListener.BeginAcceptTcpClient()。當客戶端連接時,EndAcceptTcpClient方法爲我提供了TcpClient對象,然後我調用該客戶端流的NetworkStream.BeginRead()來偵聽從客戶端傳輸的數據。檢測SslStream(客戶端)連接嘗試不安全的服務器(NetworkStream)?

一切正常,直到客戶端(期待服務器支持SSL)嘗試連接到(不安全)服務器。當客戶端嘗試執行SSL握手時,從NetworkStream.BeginRead()回調中檢索到的數據當然是亂碼,但在讀取數據之後檢測此握手的正確方法與來自客戶端的「正常」消息相比如何?

SSL握手是否有一個已知的標頭/簽名標識符,我可以通過查看接收到的消息的前幾個字節來檢查普通消息和SSL握手之間的差異來檢查嗎?從檢查收到的字節看起來它可能是ASCII 0x16 0x03 0x01 0x00(又名<SYN><ETX><SOH><NUL>)。

如果有一個已知的標題,是否有我可以發送給客戶端的響應,告訴它認證失敗(通過NetworkStream)?

回答

1

我發現對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(SSL「Client Hello」消息)開頭的消息。

對於拒絕消息,它看起來像我可以給0x15 0x?? 0x?? 0x00 0x02 0x02 0x28其轉換爲<NACK>,(2字節版本),這是一個2字節長的消息,致命的警告,「握手失敗」 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; 

在這裏,你看到的是在此之前:它是record layer,與協議TLS 1.0(0x0301)握手消息(0x16)。它後面應該有一個長度,然後0x01代表「客戶端Hello」和一個版本(可能不同:客戶端支持的最高值)。

從實際的角度來看,使用Wireshark值得關注實際的數據包(例如HTTPS)。有一些示例捕獲和示例on this page(儘管您不需要解釋您正在嘗試執行的操作)。

相關問題