簡體   English   中英

如何檢查連接是否為SSL?

[英]How to check if a connection is SSL?

我有一個使用OpenSSL的C服務器應用程序,並且我在同一端口上接收所有流量。 有沒有一種安全的方法來檢查傳入數據是SSL連接還是其他?

TLS連接上發生的第一件事是客戶端發送ClientHello。 ClientHello以字節值22'\\x16' )開頭,將其標識為握手消息。

如果您的應用協議是基於文本的,則它將不包含任何22個字節(它不是可打印的字符),因此第一個字節足以區分TCP協議和TLS協議-TCP。

如果您的應用協議不是基於文本的,並且非TLS連接有可能從客戶端發送22字節開始,那么您就必須進行更深入的研究。 接下來的2個字節是TLS主要和次要版本號; 當前,您可以預期主要版本字節為3 ,次要版本字節在13的范圍內。 如果您的客戶端使用的是過時的,無效的SSL版本,則可以使用較小的數字,而將來對TLS進行更新時,可以使用較大的數字,因此您必須保持靈活性。

希望您可以排除22作為協議非TLS版本的第一個字節。

您可以將recvMSG_PEEK結合使用來檢查第一個字節而不消耗它,因此在做出決定后,TLS庫或您的應用程序協議仍將讀取該字節。

另一個可能的問題是:如果您的應用協議要求服務器在客戶端之前講話,則您有問題。 客戶端連接后,它可能正在等待您的非TLS問候,或者可能正在發送ClientHello。 這個問題只能通過超時來解決-如果客戶端在某個時間范圍內未發送任何消息,則假定它不會發送ClientHello並繼續使用非TLS版本的協議。 這會給非TLS客戶端帶來懲罰,它會延遲連接啟動,但無法避免這種情況。

如果您自己接受連接,並且在接受連接后切換到SSL握手,則需要自己進行跟蹤。

一個簡單的解決方案是具有一個包含接受的套接字描述符的結構,以及一個布爾標志(如果它不是SSL連接),並具有這些結構的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM