2011-03-15 28 views
23

我想使用安全的Websockets來提高成功率。 我不需要加密。使用自簽名證書的安全websocket

我想在使用帶有自簽名證書的安全Websockets(wss://example.com)時看到警告嗎? 我用Chrome 10試過了,我沒有看到警告,也沒有要求我接受證書。它只是工作。

這是一個鉻的錯誤或預期的行爲? 我將來能否使用自簽名證書?

感謝

回答

14

沒錯,這就是Chrome瀏覽器的當前行爲,但我不希望它繼續在未來的政策。在firefox 4中(如果您在about:config中啓用WebSockets),您將收到關於證書的警告。要批准證書,您可能還必須在瀏覽器中輸入WebSockets URL(用https替換wss)並在那裏首先批准(因爲來自WebSockets連接的有關自簽名證書的警告可能不會讓您有機會批准它)。

我期望所有的瀏覽器都能收斂到正確的行爲,即拋出一個允許自簽名證書被批准的警告對話框。

+0

你知道,如果在未來的WebSockets草案提高了非安全的WebSockets的成功率的服務器? – pablo 2011-03-15 14:40:01

+0

可能不是。主要的變化是對數據進行組幀(基於長度而不是基於分隔符),並且從客戶端到服務器的數據不會被屏蔽以解決不正常的中間問題。端口80和443仍然是標準的WebSockets端口,握手仍然是類似HTTP的。你看到什麼問題導致WebSockets不能連接你? – kanaka 2011-03-15 15:40:39

+2

我指的是http://www.ietf.org/mail-archive/web/hybi/current/msg01605.html。它表示,80港口的成功率只有63%,而443港口的成功率爲95%。我也被迫使用端口443或8080,因爲我使用nginx作爲代理,並且它不支持HTTP 1.1。 443端口需要一個證書,這個證書會讓東西變得複雜,並且可能會帶來一點負擔我不確定有多少用戶端口8080被阻止。 – pablo 2011-03-15 20:36:01

11

自v19(http://crbug.com/53836)以來Chrome自我簽名證書被拒絕。如果您嘗試連接到使用自簽名證書的wss網址,則該請求將被無聲中止。
要允許使用自簽名證書,與--ignore-certificate-errors標誌,E,G Chrome啓動:

chromium --user-data-dir=/tmp/whatever --ignore-certificate-errors 

據我所知,有沒有辦法讓火狐接受WSS您的自簽名證書。因此,只需使用ws://即可在Firefox中進行測試。如果您正在測試通過HTTPS的Web應用程序,那麼你必須切換偏好允許(不安全)ws://的URL連接:

  1. 訪問about:config
  2. 設置network.websocket.allowInsecureFromHTTPStrue
+8

您可以使用的一個技巧是通過自簽名證書訪問與websocket端點具有相同地址/端口的HTTPS URL,當它拋出一個框時,您可以添加安全性異常。這個異常也將繼續爲WebSocket連接工作。許多WebSocket實現也可以提供HTTPS頁面。否則,通過apache或'openssl s_server'建立一個快速的HTTPS服務器就可以增加安全異常。這適用於所有主流瀏覽器,包括FireFox。 – zaphoyd 2014-04-14 11:45:58

+0

您節省了我的一天 - 謝謝! – 2015-10-20 15:23:34

7

我得到它的工作通過以下這一點:

https://github.com/einaros/ws/blob/master/test/WebSocketServer.test.js#L514

網絡首先生成自簽名的證書:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 100 -nodes 

然後由快遞應用程序中使用創建httpsServer節點的內置HTTPS服務器:

var privateKey = fs.readFileSync('sslcert/key.pem', 'utf8'); 
var certificate = fs.readFileSync('sslcert/cert.pem', 'utf8'); 

var credentials = {key: privateKey, cert: certificate}; 
var express = require('express'); 
var app = express(); 

//... bunch of other express stuff here ... 

//pass in your express app and credentials to create an https server 
var httpsServer = https.createServer(credentials, app); 
httpsServer.listen(8443); 

然後設置你的WebSocket服務器(諷刺的是,這將使用相同的端口作爲HTTP服務器,我不知道這一點,但我猜測協議可以共享端口? - 這讓我有一段時間)。

var WebSocketServer = require('ws').Server; 
var wss = new WebSocketServer({ 
    server: httpsServer 
    }); 

wss.on('connection', function connection(ws) { 
    ws.on('message', function incoming(message) { 
    console.log('received: %s', message); 
    }); 

    ws.send('something'); 
}); 

現在瀏覽到https://0.0.0.0:8443服務器並接受Chrome中的自簽名證書。然後,websockets現在應該在瀏覽器上工作。

打開Chrome devtools控制檯和類型:

var ws = new WebSocket('wss://0.0.0.0:8443'); 
ws.send('foo'); 

....或任何主持人:您用於httpsServer端口,這裏的關鍵是你使用wss://協議

在您的節點快遞網絡服務器,你應該看到一條消息記錄到控制檯。先從node ./server.js

http://www.chovy.com/web-development/self-signed-certs-with-secure-websockets-in-node-js/

+0

這可行,我錯過了這部分「現在瀏覽到https://0.0.0.0:8443服務器,並接受Chrome中的自簽名證書。」 – xliiv 2017-03-05 13:02:06