নোড.জেএস, এসএসএল সহ সকেট.আইও


163

আমি চেষ্টা করছি সকেট.ইও আমার এসএসএল শংসাপত্রের সাথে চলমান, এটি সংযুক্ত হবে না।

আমি আমার কোডটি আড্ডার উদাহরণ থেকে বন্ধ করে দিয়েছি:

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

যদি আমি এসএসএল কোডটি সরিয়ে ফেলি তবে এটি ঠিকঠাক হয়, তবে এটির সাথেই আমি একটি অনুরোধ পেয়েছি http://domain.com/sket.io/1/?t=1309967919512

নোট করুন এটি https চেষ্টা করছে না, যার ফলে এটি ব্যর্থ হয়।

আমি ক্রোম পরীক্ষা করছি, যেহেতু এটি এই অ্যাপ্লিকেশনটির জন্য লক্ষ্য ব্রাউজার।

আমি ক্ষমা চাইছি যদি এটি একটি সহজ প্রশ্ন, আমি নোড / সকেট.ইও নবাগত।

ধন্যবাদ!


আপনার ক্লায়েন্ট কি একটি 'ডাব্লুএসএস: //' প্রিফিক্সড ইউআরআইতে সংযোগ দেওয়ার চেষ্টা করছেন?
কানাকা

না, এটি সেখানে পৌঁছায় না, এটি ডোমেন . com/sket.io/1/?t=1309967919512 এ অনুরোধ করে তারপরে মারা যায়।
বাইরে

আপনি কীভাবে সংযোগের জন্য ঠিকানাটি নির্দিষ্ট করছেন? "ডোমেইন ডট কম" সকেট.আইও ক্লায়েন্ট-সাইড লাইব্রেরিতে স্থানধারকের মতো শোনাচ্ছে। আপনি কি আপনার ক্লায়েন্ট জাভাস্ক্রিপ্ট কোডটি পোস্ট করতে পারেন যা আপনি সংযোগ করতে ব্যবহার করছেন?
কানাকা

1
প্রকল্পের GitHub হয়: github.com/BCCasino/BCCasino
বিয়ন্ড

মূলত এটির নোড.জেএসকে সকেট.ইও ম্যাজিকালি ক্লায়েন্টের সাইড স্টাফগুলি পরিচালনা করে, আপনি যা কিছু করেন তা সকেট-কানেক্ট করুন
বাইরে

উত্তর:


186

আপনার প্রাথমিক সংযোগের জন্য একটি সুরক্ষিত ইউআরএল ব্যবহার করুন, যেমন "HTTP: //" এর পরিবর্তে "https: //" ব্যবহার করুন। যদি ওয়েবসকেট ট্রান্সপোর্টটি বেছে নেওয়া হয়, তবে সকেট.আইওর কাছে স্বয়ংক্রিয়ভাবে ওয়েবস্কট সংযোগের জন্য "wss: //" (এসএসএল) ব্যবহার করা উচিত।

আপডেট :

আপনি 'সুরক্ষিত' বিকল্পটি ব্যবহার করে সংযোগ তৈরি করার চেষ্টা করতে পারেন:

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

আমরা এটা করি। আমরা গেছি https: // www.thebitcoinwheel.com এবং এটি এখনও স্বয়ংক্রিয়ভাবে HTTP- র কাছে একটি অনুরোধ জানায়, এটি সকেট.আইও কোড সহ কিছু এবং প্রশ্নটির মূল বিষয়।
বাইরে

1
তোমরা আমার জীবন বাঁচিয়েছ! ডকুমেন্টেশনে আমি এই বিকল্পগুলি খুঁজে পাইনি।
পাওলো সিজার

14
{secure: true}আপনি url এ 'https' নির্দিষ্ট করে থাকলে প্রয়োজন হবে না। এখানে সকেট.ইও ক্লায়েন্ট উত্স secure: 'https' == uri.protocol(সংস্করণ 0.9.16) এর একটি উদ্ধৃতি দেওয়া আছে , এটি ইউআরএলে https সনাক্ত করা থাকলে এটি সত্যে সুরক্ষিত বিকল্প সেট করে।
জিয়াওচুয়ান ইউ

