HTTPS inschakelen op express.js

Ik probeer HTTPS te laten werken op express.js voor node, maar ik kom er niet uit.

Dit is mijn app.js-code.

var express = require('express');
var fs = require('fs');
var privateKey = fs.readFileSync('sslcert/server.key');
var certificate = fs.readFileSync('sslcert/server.crt');
var credentials = {key: privateKey, cert: certificate};
var app = express.createServer(credentials);
app.get('/', function(req,res) {
    res.send('hello');
});
app.listen(8000);

Als ik het uitvoer, lijkt het alleen te reageren op HTTP-verzoeken.

Ik schreef een eenvoudige vanilla node.jsgebaseerde HTTPS-app:

var   fs = require("fs"),
      http = require("https");
var privateKey = fs.readFileSync('sslcert/server.key').toString();
var certificate = fs.readFileSync('sslcert/server.crt').toString();
var credentials = {key: privateKey, cert: certificate};
var server = http.createServer(credentials,function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
});
server.listen(8000);

En wanneer ik deze app gebruik, reageertop HTTPS-verzoeken. Merk op dat ik denk dat de toString() op het fs-resultaat er niet toe doet, omdat ik combinaties van beide heb gebruikt en nog steeds geen es bueno.


BEWERKEN OM TOEVOEGEN:

Voor productiesystemen kunt u waarschijnlijk beter Nginx of HAProxy gebruiken om verzoeken naar uw nodejs-app te proxyen. Je kunt nginx instellen om de ssl-verzoeken af te handelen en gewoon http tegen je node app.js spreken.

BEWERKEN OM TOEVOEGEN (4/6/2015)

Voor systemen die AWS gebruiken, kunt u beter EC2 Elastic Load Balancers gebruiken om SSL-beëindiging af te handelen en regelmatig HTTP-verkeer naar uw EC2-webservers toe te staan. Voor verdere beveiliging stelt u uw beveiligingsgroep zo in dat alleen de ELB HTTP-verkeer naar de EC2-instanties mag sturen, waardoor wordt voorkomen dat extern niet-versleuteld HTTP-verkeer uw machines bereikt.



Antwoord 1, autoriteit 100%

In express.js (sinds versie 3) moet u die syntaxis gebruiken:

var fs = require('fs');
var http = require('http');
var https = require('https');
var privateKey  = fs.readFileSync('sslcert/server.key', 'utf8');
var certificate = fs.readFileSync('sslcert/server.crt', 'utf8');
var credentials = {key: privateKey, cert: certificate};
var express = require('express');
var app = express();
// your express configuration here
var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);
httpServer.listen(8080);
httpsServer.listen(8443);

Op die manier levert u express middleware aan de native http/https-server

Als u wilt dat uw app werkt op poorten onder 1024, moet u de opdracht sudogebruiken (niet aanbevolen) of een omgekeerde proxy gebruiken (bijv. nginx, haproxy).


Antwoord 2, autoriteit 11%

Eerst moet u de bestanden selfsigned.keyen selfsigned.crtmaken.
Ga naar Maak een zelfondertekend SSL-certificaatOf voer de volgende stappen uit.

Ga naar de terminal en voer de volgende opdracht uit.

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./selfsigned.key -out selfsigned.crt

  • Plaats daarna de volgende informatie
  • Landnaam (2-letterige code) [AU]: VS
  • Naam staat of provincie (volledige naam) [Some-state]: NY
  • Lokaliteitsnaam (bijv. stad) []:NY
  • Naam organisatie (bijv. bedrijf) [Internet Widgits Pty Ltd]: xyz (uw – organisatie)
  • Naam organisatie-eenheid (bijv. sectie) []: xyz (uw eenheidsnaam)
  • Algemene naam (bijv. server FQDN of UW naam) []: www.xyz.com (uw URL)
  • E-mailadres []: Uw e-mailadres

Na creatie voegt sleutel & cert-bestand in uw code en geef de opties door aan de server.

const express = require('express');
const https = require('https');
const fs = require('fs');
const port = 3000;
var key = fs.readFileSync(__dirname + '/../certs/selfsigned.key');
var cert = fs.readFileSync(__dirname + '/../certs/selfsigned.crt');
var options = {
  key: key,
  cert: cert
};
app = express()
app.get('/', (req, res) => {
   res.send('Now using https..');
});
var server = https.createServer(options, app);
server.listen(port, () => {
  console.log("server starting on port : " + port)
});
  • Voer uw applicatie ten slotte uit met https.

Meer informatie https://github.com/sagardere/set-up- SSL-in-nodejs


Antwoord 3, autoriteit 4%

