2011-07-06 34 views
123

SSL証明書でsocket.ioを実行しようとしていますが、接続できません。node.js、socket.io with SSL

私はベースのチャットたとえばオフ私のコード:私は、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://」に接続しようとしていますか? – 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)を使用する必要があります。

更新

あなたはまた、「安全な」オプションを使用して接続を作成してみてくださいすることができます

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

我々はこれを行う。私たちはhttps://www.thebitcoinwheel.comに行きますが、それでも自動的にhttpにリクエストします。これはsocket.ioコードのものであり、質問のポイントです。 – Beyond

+8

安全:本当ですか、ありがとう! – Beyond

+1

あなたたちは私の人生を救った!私はドキュメント上でこれらのオプションを見つけることができませんでした。 –

25

同じ了承の上、ごサーバがhttphttpsの両方をサポートしている場合は、使用して接続することができます:

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

暗号化を使用することができます(たとえば、あなたはJavaでのkeytoolコマンドを使用して自分でキーストアを生成する場合があります)追加のオプションrejectUnauthorizedを追加する必要があります。

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

これをチェックしてください。設定..

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