4
আমি এটি একটি https ইউআরএল দিয়ে চেষ্টা করেছি এবং সত্যই {secure: true}সঠিকভাবে কাজ করার প্রয়োজন ছিল না।
ডি কোয়েজি

4
আমি বিশ্বাস করি যে এই সংযোগটি সুরক্ষিত উভয়ই ব্যবহার করে সুরক্ষিত: এটা নিশ্চিত করে বুদ্ধিমানের কাজ হবে সত্য এবং ক্লায়েন্টের পক্ষ থেকে একটি https url জারি করে। আপনি যা জানবেন না কেন এটি কোনও নিরাপদ সংযোগ হবে।
গাবিও

53

এইভাবে আমি এক্সপ্রেস সহ এটি সেট আপ করতে সক্ষম হয়েছি:

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

2
এটি আমার জন্য কাজ করা একমাত্র সমাধান। আমার সময় বাঁচানোর জন্য ধন্যবাদ।
ফ্রান্সিসকো হজ


3
এই সমাধানটি আমার জন্য নিখুঁতভাবে কাজ করেছে, ধন্যবাদ। আপনি যদি letsencrypt.org থেকে বিনামূল্যে শংসাপত্রগুলি ব্যবহার করছেন তবে নীচের কোডটি ব্যবহার করতে পারেন .. var server = https.createServer({ key: fs.readFileSync('/etc/letsencrypt/live/domain.name/privkey.pem'), cert: fs.readFileSync('/etc/letsencrypt/live/domain.name/cert.pem'), ca: fs.readFileSync('/etc/letsencrypt/live/domain.name/chain.pem'), requestCert: false, rejectUnauthorized: false },app); server.listen(3000);
হুগো রুন

2
এই উত্তরের জন্য অনেক ধন্যবাদ। এটা আমার জন্য প্রচুর সাহায্য হয়েছে।
হর্ষ জাস্তি

2
ধন্যবাদ, লেটসনক্রিপ্ট এবং .pem ফাইলগুলির সাথে একটি মোহন এর মতো কাজ করেছেন
এরিক

33

একই নোটে, যদি আপনার সার্ভার উভয়কে সমর্থন করে httpএবং httpsআপনি এটি ব্যবহার করে সংযোগ করতে পারেন:

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

থেকে স্বয়ংক্রিয় ব্রাউজার স্কিম সনাক্ত এবং HTTP / HTTPS তদনুসারে ব্যবহার সংযোগ। https এ থাকাকালীন ট্রান্সপোর্টটি ডিফল্টরূপে সুরক্ষিত হবে, যেমন ব্যবহার করে সংযোগ স্থাপন করা

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

সুরক্ষিত ওয়েব সকেট ব্যবহার করবে - wss://(এটি {secure: true}নিরর্থক)।

একই নোড সার্ভার ব্যবহার করে কীভাবে সহজেই HTTP এবং https উভয়কে পরিবেশন করা যায় সে সম্পর্কে আরও তথ্যের জন্য এই উত্তরটি দেখুন


10

যদি আপনার সার্ভারের শংসাপত্রিত ফাইলটি বিশ্বাসযোগ্য না হয়, (উদাহরণস্বরূপ, আপনি জাভাতে কীটল কমান্ড দিয়ে নিজেই কীস্টোরটি তৈরি করতে পারেন ), আপনাকে অতিরিক্ত বিকল্পটি যুক্ত করা উচিত অস্বীকৃত

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

2

সার্ভার-সাইড:

import http from 'http';
import https from 'https';
import SocketIO, { Socket } from 'socket.io';
import fs from 'fs';
import path from 'path';

import { logger } from '../../utils';

const port: number = 3001;