Ik kwam een soortgelijk probleem tegen om SSL te laten werken op een andere poort dan poort 443. In mijn geval had ik zowel een bundelcertificaat als een certificaat en een sleutel. Het bundelcertificaat is een bestand dat meerdere certificaten bevat. Het knooppunt vereist dat u die certificaten opsplitst in afzonderlijke elementen van een array.

   var express = require('express');
    var https = require('https');
    var fs = require('fs');
    var options = {
      ca: [fs.readFileSync(PATH_TO_BUNDLE_CERT_1), fs.readFileSync(PATH_TO_BUNDLE_CERT_2)],
      cert: fs.readFileSync(PATH_TO_CERT),
      key: fs.readFileSync(PATH_TO_KEY)
    };
    app = express()
    app.get('/', function(req,res) {
        res.send('hello');
    });
    var server = https.createServer(options, app);
    server.listen(8001, function(){
        console.log("server running at https://IP_ADDRESS:8001/")
    });

In app.js moet je https opgeven en de server dienovereenkomstig maken. Zorg er ook voor dat de poort die u probeert te gebruiken, daadwerkelijk inkomend verkeer toestaat.


Antwoord 4

Inclusief punten:

  1. SSL-configuratie
    1. In config/local.js
    2. In config/env/production.js

HTTP- en WS-verwerking

  1. De app moet tijdens de ontwikkeling op HTTP draaien, zodat we gemakkelijk fouten kunnen opsporen in onze
    app.
  2. Om veiligheidsredenen moet de app in productie op HTTPS draaien.
  3. HTTP-verzoek voor app-productie moet altijd worden omgeleid naar https.

SSL-configuratie

In Sailsjs zijn er twee manieren om alle dingen te configureren, de eerste is om in de configuratiemap te configureren, waarbij elke map zijn eigen bestanden heeft (zoals de databaseverbinding met betrekking tot instellingen binnen verbindingen.js ). En ten tweede is het configureren op basis van de omgevingsbestandsstructuur, elk omgevingsbestand wordt gepresenteerd in de map config/enven elk bestand bevat instellingen voor een bepaalde omgeving.

Sails kijkt eerst in de map config/env en kijkt dan uit naar config/ *.js

Laat ssl nu instellen in config/local.js.

var local = {
   port: process.env.PORT || 1337,
   environment: process.env.NODE_ENV || 'development'
};
if (process.env.NODE_ENV == 'production') {
    local.ssl = {
        secureProtocol: 'SSLv23_method',
        secureOptions: require('constants').SSL_OP_NO_SSLv3,
        ca: require('fs').readFileSync(__dirname + '/path/to/ca.crt','ascii'),
        key: require('fs').readFileSync(__dirname + '/path/to/jsbot.key','ascii'),
        cert: require('fs').readFileSync(__dirname + '/path/to/jsbot.crt','ascii')
    };
    local.port = 443; // This port should be different than your default port
}
module.exports = local;

Als alternatief kunt u dit ook toevoegen in config/env/production.js. (Dit fragment laat ook zien hoe om te gaan met meerdere CARoot-certificaten)

Of in production.js

module.exports = {
    port: 443,
    ssl: {
        secureProtocol: 'SSLv23_method',
        secureOptions: require('constants').SSL_OP_NO_SSLv3,
        ca: [
            require('fs').readFileSync(__dirname + '/path/to/AddTrustExternalCARoot.crt', 'ascii'),
            require('fs').readFileSync(__dirname + '/path/to/COMODORSAAddTrustCA.crt', 'ascii'),
            require('fs').readFileSync(__dirname + '/path/to/COMODORSADomainValidationSecureServerCA.crt', 'ascii')
        ],
        key: require('fs').readFileSync(__dirname + '/path/to/jsbot.key', 'ascii'),
        cert: require('fs').readFileSync(__dirname + '/path/to/jsbot.crt', 'ascii')
    }
};

http/https & ws/wss omleiding

Hier is ws Web Socket en wss staat voor Secure Web Socket, aangezien we ssl hebben opgezet, toen nu http en ws, beide verzoeken worden veilig en transformeren naar respectievelijk https en wss.

Er zijn veel bronnen van onze app die verzoeken ontvangen, zoals elke blogpost, social media-post, maar onze server werkt alleen op https, dus wanneer een verzoek van http komt, geeft het de foutmelding “Deze site kan niet worden bereikt” in de clientbrowser . En we verliezen ons websiteverkeer. Dus we moeten het http-verzoek omleiden naar https, dezelfde regels staan websocket toe, anders mislukt de socket.

