2016-09-22 119 views
11

我有一個使用websockets的工作聊天應用程序。我想更進一步,並在我的連接上啓用加密,但是當我使用https連接http服務器時,我的連接開始失敗。WebSocket服務器不支持SSL

我已經生成了我在我所有網站上使用的自簽名證書(在同一頂級域名下,這意味着它是通配證書)。我可以確認它是一個有效的證書,所以問題不應該在那裏。

這是什麼工作(未加密)

var webSocketServer = require('websocket').server; 
var http = require('http'); 

var server = http.createServer(function() {}); 
server.listen(webSocketsServerPort, function() { 
    log("system", "Server is listening on port " + webSocketsServerPort); 
}); 

var wsServer = new webSocketServer({ 
    httpServer: server 
}); 

使用這個我現在可以連接到ws://my.domain:port

這是什麼呢工作

var webSocketServer = require('websocket').server; 
var http = require('https'); 
var fs = require('fs'); 

var server = http.createServer({ 
    key: fs.readFileSync("path/to/host.key"), 
    cert: fs.readFileSync("path/to/host.pem") 
}); 
server.listen(webSocketsServerPort, function() { 
    log("system", "Server is listening on port " + webSocketsServerPort); 
}); 

var wsServer = new webSocketServer({ 
    httpServer: server 
}); 

有了這個代碼在服務器啓動,以及,我看到日誌消息「服務器正在監聽。」但是當我嘗試在wss://my.domain:port連接連接無法建立。

我在瀏覽器中爲證書添加了一個異常,因爲我的客戶端頁面和websocket服務器地址在同一個tld和子域下。

可能是什麼問題?

+0

防火牆問題? –

回答

0

糟糕的做法加上不良的日誌習慣是導致問題的原因。

在打開一個新的連接時,執行了一個檢查來驗證在那裏硬編碼爲http://的請求的來源,並且由於我從安全頁面(https://)請求該檢查不再通過並且連接不可能。

4

僅將您希望連接到websocket的站點添加爲例外是不夠的。轉到站點https://my.domain:port(websocket地址)並將該位置添加爲例外。 (這當然是Firefox的必要步驟)

或者,您可以將證書導入到證書管理器中,導入單位

編輯:我可以告訴你什麼對我有用。

> openssl genrsa -out key.pem 
> openssl req -new -key key.pem -out csr.pem 
> openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem 

https://localhost:8000設定通用名爲localhost

main.js

var https = require('https'); 
var ws = require('websocket').server; 
var fs = require('fs'); 

var options = { 
    key:fs.readFileSync('key.pem'), 
    cert:fs.readFileSync('cert.pem') 
}; 

var server = https.createServer(options, 
    function(req,res){res.writeHeader(200);res.end();}); 
server.listen(8000); 
var wss = new ws({httpServer:server}); 

wss.on('request',function(req){ 
    req.on('requestAccepted',function(conn){ 
     conn.on('message',function(msg){ 
      conn.send(msg.utf8Data + " received"); 
     }); 
    }) 
    req.accept(null,req.origin); 
}); 

然後在瀏覽器(Firefox)(加入證書作爲例外)

var ws = new WebSocket('wss://localhost:8000/') 
ws.onmessage = function(msg){console.log(msg.data)} 
ws.send("test") 

和接收test received

+0

我最近從letsencrypt獲得了可信證書,並且可以在我的節點http和ws服務器正在偵聽的'https://my.domain:port'連接,但連接仍然失敗。 –

+0

@php_nub_qq錯誤信息說什麼? – Adam

+0

連接在Chrome中被拒絕,連接無法在Firefox中建立。 –