2014-01-14 38 views
0

我正在爲現有應用程序添加SSL支持,並開始考慮向後兼容性。在同一端口上支持SSL和非SSL

與我讀過的其他帖子不同的一個特殊情況是服務器可能不一定使用SSL代碼進行更新。所以我將有一個SSL客戶端連接到一個對SSL沒有任何認識的服務器。

爲了討論的緣故,應用程序一次向服務器發送一次擊鍵,併爲每次按鍵創建一個新的套接字。所以我需要找出一種方法來使這個工作在現有的端口號上,而不是使用超時來確定服務器是否支持SSL。

以優雅的方式處理這個問題的任何建議?

(我使用的Winsock和OpenSSL)

+0

由於SSL是TCP上的協議,它們總是*在同一端口上運行。 –

+0

糟糕。我說錯了我的主題。固定。 – BigHands79

+0

數據不足。您需要考慮*服務器*將如何升級,何時/如果發生這種情況。服務器如何處理已經/尚未升級到SSL的客戶端?你打算使用StartTLS嗎? – EJP

回答

1

一般應用接受平原連接和在不同的端口直接SSL連接,例如smtp端口25和smtps端口465,http端口80和https端口443等。其他方式是使用相同的端口,然後從客戶端獲得特定命令以升級到SSL,例如,像帶有smtp的STARTTLS或帶有ftp的AUTH TLS。

如果這些常用方式不適合你,並且客戶端無論如何都會在協議中發送第一個數據包(例如使用http,但不使用smtp或ftp),則可以在初始化後執行recv(.. MSG_PEEK)接受查看,客戶端發送什麼樣的數據而不從套接字緩衝區中刪除數據。如果窺視的數據看起來像您的普通應用程序協議那麼您將繼續使用SSL,如果它們看起來像來自SSL的客戶端hello(請參閱https://security.stackexchange.com/questions/34780/checking-client-hello-for-https-classification),則需要進行SSL升級。

+0

這是一個非常好的解決方案*,但*我無法修改服務器代碼來實際執行它。我基本上只將SSL支持添加到客戶端,並連接到對SSL一無所知的服務器。在這種情況下,客戶端將使用未加密的連接。 – BigHands79

+0

如果我理解你是正確的,你不知道服務器是否有SSL,但它會監聽同一個端口。如果它具有SSL,它將是直接SSL,而不是使用特定命令(如smtp中的STARTTLS)進行SSL升級。這將是一個糟糕的設計:) 然後你的策略取決於通信協議。如果服務器在連接後等待一段時間後啓動問候語,然後假設SSL。否則,你可以試着說清楚,如果失敗,你可以假設,服務器會寧願使用SSL。在任何情況下都要記住服務器加速下一次連接的選擇。 –

+0

進行非SSL連接後,會在客戶端和服務器之間交換版本標識符。我曾簡單考慮過使用它來進行SSL升級,但攻擊者可能會修改版本號以保持非SSL連接。 (即客戶認爲它正在與舊服務器通話) – BigHands79