天天看點

如何讓服務端同時支援WebSocket和SSL加密的WebSocket(即同時支援ws和wss)?

       自從HTML5出來以後,使用WebSocket通信就變得火熱起來,基于WebSocket開發的手機APP和手機遊戲也越來越多。我的一些開發APP的朋友,開始使用WebSocket通信,後來覺得通信不夠安全,想要對通信進行加密,于是自然而然地就想從ws更新到wss。在更新的過程中,就會存在舊的ws用戶端與新的wss用戶端同時連接配接到同一個伺服器的情況。是以,如果同一個服務端,能同時支援ws和wss,那就太友善了。

(1)由于wss通道必須在TCP連接配接剛建立時(收發消息前)就要先進行SSL加密,否則,後續的通信将無法正常進行。

(2)基于(1),在沒有收發任何消息時,服務端就無法将wss用戶端與其它用戶端區分開來。

(3)為此采用的辦法是:對于任何剛建立的TCP連接配接,先都不加密它,等收到的第一個消息來判斷其消息的頭标志。

(4)如果頭标志不是ESFramework所規定的标志,則表示這第一個消息是密文,無法被解析,進而說明這個用戶端是wss。于是将該用戶端的ip放到cache中,并斷開該連接配接。

(5)wss用戶端會重新連上來,此時服務端從cache中發現已經存在目标ip,則判定其為wss用戶端,于是立即使用SSL加密該通道,之後,該wss用戶端就可以正常通信了。

(6)由于wss 用戶端 IP在cache中的過期時間是 6秒左右,是以,如果一個用戶端IP剛登入了wss用戶端,那麼在同一個IP上登入第二個用戶端(任何用戶端類型),就需要相隔6秒之後。

      運作 CertificateCreator.exe, 然後輸入Common Name(比如Test)、密碼、儲存路徑(比如D:\server.pfx),我們就可以得到包含私鑰的證書server.pfx 。輕按兩下server.pfx ,即可安裝證書。 

       在服務端RapidServerEngine初始化之前,添加如下代碼設定其 WssOptions 屬性:

        設定完成後,啟動服務端。 

        由于上述生成的數字證書僅僅是用于測試的,而是不被正式認可的,是以,需要在浏覽器設定中,将目标數字證書加入到信任清單。

        比如,在360浏覽器中,可如下設定:

如何讓服務端同時支援WebSocket和SSL加密的WebSocket(即同時支援ws和wss)?

        在FireFox中,設定如下:

如何讓服務端同時支援WebSocket和SSL加密的WebSocket(即同時支援ws和wss)?

          将伺服器的位址(https://127.0.0.1:4530)添加到例外中。  

        打開入門demo的Web端源碼中的index.js檔案,找到engine的Initialize方法,将 useWss 參數由false修改為true。

        然後将Web端的 index.html 檔案拖入浏覽器中運作即可。 

       登入一個wss用戶端,一個ws用戶端和一個.NET用戶端,服務端的UI顯示如下:

如何讓服務端同時支援WebSocket和SSL加密的WebSocket(即同時支援ws和wss)?

繼續閱讀