我有一個使用OpenSSL的C服務器應用程序,並且我收到同一端口上的所有流量。有沒有安全的方法來檢查傳入的數據是SSL連接還是其他?如何檢查連接是否爲SSL?
回答
發生在TLS連接上的第一件事是發送ClientHello的客戶端。 ClientHello以字節值22
('\x16'
)開始,將其標識爲握手消息。
如果你的應用協議是基於文本的,那麼它將不包含任何22
字節(它不是可打印的字符),所以第一個字節足以區分TCP協議和TCP協議。 -TLS環比TCP。
如果您的應用協議不是基於文本的,並且非客戶端發送22
字節時可能會出現非TLS連接,那麼您需要深入瞭解。接下來的2個字節是TLS主版本號和次版本號;目前您可以預期主版本字節爲3
,次版本字節在1
至3
的範圍內。如果客戶使用過時的,破壞的SSL版本,則可能會有更少的數字,並且隨着TLS將來的更新,更高的數字將成爲可能,因此您必須靈活。
希望您可以排除22
作爲您的協議的非TLS版本的第一個字節。
您可以使用recv
和MSG_PEEK
檢查第一個字節而不消耗它,因此在做出決定後,它仍然會在TLS庫或應用程序協議中讀取。
另一種可能的併發症:如果您的應用程序協議要求服務器在客戶端之前發言,則說明您有問題。客戶端連接後,它可能正在等待您的非TLS問候語,或者它可能正在發送ClientHello。這個問題只能通過超時來解決 - 如果客戶端在某個時間段內沒有發送任何內容,則認爲它不會發送ClientHello並繼續使用非TLS版本的協議。這會延遲啓動連接時懲罰非TLS客戶端,但無法避免這種情況。
...並且當我們不提及舊的破壞版本時,我們都停止使用協議名稱「SSL」。 TLS已經在這裏了! –
非常感謝,這就是我一直在尋找的答案! – Marco
如果您自己接受連接,並在接受連接後切換到SSL握手,則需要自行跟蹤。
一個簡單的解決方案是擁有一個包含接受的套接字描述符和一個布爾標誌(如果它是一個SSL連接或不是)的結構,並具有這些結構的列表。
- 1. 如何檢查連接是否使用ssl?
- 2. 如何檢查是否PPP連接忙
- 3. 如何檢查DataMapper是否已連接?
- 4. 如何檢查是否WebSocket的連接
- 5. 如何檢查連接是否存活?
- 6. 如何檢查手機是否連接?
- 7. 如何檢查Graph是否連接
- 8. 如何檢查連接是否丟失
- 9. 如何檢查GoogleApiClient是否連接?
- 10. 如何檢查wifi是否連接?
- 11. 檢查mongoDB是否連接
- 12. 如何檢查curl是否支持ssl?
- 13. 如何在java連接池中檢查連接是否關閉
- 14. 檢查其是否連接與否
- 15. 如何使用TcpClient檢查您的連接是否被接受?
- 16. 如何檢查服務器是否正在接受連接
- 17. 如何檢測藍牙是否連接?
- 18. 如何檢測屏幕是否連接?
- 19. 檢查連接是否有效
- 20. 檢查Twitter是否與iOS 5連接
- 21. 檢查是否有USB/AC連接
- 22. 檢查視頻是否連接到netstream
- 23. IOS檢查m3u8流是否連接
- 24. 檢查無線AP是否連接
- 25. Dojo - 檢查事件是否已連接
- 26. 檢查電源是否連接android
- 27. js檢查用戶是否有連接
- 28. C++ ODBC檢查連接是否成功
- 29. PySerial,檢查串行是否連接
- 30. MysqliDb - 檢查連接是否關閉
您的意思是說您接受服務器中所有使用單個端口的連接,然後在接受連接後進行SSL協商?你不使用庫函數來爲你處理連接? –
是的。我應該決定使用哪種類型的流量,然後是SSL進行SSL協商,否則以另一種方式處理。 – Marco