1. 程式人生 > >如何讓服務端同時支援WebSocket和SSL加密的WebSocket(即同時支援ws和wss)?

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

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

一. 實現方案

  但是,要服務端同時支援ws與wss並不太容易,其難點主要在於:wss通道必須在TCP連線剛建立時(收發訊息前)就要先進行SSL加密,否則,後續的通訊將無法正常進行。如此一來,當同時存在ws和wss客戶端時,伺服器在尚未通訊之前就無法具體分辨哪個是ws哪個是wss。那怎麼辦了?我們的解決方案,是採用試探法,該方案已經在

ESFramework 通訊框架中實現。 

(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秒之後。

   基於以上方案實現服務端後,我們接下來基於 ESFramework入門demo 來具體講解一下如何在實際應用中同時支援ws和wss。

二. 服務端實現

1. 數字證書

      為測試方便,我們可以使用 CertificateCreator 製作一個用於本地測試的數字證書。

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

2. 服務端引擎設定

       在服務端RapidServerEngine初始化之前,新增如下程式碼設定其 WssOptions 屬性:

        WssOptions wssOptions = new WssOptions( new X509Certificate2("D:\\server.pfx", "password") ,SslProtocols.Default ,false);
        rapidServerEngine.WssOptions = wssOptions;   

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

三. 客戶端實現

1. 信任測試用的數字證書      

        由於上述生成的數字證書僅僅是用於測試的,而是不被正式認可的,所以,需要在瀏覽器設定中,將目標數字證書加入到信任列表。

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

          

        在FireFox中,設定如下:

         

          將伺服器的地址(https://127.0.0.1:4530)新增到例外中。  

2. 客戶端引擎設定

        開啟入門demo的Web端原始碼中的index.js檔案,找到engine的Initialize方法,將 useWss 引數由false修改為true。

        然後將Web端的 index.html 檔案拖入瀏覽器中執行即可。 

四. 執行效果

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

       

相關推薦

如何服務同時支援WebSocketSSL加密WebSocket同時支援wswss

  自從HTML5出來以後,使用WebSocket通訊就變得火熱起來,基於WebSocket開發的手機APP和手機遊戲也越來越多。我的一些開發APP的朋友,開始使用WebSocket通訊,後來覺得通訊不夠安全,想要對通訊進行加密,於是自然而然地就想從ws升級到wss。在升級的過程中,就會存在舊的ws客戶端與新

【2017-05-21】WebForm跨頁面傳值取值、C#服務跳轉頁面、 Button的OnClientClick屬性、Js中getAttribute超鏈接點擊彈出警示框。

代碼 height delet update size 內存 客戶 bar win 一、跨頁面傳值和取值: 1、QueryString - url傳值,地址傳值 優缺點:不占用服務器內存;保密性差,傳遞長度有限。 通過跳轉頁面路徑進行傳值,方式: href="地址?ke

服務I/O效能大比拼:Node、PHP、JavaGo

正如大部分存在多種解決途徑的場景一樣,重點不在於哪一種途徑更好,而是在於理解如何進行權衡。讓我們來參觀下I/O的景觀,看下可以從中竊取點什麼。 在這篇文章,我們將會結合Apache分別比較Node,Java,Go,和PHP,討論這些不同的語言如何對他們的I/O進行建模,各個模型的優點和缺點,並得出一些初步基準

在linux服務器下日誌提取的python腳本實現輸入開始時間結束時間打包該時間段內的文件

number init temp mktime tar -zcvf .py uri 指令 cal 1.需求:近期在提取linux服務器下的日誌文件時總是需要人工去找某個時間段內的日誌文件,很是枯燥乏味,於是乎,我就想著用python結合linux指令來寫一個日誌提取的腳本,

java服務解決js跨域的問題 CORS跨域資源共享 的配置

nginx相容跨域上傳 相容情況: 各種新版本的ie10,firefox,opera,safari,chrome以及移動版safari和Android瀏覽器 ie9及一下版本請使用flash方式來相容 通過OPTIONS請求握手一次的方式實現跨根域傳送請求,需要服務端配置

mysql連線的超時ssl的問題不加ssl正常,報警告,加上ssl連線超時

原因:MySql版本為5.7,沒有配MySQL SSL,但是連線池連結的時候預設加密了,所以一直連不上,解決方案如下: url=jdbc:mysql://192.168.80.128:3301/dream?useUnicode=true&characterEnc

淺析MySQL中的Index Condition Pushdown (ICP 索引條件下推)Multi-Range ReadMRR 索引多範圍查找查詢優化

修正 itl iad 較高的 一句話 mysql5 條件篩選 global 查詢條件 本文出處:http://www.cnblogs.com/wy123/p/7374078.html(保留出處並非什麽原創作品權利,本人拙作還遠遠達不到,僅僅是為了鏈接到原文,因為後續對

編程之法:面試算法心得最長回文子串

高效 pre 記錄 特殊字符 一段 stp ace 分開 枚舉 內容全部來自編程之法:面試和算法心得一書,實現是自己寫的使用的是java 題目描述 給定一個字符串,求它的最長回文子串的長度。 分析與解法 最容易想到的辦法是枚舉所有的子串,分別判斷其是否為回文。這個思路初看起

Linux stat命令AIX istat命令 查看文件修改時間

AIX istat Linux stat 在工作中,經常會執行一些定期執行的腳本,每次執行前我們應該查看一下腳本是否有變化,防止有人在腳本中植入有危害的命令,這裏有一個命令很實用,大家可以熟悉一下。 1、AIX 系統命令istat $ istat init+ASM.ora Inode 111666

Access表的創建管理CorelDRAW課程總結對象的操作管理

存儲 管理工具 完成 core ces 知識 包括 掌握 重要 access總結 access表的是數據庫操作及錄入數據的必要步驟,要用表來存儲數據首先是創建一個表。要創建表首先必須了解access的數據類型、表結構字段屬性等內容。 創建完表還要向其中輸入數據,數據的輸入必

Django支持數據庫長連接可以提高不少性能哦

cell pro site 頂上 源碼 idle arc pla 思路 書接上回 上回我們說到:《在生產系統使用Tornado WebServer來代替FastCGI加速你的Django應用》 那麽現在很流行用一些高性能的nonblock的app server來hos

web前端技術講解之callapply的使用很適合新手小白學習

就是想整理一篇關於call和apply的文件,不想編一些什麼最近學習的時候遇到問題研究之後想分享給大家之類的理由,就是想寫!就是想發!就是想!!! 以下是正文>>>>>>>>> 在使用call和apply之前,我們需要先做一些知識儲備: 一、wind

tomcatjdk版本相容Tomcat版本要比jdk高

用的tomcat是低版本的,但是用的jdk卻是高版本的,用Servlet做的專案執行都沒有問題,但是直接執行jsp卻死活都執行失敗。 最後發現是tomcat和jdk的版本問題造成的。 總結如下: tomcat v7.0-------support-------->Java EE

PHP統計字串長度切割字串函式解決亂碼問題,切割中文問題

統計字串長度函式:mb_strlen('要統計的字串','字符集(utf-8)');           例項:$a = ‘12測試測試測試測試測試1231l’;           &nbs

SelectSearch+CNN人工智慧實現人臉檢測識別圖文教程附完整專案程式碼python語言

未完待續。。。 本文只說明原理,提供參考,實際應用需考慮其他因素。 環境 win7 python3.6.3 keras2.1.4 注意:各軟體之間版本之間存在適配問題。 目標 通過人工智慧技術實現目標(人臉)檢測和識別 步驟 1.selectsearc

spring boot支援vue history mode增加對404的處理

原本的問題是這樣的,用大前端(Vue全家桶),靜態檔案直接放在Spring Boot的static資料夾裡,啟動後,假設訪問http://localhost/page1/page1_1,如果直接點瀏覽器

圖片貼上上傳,預覽——相容ie手動上傳谷歌瀏覽器貼上或拖拽上傳

1.優化上傳的css: .img-class { width: 525px; height: 290px; } .img-paste-class { width: 530px; height: 330px; } .a-file {

Chapter 4 字串格式化輸入\輸出Character strings and formatted input\output

重要內容 1. C中的字串一定以空字元結尾。這意味著陣列的容量至少比待儲存字串中的字元數多1. 2. 建立符號常量:      方法1: 宣告一個變數,然後將該變數設定為所需的常量。      方法2:用#define NAME value  (注:一般用大寫表示符號

C++類物件詳解new與不new的區別

一、"類" 的介紹     在C++中, 用 "類" 來描述"物件", 所謂的"物件"是指現實世界中的一切事物。那麼類就可以看做是對相似事物的抽象, 找到這些不同事物間的共同點, 如自行車和摩托車, 首先他們都屬於"物件", 並且具有一定得相同點, 和一些不同點, 相同點如

深度學習TensorFlow學習資源書籍、文件視訊

自己學習機器學習有一段時間了,有了一定基礎,學習下深度學習和TensorFlow 彙總下找到的比較好看學習資源,也方便看 深度學習 理論篇–視訊 課程學習的順序是: 1, 神經網路和深度學習 2, 改善深層神經網路:超引數除錯