2016-05-13 57 views
1

這裏是我的服務器端:鉻,的NodeJS和HTTPS

var fs = require('fs'); 

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

var app = require('express')(); 
var http = require('https').Server(options, app); 
var io = require('socket.io')(http); 
var port = 1234; 

app.get('/', function(req, res){ 
    res.sendFile(__dirname + '/../subdomains/labs/socketio.html'); 
}); 

io.on('connection', function(socket){ 
    socket.on('chat message', function(msg){ 
    io.emit('chat message', msg); 
    }); 
}); 

http.listen(port, function(){ 
    console.log("\n\n--------------------------------"); 
    console.log('Currently Listening on port %d',port); 
    console.log("--------------------------------\n\n"); 
}); 

而我的客戶端:

<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> 
<script src="https://code.jquery.com/jquery-1.11.1.js"></script> 
<script> 
    var socket = io('https://labs.domain.com:1234'); 
    $('form').submit(function(){ 
     socket.emit('chat message', $('#chat-message').val()); 
     $('#chat-message').val(''); 
     return false; 
    }); 
    socket.on('chat message', function(msg){ 
     $('#messages').append($('<li>').text(msg)); 
    }); 
</script> 

一切工作正常在Internet Explorer(!AGH)但是,當使用它在Chrome它模具:

GET https://labs.domain.com:1234/socket.io/?EIO=3&transport=polling&t=1463123926844-3 net::ERR_INSECURE_RESPONSE 

如果我刪除它的HTTPS方面,它在兩個瀏覽器中都能正常工作。

這是相當令人沮喪的,因爲它似乎只與Chrome的問題,這是我使用最多的瀏覽器。我怎樣才能解決這個問題?

+0

請問[this](http://stackoverflow.com/a/25075349)有幫助嗎? – robertklep

+0

閱讀此:[無法加載資源:net :: ERR_INSECURE_RESPONSE](http://stackoverflow.com/questions/23688565/failed-to-load-resource-neterr-insecure-response)。 – jfriend00

+0

@robertklep:不,因爲當我執行新選項卡位時,我無法解決問題。它只是說'繼續',然後我得到相同的頁面。但即便如此,我還需要能夠通過SSL使用NodeJS,而不會讓我的用戶經歷一堆廢話。 – Chud37

回答

2

我在使用Chrome的時候遇到了問題,如果證書有任何問題,就不允許安全的websocket連接。通過使用通過LetsEncrypt獲得的證書,我可以在這裏使用我們的應用程序來運行socket.io。我並不是說這是做到這一點的唯一方式,但這裏是我們的(工作)配置設置方式:

1 - 我和我的隊友都有動態DNS設置來指向我們的每個開發機器(例如:mac.example.com)

2 - 我們每個都有爲我們的域(例如mac.example.com)設置的證書,從LetsEncrypt獲得;原因是Chrome對設置WebSockets時使用的證書超級挑剔,而且開發人員或最終用戶無法(當前)覆蓋並接受不太安全/自簽名的證書。

3 - 我們的代碼,在我們的Node.js應用程序配置socket.io樣子:

const server = https.createServer(/* ssl options: cert etc. */, myExpressApp) 
const io = require('socket.io')(server) 

我們使用socket.io v1.4.6

這聽起來像是從你的問題的問題證書是在你的服務器上設置的,但是Chrome仍然抱怨他們。這可能是罪魁禍首,聽起來你可能沒有系統管理員權限來更改它?

TL; DR請勿使用Chrome可能認爲「不太安全」的自簽名證書或證書。