Dus we moeten dezelfde server op poort 80 (http) draaien en alle verzoeken omleiden naar poort 443(https). Sails compileert eerst het bestand config/bootstrap.js voordat de server wordt opgetild. Hier kunnen we onze express-server starten op poort 80.

In config/bootstrap.js (maak http-server en stuur alle verzoeken om naar https)

module.exports.bootstrap = function(cb) {
    var express = require("express"),
        app = express();
    app.get('*', function(req, res) {  
        if (req.isSocket) 
            return res.redirect('wss://' + req.headers.host + req.url)  
        return res.redirect('https://' + req.headers.host + req.url)  
    }).listen(80);
    cb();
};

Je kunt nu http://www.yourdomain.combezoeken, het zal doorverwijzen naar https://www.uwdomein.com


Antwoord 5

Zo werkt het voor mij. De gebruikte omleiding zal ook alle normale http omleiden.

const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const http = require('http');
const app = express();
var request = require('request');
//For https
const https = require('https');
var fs = require('fs');
var options = {
  key: fs.readFileSync('certificates/private.key'),
  cert: fs.readFileSync('certificates/certificate.crt'),
  ca: fs.readFileSync('certificates/ca_bundle.crt')
};
// API file for interacting with MongoDB
const api = require('./server/routes/api');
// Parsers
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// Angular DIST output folder
app.use(express.static(path.join(__dirname, 'dist')));
// API location
app.use('/api', api);
// Send all other requests to the Angular app
app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname, 'dist/index.html'));
});
app.use(function(req,resp,next){
  if (req.headers['x-forwarded-proto'] == 'http') {
      return resp.redirect(301, 'https://' + req.headers.host + '/');
  } else {
      return next();
  }
});
http.createServer(app).listen(80)
https.createServer(options, app).listen(443);

Antwoord 6

Gebruik greenlock-express: gratis SSL, geautomatiseerde HTTPS

Greenlockzorgt voor de uitgifte en verlenging van certificaten (via Let’s Encrypt) en http = > https-omleiding, kant-en-klaar.

express-app.js:

var express = require('express');
var app = express();
app.use('/', function (req, res) {
  res.send({ msg: "Hello, Encrypted World!" })
});
// DO NOT DO app.listen()
// Instead export your app:
module.exports = app;

server.js:

require('greenlock-express').create({
  // Let's Encrypt v2 is ACME draft 11
  version: 'draft-11'
, server: 'https://acme-v02.api.letsencrypt.org/directory'
  // You MUST change these to valid email and domains
, email: '[email protected]'
, approveDomains: [ 'example.com', 'www.example.com' ]
, agreeTos: true
, configDir: "/path/to/project/acme/"
, app: require('./express-app.j')
, communityMember: true // Get notified of important updates
, telemetry: true       // Contribute telemetry data to the project
}).listen(80, 443);

Screencast

Bekijk de QuickStart-demonstratie: https://youtu.be/e8vaR4CEZ5s

Voor Localhost

Beantwoord dit gewoon van tevoren omdat het een veelvoorkomende vervolgvraag is:

U kunt geen SSL-certificaten hebben op localhost. U kunt echter iets als Telebitgebruiken waarmee u lokale apps als echte apps kunt uitvoeren .

Je kunt ook privédomeinen gebruiken met Greenlock via DNS-01-uitdagingen, die wordt vermeld in de README samen met verschillende plug-ins die dit ondersteunen.

Niet-standaard poorten (d.w.z. geen 80 / 443)

Lees de opmerking hierboven over localhost – je kunt ook geen niet-standaard poorten gebruiken met Let’s Encrypt.

U kunt uw interne niet-standaard poorten echter als externe standaardpoorten vrijgeven via port-forward, sni-route, of iets als Telebit gebruiken dat SNI-routing en port-forwarding/relaying voor u doet.

Je kunt ook DNS-01-uitdagingen gebruiken. In dat geval hoef je helemaal geen poorten vrij te geven en kun je op deze manier ook domeinen op privénetwerken beveiligen.


Antwoord 7

Dit is mijn werkende codevoor express 4.0.

express 4.0 is heel anders dan 3.0 en andere.

4.0 je hebt een /bin/www-bestand, dat je hier https gaat toevoegen.

“npm start” is de standaard manier waarop u de express 4.0-server start.

readFileSync()-functie zou __dirnamemoeten gebruiken om huidige map op te halen

terwijl vereisen() gebruik ./verwijzen naar de huidige map.

Eerst plaatst u het bestand private.key en public.cert in de map /bin,
Het is dezelfde map als het WWW-bestand
.

Other episodes