簡體   English   中英

如何使用Express / Socket.io在Node.js上使用HTTPS

[英]How to use HTTPS on Node.js using Express/Socket.io

我試圖用https運行我的節點服務器。 我正在使用express和socket.io。

這是我的https代碼:

var httpsPort = 443;
var privateKey = fs.readFileSync(mykeypath');
var certificate = fs.readFileSync(mycertificatepath');
var credentials = {key: privateKey, cert: certificate};
var https = require('https').Server(credentials,app);
var io = require('socket.io')(https);

https.listen(httpsPort, function(){
logger.info('listening on *:' + httpsPort);
});


app.get('/initGame', function (req,res){

var slots = require('./slots.json', 'utf8');
var userObject = {
    address : req.connection.remoteAddress,
    userAgent : req.headers['user-agent']
};
db.getPlayedGames(userObject,function(playedGames){
    logger.debug(playedGames);
    if(typeof playedGames == 'undefined' ){
        playedGames=0;
    }else{
        playedGames = playedGames.games_played;
    }
    var spinsLeft = 10-playedGames;
    res.json({
        spinsLeft: spinsLeft,
        slots: slots
    });
  });
});

在我的客戶端上它的以下內容:

var myServer = "//" + document.domain + ":443";

$.get( myServer + "/initGame", function(data) {
    totalSpinsLeft = data.spinsLeft;
    $('#trysLeft').text(totalSpinsLeft);
    Seven.init(data.slots);
}).fail(function(){
    setTimeout(function(){
        $('#spinner2').text('Fehler bitte neu laden!');
    },3000);

});

現在我在我的服務器上獲得以下異常:

uncaughtException:缺少PFX或證書+私鑰。

編輯:現在我得到

錯誤的請求

您的瀏覽器發送了此服務器無法理解的請求。 原因:您正在向支持SSL的服務器端口說明HTTP。 請使用HTTPS方案訪問此URL。

沒有你的密鑰和證書文件很難測試你的例子,而是我將提供一個我使用Express,socket.io和https的例子。

首先,我將創建密鑰和證書文件,因此在目錄中運行終端的以下命令:

它下面的命令將生成一個包含RSA密鑰的文件。

$ openssl genrsa 1024 > file.pem

在這里,您將被要求輸入數據,但您可以留空,按Enter鍵直到生成crs.pem。

$ openssl req -new -key file.pem -out csr.pem

然后將創建包含SSL證書的file.crt文件。

$ openssl x509 -req -days 365 -in csr.pem -signkey file.pem -out file.crt

所以在我的app.js文件中,我正在設置並啟動服務器,注意我正在使用上一步生成的文件file.pemfile.crt

var fs = require('fs');
var https = require('https');

var express = require('express');
var app = express();

var options = {
  key: fs.readFileSync('./file.pem'),
  cert: fs.readFileSync('./file.crt')
};
var serverPort = 443;

var server = https.createServer(options, app);
var io = require('socket.io')(server);

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/index.html');
});

io.on('connection', function(socket) {
  console.log('new connection');
  socket.emit('message', 'This is a message from the dark side.');
});

server.listen(serverPort, function() {
  console.log('server up and running at %s port', serverPort);
});

然后我使用服務器的public/index.html

<!doctype html>
<html>

  <head>

  </head>
  <body>
    <h1>I am alive!!</h1>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.js"></script>

    <script>
      var URL_SERVER = 'https://localhost:443';
      var socket = io.connect(URL_SERVER);

      socket.on('message', function(data) {
        alert(data);
      });
    </script>
  </body>

</html>

最后,如果您從https://localhost的瀏覽器訪問,您將看到一條警報,其中包含來自websocket服務器的消息。

這就是我設法用express來設置的方法:

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

我希望這能節省一些人的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM