2011-07-06 10 views
123

SSL 인증서를 사용하여 socket.io를 실행하려고하는데 연결되지 않습니다.node.js, socket.io with

나는 기반 채팅 예를 꺼 내 코드 : 나는 SSL 코드를 제거하는 경우는 잘 실행

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}); 
... 

, 그러나 그것으로 나는, 그것은 HTTPS를 시도 아니에요 http://domain.com/socket.io/1/?t=1309967919512

주에 요청을 얻을 수있는 실패하게 만듭니다.

나는이 응용 프로그램의 대상 브라우저이기 때문에 크롬을 테스트 중입니다.

이것이 간단한 질문 인 경우 사과드립니다, 저는 node/socket.io 초보자입니다.

감사합니다.

+0

클라이언트가 'wss : //'접두어로 된 URI에 연결하려고합니까? – kanaka

+0

아니, 거기에 도착하지 않으면 http://domain.com/socket.io/1/?t=1309967919512 요청이 생성됩니다. – Beyond

+0

연결할 주소를 어떻게 지정하고 있습니까? "domain.com"은 socket.io 클라이언트 측 라이브러리의 자리 표시 자처럼 들립니다. 연결하는 데 사용하는 클라이언트 Javascript 코드를 게시 할 수 있습니까? – kanaka

답변

150

"http : //"대신 "https : //"를 사용하여 초기 연결에 보안 URL을 사용하십시오. WebSocket 전송이 선택되면 Socket.IO는 WebSocket 연결에도 "wss : //"(SSL)을 자동으로 사용해야합니다.

업데이트 :

또한 '보호'옵션을 사용하여 연결을 만드는 시도 할 수 있습니다 : 서버가 모두 http을 지원하는 경우 https 사용 연결할 수 같은 음에

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

우리는 이것을한다. 우리는 https : //www.thebitcoinwheel.com을 방문하고 여전히 http를 자동으로 요청합니다. 이것은 socket.io 코드와 관련이 있으며 질문의 요점입니다. – Beyond

+8

secure : 사실, 감사합니다. kanaka! – Beyond

+1

너희들이 내 목숨을 구했어! 문서에서 이러한 옵션을 찾을 수 없습니다. –

25

을, :

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

-auto detect the browser scheme p/https. HTTPS에, 전송은 보안 웹 소켓을 사용합니다

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

를 사용하여 연결로, 기본적으로 확보 될 때 - wss://을합니다 ({secure: true}는 중복).

같은 노드 서버를 사용하여 쉽게 http와 https를 모두 제공하는 방법에 대한 자세한 내용은 this answer을 참조하십시오.

23

이것은 내가 명시 적으로 설정하는 관리 방법입니다 :이 사람의 시간을 절약 할 수 있기를 바랍니다

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){ 
    ... 
}) 


.

는 업데이트 : 사용하는 사람들을 위해

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

이것은 나를 위해 일한 유일한 해결책입니다. 내 시간을 절약 해 주셔서 감사합니다. –

+0

은 시행 착오를 거친 후에 나를 위해 잘 작동했습니다 – RozzA

+0

이것은 저에게 좋은 해결책입니다 –

4

서버가 인증하면 파일이 신뢰할 수없는 암호화 사용 (예를 들어, 당신은 키 도구 자바 명령으로 스스로 키 스토어를 생성 할 수있다)을 할 수 있습니다 추가 옵션 rejectUnauthorized를 추가해야합니다.

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

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); 
관련 문제