2017-03-07 8 views
1

Ich habe ein Problem bei der Konfiguration von nginx und node, um socket.io über SSL zu unterstützen.nginx, node.js + socket.io mit SSL

Meine nginx config:

map $http_upgrade $connection_upgrade { 
    default upgrade; 
    ''  close; 
} 

server { 
    listen 80; 
    listen 443 ssl; 
    listen [::]:80; 
    listen [::]:443 ssl; 

    access_log /var/log/nginx/livetest.log; 
    server_name live-test.dev www.live-test.dev; 

    ssl_certificate /etc/nginx/ssl/nginx.crt; 
    ssl_certificate_key /etc/nginx/ssl/nginx.key; 
    ssl_session_cache shared:SSL:50m; 
    ssl_session_timeout 5m; 

    if ($ssl_protocol = "") { 
     rewrite^https://$host$request_uri? permanent; 
    } 

    location/{ 
     proxy_pass https://live_test; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection $connection_upgrade; 
    } 
} 

live_test Upstream ist node.js für den Betrieb auf Port 6020. Wenn in Chrom Testen auf Abruf stoppt mit (nicht) Status. Wenn wscat mit:

wscat --connect WSS: //live-test.dev

I erhalten: error: Error: self signed certificate

Ich frage mich, was hier falsch sein kann? Hier ist meine node.js App:

Ich habe das Gefühl, ich vermisse etwas in meiner node.js App. Ich dachte, dass seit nginx SSL SSL node.js nicht mehr muss, aber vielleicht irre ich mich.

Und ja, ich benutze selbstsigniertes Zertifikat für SSL. Funktioniert node.js/socket.io mit selbstsigniertem Zertifikat?

@UPDATE

etwas zu lesen Nach änderte ich meine node.js App:

var express = require('express'); 
var cookie = require('cookie'); 
var fs = require('fs'); 
var app = express(); 
var https = require('https').Server(app, { 
    key: fs.readFileSync('/etc/nginx/ssl/nginx.key'), 
     cert: fs.readFileSync('/etc/nginx/ssl/nginx.crt'), 
}); 
var socketIo = require('socket.io'); 
var redis = require('redis'); 
var redisClient = client = redis.createClient(); 

var io = new socketIo(https); 

io.on('connection', function(socket){ 
    var cookies = cookie.parse(socket.handshake.headers.cookie); 

    console.log(cookies); 
}); 

https.listen(6020, function(){ 
    console.log('listening on 6020'); 
}); 

@ UPDATE2

Nach dem Kommentar von abcdn I wscat mit -n versucht haben, jetzt bekommen Fehler: error: Error: unexpected server response (502)

während nginx error.log enthält: 2017/03/07 13:44:10 [error] 10556#10556: *140 upstream prematurely closed connection while reading response header from upstream

@UPDATE 3

Nach einer weiteren Lesung, wandte ich mich an http meine app.js zurück.

+1

Haben Sie versucht, 'wscat -n', d. H.' Wscat --no-check' - überspringen Zertifikat testen? – abcdn

+0

@abcdn Ich habe es gerade vor einer Minute versucht, aktualisiert meine Frage – user1970395

+0

@abcdn Ich glaube, das bedeutet Nginx korrekt behandeln die Anfrage und es ist Knoten, der scheitert? – user1970395

Antwort

1

var fs = require('fs'); 
 
var app = require('express')(); 
 
var https  = require('https'); 
 
var io = require('socket.io')(https); 
 
var HTTPSOptions = { 
 
    cert: fs.readFileSync('path to ssl certificate file'), 
 
    key: fs.readFileSync('path to ssl key file'), 
 
    requestCert: false, 
 
    rejectUnauthorized: false, 
 
}; 
 
HTTPSOptions.agent = new https.Agent(HTTPSOptions); 
 
var httpsServer = https.createServer(HTTPSOptions, app); 
 
io = io.listen(httpsServer, { 
 
    log: false 
 
}); 
 

 
//io.sockets.on('connection', function (sock) { 
 
// console.log("CONNECTED"); 
 
//}); 
 

 
var Redis = require('ioredis'); 
 
var redis = new Redis(); 
 

 
redis.psubscribe('*', function() {}); 
 

 
redis.on('pmessage', function (subscribed, channel, message) { 
 
    console.log("channel: " + channel); 
 
    console.log("message: " + message); 
 
    message = JSON.parse(message); 
 
    io.emit(channel + ':' + message.event, message.data); 
 
}); 
 

 
httpsServer.listen(6001, function(){ 
 
    console.log('Listening on Port 6001'); 
 
});

Ich habe 3 Tage eine Lösung dafür zu finden, und dies ist meine letzte Version, die perfekt funktioniert. Ich hoffe, es hilft jedem, der stecken geblieben ist wie ich :)

+0

Es gibt einige SyntaxError beim Ausführen des Snippets ... – Nuageux

+0

Ja, Sie haben "~" in der letzten Zeile, ich denke, das ist die Ursache. Das ist sehr nett von Ihnen, Ihre Lösung hier zu posten. Ich habe tatsächlich Nginx behandeln alle SSL-bezogenen Sachen, die es sowieso für eine andere App behandelt. Aber hoffen wir, dass jemand auf diese Frage trifft und Ihre Antwort funktioniert! – user1970395