const server: https.Server = https.createServer(
  {
    cert: fs.readFileSync(path.resolve(__dirname, '../../../ssl/cert.pem')),
    key: fs.readFileSync(path.resolve(__dirname, '../../../ssl/key.pem'))
  },
  (req: http.IncomingMessage, res: http.ServerResponse) => {
    logger.info(`request.url: ${req.url}`);

    let filePath = '.' + req.url;
    if (filePath === './') {
      filePath = path.resolve(__dirname, './index.html');
    }

    const extname = String(path.extname(filePath)).toLowerCase();
    const mimeTypes = {
      '.html': 'text/html',
      '.js': 'text/javascript',
      '.json': 'application/json'
    };

    const contentType = mimeTypes[extname] || 'application/octet-stream';

    fs.readFile(filePath, (error: NodeJS.ErrnoException, content: Buffer) => {
      if (error) {
        res.writeHead(500);
        return res.end(error.message);
      }
      res.writeHead(200, { 'Content-Type': contentType });
      res.end(content, 'utf-8');
    });
  }
);

const io: SocketIO.Server = SocketIO(server);

io.on('connection', (socket: Socket) => {
  socket.emit('news', { hello: 'world' });
  socket.on('updateTemplate', data => {
    logger.info(data);
    socket.emit('updateTemplate', { random: data });
  });
});

server.listen(port, () => {
  logger.info(`Https server is listening on https://localhost:${port}`);
});

মক্কেলের পক্ষে:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Websocket Secure Connection</title>
</head>

<body>
  <div>
    <button id='btn'>Send Message</button>
    <ul id='messages'></ul>
  </div>
  <script src='../../../node_modules/socket.io-client/dist/socket.io.js'></script>
  <script>
    window.onload = function onload() {
      const socket = io('https://localhost:3001');
      socket.on('news', function (data) {
        console.log(data);
      });

      socket.on('updateTemplate', function onUpdateTemplate(data) {
        console.log(data)
        createMessage(JSON.stringify(data));
      });
      const $btn = document.getElementById('btn');
      const $messages = document.getElementById('messages');

      function sendMessage() {
        socket.emit('updateTemplate', Math.random());
      }

      function createMessage(msg) {
        const $li = document.createElement('li');
        $li.textContent = msg;
        $messages.appendChild($li);
      }

      $btn.addEventListener('click', sendMessage);
    }
  </script>
</body>

</html>

2

আপনার প্রয়োজনের উপর নির্ভর করে আপনি উভয় সুরক্ষিত এবং অনিরাপদ সংযোগের অনুমতি দিতে পারেন এবং এখনও কেবল একটি Socket.io উদাহরণ ব্যবহার করতে পারেন।

আপনাকে কেবল দুটি সার্ভার ইনস্ট্যান্ট করতে হবে, একটি HTTP এর জন্য এবং একটি HTTPS এর জন্য, তারপরে সেই সার্ভারগুলি Socket.io উদাহরণের সাথে সংযুক্ত করতে হবে।

সার্ভারের দিক:

// needed to read certificates from disk
const fs          = require( "fs"    );

// Servers with and without SSL
const http        = require( "http"  )
const https       = require( "https" );
const httpPort    = 3333;
const httpsPort   = 3334;
const httpServer  = http.createServer();
const httpsServer = https.createServer({
    "key" : fs.readFileSync( "yourcert.key" ),
    "cert": fs.readFileSync( "yourcert.crt" ),
    "ca"  : fs.readFileSync( "yourca.crt"   )
});
httpServer.listen( httpPort, function() {
    console.log(  `Listening HTTP on ${httpPort}` );
});
httpsServer.listen( httpsPort, function() {
    console.log(  `Listening HTTPS on ${httpsPort}` );
});

// Socket.io
const ioServer = require( "socket.io" );
const io       = new ioServer();
io.attach( httpServer );
io.attach( httpsServer );

io.on( "connection", function( socket ) {

    console.log( "user connected" );
    // ... your code

});

মক্কেলের পক্ষে :

var url    = "//example.com:" + ( window.location.protocol == "https:" ? "3334" : "3333" );
var socket = io( url, {
    // set to false only if you use self-signed certificate !
    "rejectUnauthorized": true
});
socket.on( "connect", function( e ) {
    console.log( "connect", e );
});

