5

SSL接続を介してsocket.ioを使用してサーバー間リンクをセットアップしようとしています。これは私の例です:

/**
 * Server
 */


var app = require('express')();
var config = require('./config');
var https = require('https');
var http = require('http');
var fs = require('fs');
var server = https.createServer({key: fs.readFileSync(config.ssl.key), cert: fs.readFileSync(config.ssl.cert), passphrase: config.ssl.passphrase}, app);
//var server = http.createServer(app);
var io = require('socket.io').listen(server);

server.listen(config.port);

app.get('/', function (req, res) {
    res.send('Server');
  //res.sendfile(__dirname + '/index.html');
});

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});



/**
 * Client
 */


var io = require('socket.io-client');
//var socket = io.connect('http://localhost', {port: 8088});
var socket = io.connect('https://localhost', {secure: true, port: 8088});
  socket.on('connect', function(){
    socket.on('event', function(data){});
    socket.on('disconnect', function(){});
  });

SSL なしで実行すると、コードは正常に動作します。自己署名証明書が受け入れられていないのではないかと思いますが、クライアントに受け入れさせる方法がわかりません。

自己署名 SSL 証明書を受け入れることはできますか、それとも別の方法がありますか?

4

4 に答える 4

15

これを機能させるには、socket.io にその Agent も使用するように手動で指示することによって、クライアントで少し異なることを行う必要がありました (そして、secure: trueによって暗示されhttps:ます)。ここにあります:

// Client
var io = require('socket.io-client');
var https = require('https');
https.globalAgent.options.rejectUnauthorized = false;
var socket = io.connect('https://localhost:3210/', { agent: https.globalAgent });
socket.on('connect', function(){ console.log('connected'); });

これは socket.io v1.0.2 を使用しています。

または、ここで指摘されているように、次の方法でも成功しました: Socket.io + SSL + 自己署名 CA 証明書で接続時にエラーが発生する

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
var io = require('socket.io-client');
var socket = io.connect('https://localhost:3210/');
socket.on('connect', function(){ console.log('connected'); });
于 2014-06-16T00:51:56.957 に答える
9

さらに検索した後、これをクライアントに追加すると機能します。

require('https').globalAgent.options.rejectUnauthorized = false;

/**
 * Client
 */


var io = require('socket.io-client');
//var socket = io.connect('http://localhost', {port: 8088});

require('https').globalAgent.options.rejectUnauthorized = false; 

var socket = io.connect('https://localhost', {secure: true, port: 8088});
  socket.on('connect', function(){
    socket.on('event', function(data){});
    socket.on('disconnect', function(){});
  });
于 2014-02-08T20:24:27.743 に答える
5

以前の答えは私にとってはうまくいきませんでした。require('https').globalAgentは常にundefined

いくつかの検索rejectUnauthorizedを行い、ドキュメント ( https://nodejs.org/api/tls.html ) でパラメーターを見つけました。SocketIO に関連しているかどうかはわかりませんが、自己署名証明書で動作するようです:

var socket = io.connect('//yourhost:8000', {secure: true, rejectUnauthorized: false})

secure: trueオプションかもしれませんが、とにかくそれを強制するのが好きです。

于 2016-04-29T09:34:15.030 に答える