2011-07-06 42 views
123

Tôi đang cố gắng để socket.io chạy với chứng chỉ SSL của mình tuy nhiên, nó sẽ không kết nối.node.js, socket.io với SSL

tôi dựa mã của tôi ra khỏi ví dụ chat:

var https = require('https'); 
var fs = require('fs'); 
/** 
* Bootstrap app. 
*/ 
var sys = require('sys') 
require.paths.unshift(__dirname + '/../../lib/'); 

/** 
* Module dependencies. 
*/ 

var express = require('express') 
    , stylus = require('stylus') 
    , nib = require('nib') 
    , sio = require('socket.io'); 

/** 
* App. 
*/ 
var privateKey = fs.readFileSync('../key').toString(); 
var certificate = fs.readFileSync('../crt').toString(); 
var ca = fs.readFileSync('../intermediate.crt').toString(); 

var app = express.createServer({key:privateKey,cert:certificate,ca:ca }); 


/** 
* App configuration. 
*/ 

... 

/** 
* App routes. 
*/ 

app.get('/', function (req, res) { 
    res.render('index', { layout: false }); 
}); 

/** 
* App listen. 
*/ 

app.listen(443, function() { 
    var addr = app.address(); 
    console.log(' app listening on http://' + addr.address + ':' + addr.port); 
}); 

/** 
* Socket.IO server (single process only) 
*/ 

var io = sio.listen(app,{key:privateKey,cert:certificate,ca:ca}); 
... 

Nếu tôi loại bỏ mã SSL nó chạy tốt, tuy nhiên với nó tôi nhận được một yêu cầu đến http://domain.com/socket.io/1/?t=1309967919512

Lưu ý nó không cố gắng https, mà làm cho nó thất bại.

Tôi đang thử nghiệm trên chrome vì đây là trình duyệt mục tiêu cho ứng dụng này.

Tôi xin lỗi nếu đây là một câu hỏi đơn giản, tôi là một newbie node/socket.io.

Cảm ơn!

+0

Ứng dụng khách của bạn có đang cố gắng kết nối với URI có 'wss: //' hay không. – kanaka

+0

nope nó không nhận được ở đó, nó làm cho các yêu cầu để http://domain.com/socket.io/1/?t=1309967919512 sau đó chết. – Beyond

+0

Bạn chỉ định địa chỉ để kết nối như thế nào? "domain.com" giống như một trình giữ chỗ trong thư viện phía máy khách socket.io. Bạn có thể đăng mã Javascript của khách hàng mà bạn đang sử dụng để kết nối không? – kanaka

Trả lời

150

Sử dụng URL bảo mật cho kết nối ban đầu của bạn, tức là thay vì "http: //" sử dụng "https: //". Nếu vận chuyển WebSocket được chọn, thì Socket.IO sẽ tự động sử dụng "wss: //" (SSL) cho kết nối WebSocket.

Cập nhật:

Bạn cũng có thể thử tạo kết nối bằng cách sử dụng tùy chọn 'bảo vệ':

var socket = io.connect('https://localhost', {secure: true}); 
+0

chúng tôi thực hiện việc này. chúng tôi goto https: // www.thebitcoinwheel.com và nó vẫn yêu cầu http tự động, đây là một cái gì đó với mã socket.io và là điểm của câu hỏi. – Beyond

+8

bảo mật: thực sự đã làm điều đó, cảm ơn kanaka! – Beyond

+1

Các bạn đã cứu mạng tôi! Tôi không thể tìm thấy các tùy chọn đó trong tài liệu. –

25

Cùng lưu ý, nếu máy chủ của bạn hỗ trợ cả httphttps bạn có thể kết nối sử dụng :

var socket = io.connect('//localhost'); 

đến auto detect the browser scheme và kết nối sử dụng htt p/https tương ứng. khi trong https, việc vận chuyển sẽ được bảo đảm theo mặc định, như kết nối sử dụng

var socket = io.connect('https://localhost'); 

sẽ sử dụng cổng web an toàn - wss:// (các {secure: true} là không cần thiết).

để biết thêm thông tin về cách phân phối cả http và https dễ dàng bằng cách sử dụng cùng một máy chủ nút, hãy kiểm tra this answer.

23

Đây là cách tôi quản lý để thiết lập nó với tốc:

var fs = require('fs'); 
var app = require('express')(); 
var https  = require('https'); 
var server = https.createServer({ 
    key: fs.readFileSync('./test_key.key'), 
    cert: fs.readFileSync('./test_cert.crt'), 
    ca: fs.readFileSync('./test_ca.crt'), 
    requestCert: false, 
    rejectUnauthorized: false 
},app); 
server.listen(8080); 

var io = require('socket.io').listen(server); 

io.sockets.on('connection',function (socket) { 
    ... 
}); 

app.get("/", function(request, response){ 
    ... 
}) 


Tôi hy vọng rằng điều này sẽ tiết kiệm thời gian của một ai đó.

Cập nhật: cho những người sử dụng cho phép sử dụng mã hóa

var server = https.createServer({ 
       key: fs.readFileSync('privkey.pem'), 
       cert: fs.readFileSync('fullchain.pem') 
      },app); 
+1

Đây là giải pháp duy nhất có hiệu quả đối với tôi. Cảm ơn vì đã tiết kiệm thời gian của tôi. –

+0

làm việc tốt cho tôi sau một chút thử nghiệm và lỗi với certs – RozzA

+0

đây là một giải pháp tốt cho tôi –

4

Nếu máy chủ của bạn cấp giấy chứng nhận tập tin này là không đáng tin cậy, (ví dụ, bạn có thể tạo ra các keystore của mình với keytool lệnh trong java) , bạn nên thêm tùy chọn bổ sung từ chốiUnauthorized

var socket = io.connect('https://localhost', {rejectUnauthorized: false}); 
4

kiểm tra this.configuration ..

app = module.exports = express(); 
var httpsOptions = { key: fs.readFileSync('certificates/server.key'), cert: fs.readFileSync('certificates/final.crt') };   
var secureServer = require('https').createServer(httpsOptions, app); 
io = module.exports = require('socket.io').listen(secureServer,{pingTimeout: 7000, pingInterval: 10000}); 
io.set("transports", ["xhr-polling","websocket","polling", "htmlfile"]); 
secureServer.listen(3000); 
Các vấn đề liên quan