যদি আপনার নোডজেএস সার্ভারটি আপনার ওয়েব সার্ভার থেকে আলাদা হয় তবে আপনাকে সম্ভবত কিছু সিওআরএস শিরোনাম সেট করতে হবে। সার্ভারের দিক থেকে, প্রতিস্থাপন করুন:

httpServer.listen( httpPort, function() {
    console.log(  `Listening HTTP on ${httpPort}` );
});
httpsServer.listen( httpsPort, function() {
    console.log(  `Listening HTTPS on ${httpsPort}` );
});

সঙ্গে:

const httpServer  = http.createServer( (req, res) => {
    res.setHeader( "Access-Control-Allow-Origin"  , "*" );
    res.setHeader( "Access-Control-Request-Method", "*" );
    res.setHeader( "Access-Control-Allow-Methods" , "*" );
    res.setHeader( "Access-Control-Allow-Headers" , "*" );
    if ( req.method === "OPTIONS" ) {
        res.writeHead(200);
        res.end();
        return;
    }
});
const httpsServer = https.createServer({
        "key" : fs.readFileSync( "yourcert.key" ),
        "cert": fs.readFileSync( "yourcert.crt" )
    }, (req, res) => {
    res.setHeader( "Access-Control-Allow-Origin"  , "*" );
    res.setHeader( "Access-Control-Request-Method", "*" );
    res.setHeader( "Access-Control-Allow-Methods" , "*" );
    res.setHeader( "Access-Control-Allow-Headers" , "*" );
    if ( req.method === "OPTIONS" ) {
        res.writeHead(200);
        res.end();
        return;
    }
});

এবং অবশ্যই আপনার প্রয়োজন অনুসারে শিরোনামগুলির মানগুলি সামঞ্জস্য করুন।


1

এন্টারপ্রাইজ অ্যাপ্লিকেশনগুলির জন্য এটি লক্ষ্য করা উচিত যে আপনি আপনার কোডে https পরিচালনা করছেন না। এটি আইআইএস বা এনজিনেক্সের মাধ্যমে স্বয়ংক্রিয়ভাবে আপগ্রেড করা উচিত। অ্যাপ্লিকেশনটি কী প্রোটোকল ব্যবহার করা হয় তা সম্পর্কে জানা উচিত নয়।


0

এটি আমার এনগিনেক্স কনফিগারেশন ফাইল এবং আইওসকেট কোড। সার্ভার (এক্সপ্রেস) 9191 পোর্টে শুনছে It এটি ভালভাবে কাজ করে: nginx কনফিগারেশন ফাইল:

server {
    listen       443 ssl;
    server_name  localhost;
    root   /usr/share/nginx/html/rdist;

    location /user/ {
        proxy_pass   http://localhost:9191;
    }
    location /api/ {
        proxy_pass   http://localhost:9191;
    }
    location /auth/ {
        proxy_pass   http://localhost:9191;
    }

    location / {
        index  index.html index.htm;
        if (!-e $request_filename){
          rewrite ^(.*)$ /index.html break;
        }
    }
    location /socket.io/ {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass   http://localhost:9191/socket.io/;
    }


    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    ssl_certificate /etc/nginx/conf.d/sslcert/xxx.pem;
    ssl_certificate_key /etc/nginx/conf.d/sslcert/xxx.key;

}

সার্ভার:

const server = require('http').Server(app)
const io = require('socket.io')(server)
io.on('connection', (socket) => {
    handleUserConnect(socket)

  socket.on("disconnect", () => {
   handleUserDisConnect(socket)
  });
})

server.listen(9191, function () {
  console.log('Server listening on port 9191')
})

ক্লায়েন্ট (প্রতিক্রিয়া):

    const socket = io.connect('', { secure: true, query: `userId=${this.props.user._id}` })

        socket.on('notifications', data => {
            console.log('Get messages from back end:', data)
            this.props.mergeNotifications(data)
        })
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.